knowledge를 반복하여 사용하지 말라
프로젝트에서 이미 있던 코드를 복사해서 붙여넣고 있다면, 무언가가 잘못된 것이다.(....)
의도적인 정보를 의미한다. 예를 들어 상속을 할 때 특정 메서드를 오버라이드하지 않게 강제해 해당 메서드가 슈퍼클래스와 동일하게 동작하게 하는 경우가 있다.
중요한 knowledge는 크게 두 가지가 존재한다.
knowledge 반복은 프로젝트의 확장성을 막고, 쉽게 깨지게 된다. 따라서 함께 변경될 가능성이 높은지, 따로 변경될 가능성이 높은지 판단하여 추출을 할 필요가 있다.
장학금 관련 부서는 qualifiesForScholarship
프로퍼티를, 인증 관련 부서는 isPassing
프로퍼티를 추가하였는데, 이들은 같은 함수에 의존하고 있다.
class Student {
fun isPassing(): Boolean =
calculatePointsFromPassedCourses() > 15
fun qualifiesForScholarship(): Boolean =
calculatePointsFromPassedCourses() > 30
private fun calculatePointsFromPassedCourses(): Int {
}
}
하지만 계산 방식에 차이가 발생한다면 의존하고 있던 다른 함수도 영향을 받을 수 있다. 따라서 책임에 따라 클래스를 구분할 필요가 있다.
// accreditations 모듈
fun Student.qualifiesForScholarship(): Boolean {
...
}
// scholarship 모듈
fun Student.calculatePointsFromPassedCourses(): Boolean {
...
}
위와 같이 확장함수를 작성해서 각각의 부서가 관리하는 서로 다른 모듈 파일에 배치하도록 할 수 있다.
서로 다른 곳(위의 예에서는 다른 부서)에서 사용하는 knowledge는 독립적으로 변경할 가능성이 크므로 비슷한 처리를 하더라도 다른 knowledge로 취급하는 것이 좋다.
비슷해 보이는 코드는 모두 추출하려는 경향이 있는데, 극단적인 것은 좋지 않다. 단일 책임 원칙을 잘 지키도록 하자.