개발자 99% 커뮤니티에서 수다 떨어요!
연습 문제 1
파일에서 데이터를 읽는 클래스를 만들어야 한다. 한 번에 한 줄씩 읽어 들이고, 각 줄은 여러 개의 필드로 쪼개야 한다. 의사 코드로 표현한 다음 두 클래스 중 어떤 것이 직교적인가?
class Split1 {
constructor(fileName) # 읽기 위해 파일을 열기
def readNextLine() # 다음 줄로 이동
def getField(n) # 현재 줄의 n번째 필드를 반환
}
class Split2 {
constructor(line) # 한 줄을 쪼개기
def getField(n) # 현재 줄의 n번째 필드를 반환
}
문제를 읽어보면 다음과 같은 3가지 기능이 필요해 보인다.
파일에서 데이터를 읽어야 한다.
한 번에 한 줄씩 읽어야 한다.
각 줄은 여러 개의 필드로 쪼개야 한다.
이렇게 본다면 Split1 이 맞아 보이지만, class의 이름을 보면 해당 클래스는 Split (쪼개기) 클래스이다. 즉 해당 클래스는 여러 개의 필드를 쪼개기 위한 클래스로 보인다.
그렇다면 Split1과 Split2 중에 어느쪽이 쪼개기에 집중되어있는 클래스일까? 바로 Split2이다.
Split2는 쪼개기 기능만 하고 있다.
직교적인지 확인하는 방법은 특정 기능에 대한 요구 사항을 대폭 변경하는 경우 몇 개의 모듈이 영향을받는 지이며, 직교적인 시스템에서는 답이 하나여야 한다.
Split1은 1)파일을 읽고 2) 다음 줄로 이동하고 3)현재 줄의 n번째 필드를 반환하는 다양한 일을 하기 때문에 의존성과 결합도가 높다.
반면에 Split2는 어디서 어떤 텍스트의 줄인지 상관 없이 받은 줄의 내용을 쪼개기만 하고 있다. 그래서 쪼개기가 필요한 곳이면 Split2를 사용할 수 있다. 언제든 재사용이 가능한 코드다.
따라서 Split2가 더 직교적이라 할 수 있다.
실용주의 프로그래머 - 직교성
클린코드 - 10장 클래스
단일 책임 원칙은 클래스나 모듈을 변경할 이유가 하나, 단 하나뿐이여야 한다는 원칙이다.
큰 클래스 몇 개가 아니라 작은 클래스 여럿으로 이뤄진 시스템이 더 바람직하다. 작은 클래스는 각자 맡은 책임이 하나며, 변경할 이유가 하나며, 다른 작은 클래스와 협력해 시스템에 필요한 동작을 수행한다.
우리 생각에는 Split2 클래스가 더 직교성이 좋다. 이 클래스는 자지가 해야할 일인 줄 쪼개기에만 집중하고, 어디서 그 줄이 오는지와 같은 세부 사항은 무시한다. 그러면 코드가 개발하기 더 쉬워질 뿐만 아니라 더 유연해진다. Split2는 파일에서 읽어온 문자열을 쪼갤 수도 있고, 다른 루틴이 만든 문자열을 쪼갤 수도 있고, 환경 변수로 넘어온 문자열을 쪼갤 수도 있다.