소프트웨어 유지 보수의 4대 유형
- 버그를 발견하고 고친다(교정형 유지보수, corrective maintenance)
- 운영 환경의 변화에 따라 시스템을 변경한다(적응형 유지보수, adaptive maintenance)
- 시스템 사용자의 요구를 반영한다(완료형 유지보수, perfective maintenance)
- 품질을 높이고, 버를 방지할 방안을 모색한다(예방형 유지보수, preventive maintenance)
유지보수성 가이드라인
코드 단위를 짧게 하라
목표 : 코드 단위는 15라인을 어가지 않게 작성한다.
- 메서드 추출(Extract Method)
- 메서드를 메서드 객체로 대체(Replace Method with Method Object) : 길어지는 코드를 객체로 분리
코드 단위는 간단하게 짜라
목표 : 단위당 분기점은 4개로 제한한다
- Map 을 이용해 분기문 사용을 줄일 수 있다
- 케이스별로 구분해서 각각 return 문을 넣으면 중첩 조건문 제거에 도움이 된다. (중첩문 보호철로 대체, Replace Nested Conditional with Guard Clauses)
- 중첩 조건문을 별도 메서드로 추출하면 덜 복잡한 코드가 된다.
코드는 한 번만 작성하라
목표 : 코드를 복사하지 않는다.
- 코드를 재사용 가능한 일반적인 형태로 작성하거나 기존 메서드를 대신 호출한다.
- 상위 클래스 추출(Extract Superclass) 를 이용해 원 클래스의 상위 클래스로 생성하여 추출
단위 인터페이스를 작게 하라
목표 : 단위당 파라미터 개수는 4개 이하로 제한한다.
- 파라미터를 객체로 추출한다
- 세터가 전원 this를 반환하게 하여 흘러가는 인터페이스(fluent interface)를 만들 수도 있다
관심사를 모듈로 분리하라
목표 : 모듈 간결합을 느슨하게 하기 위해 큰 모듈은 삼가한다.
- 개별 모듈로 나누어 일을 시키고 구현 상세는 인터페이스 안으로 감춘다.
- 클래스를 나누어 관심사를 분리한다
- 특정 구현부는 인터페이스 안에 숨긴다
- 커스텀 코드를 서드파티 라이브러리/프레임워크로 대체한다
아키텍처 컴포넌트를 느슨하게 결합하라
목표 : 최상위 수준의 컴포넌트 간 결합도를 낮춘다
- 다른 컴포넌트 모듈에 호출을 받는 형태로 공개도니 모듈 내부의 상대적인 코드량을 최소화 한다.
- 모듈의 크기를 제한한다
- 상위수준에서 컴포넌트 인터페이스를 추상화 한다(컴포넌트 경계를 넘나드는 요청 가짓수를 제한)
- 스루풋 코드는 쓰지 않는다
아키텍처 컴포넌트의 균형을 잡아라
목표 : 최상위 수준 컴포넌트 개수와 상대적인 크기를 균형잡느다
- 컴포넌트 개수가 9개(6~12개) 정도 되도록 소스 코드를 조직화 하고 컴포넌트 크기를 대략 균등하게 맞춘다
코드베이스를 작게 하라
목표 : 코드베이스를 가능한 작게 한다
- 코드베이스가 커지는 걸 막고 시스템 크기를 적극적으로 줄인다
- 코드를 복사하지 않는다
- 기존 코드를 리팩터링 한다
- 서드파티 라이브러리/프레임워크를 사용한다
- 대규모 시스템을 분리한다
테스트를 자동화하라
목표 : 테스트를 자동화 한다
- 테스트 프레임워크로 자동화한 테스트를 작성한다
클린 코드를 작성하라
목표 : 클린 코드를 작성한다
- 규칙 1: 단위 수준의 코드 악취를 남기지 말라(커밋하기 전에 리팩터링을 마쳐야 한다)
- 규칙 2: 나쁜 주석을 남기지 말라
- 규칙 3: 주석 안에 코드를 남기지 말라
- 규칙 4: 죽은 코드를 남기지 말라
- 규칙 5: 긴 식별자 이름을 남기지 말라
- 규칙 6: 매직 상수를 남기지 말라(매직상수, magic constant : 의미가 불분명한 숫자나 리터럴 값, 상수값은 명시적으로 정의해서 사용하는 것이 좋다.)
- 규칙 7: 제대로 처리 안 한 예외를 남기지 말라