✌️ Chapter 3: 의존성 관리하기
- 잘 디자인된 객체는 하나의 책임만 지고 있기 때문에 객체가 복잡한 작업을 수행하기 위해서는 다른 객체와 협업해야 한다. 서로 협업하려면 객체는 다른 객체에 대한 지식이 있어야 한다. 지식은 의존성을 만들어 낸다.
📚 의존성 이해하기
- 다음은 조금 변형된
Gear
클래스이다. 이 코드는 네 군데에서 의존성이 있다. - 의존성이 있다는 것은
Gear
클래스를 수정하기 어렵고 연약하게 만든다.
class Gear
attr_reader :chainring :cog, :rim, :tire
def initialize(chainring, cog, rim, tire)
@chainring = chainring
@cog = cog
@rim = rim
@tire = tire
end
def ratio
chainring / cog.to_f
end
def gear_inches
ratio * Wheel.new(rim, tire).diameter
end
# ...
end
class Wheel
attr_reader :rim, :trie
def initialize(rim, tire)
@rim = rim
@tire = tire
end
def diameter
rim + (tire * 2)
end
# ...
end
Gear.new(52, 11, 26, 1.5).gear_inches
🎈 의존성이 있다는 것을 알기
다음과 같은 의존성을 갖는다.
- 다른 클래스의 이름,
Gear
는Wheel
이라는 이름의 클래스가 있다는 것을 알고 있다. - 자기 자신을 제외한 다른 객체에서 전송할 메시지의 이름,
Gear
는Wheel
의 인스턴스가diameter
라는 메서드를 이해할 수 있다는 것을 알고 있다. - 메세지가 필요로 하는 인자들,
Gear
는Wheel.new
를 위해rim
과tire
를 인자로 넘겨야 한다는 것을 알고 있다. - 인자들을 전달하는 순서,
Gear
는Wheel.new
의 첫 번째 인자가rim
이고 두 번째 인자가tire
라는 것을 알고 있다.
위와 같은 불필요한 의존성은 코드를 덜 적절하게(reasonable) 만든다. 왜냐하면 이 의존성이 Gear
클래스의 수정을 강제한다.
각 클래스가 자신이 해야 하는 일을 하기 위한 최소한의 지식만을 알고 그 외에는 아무것도 모르도록 의존성을 관리해야 한다.
🎈 객체들 간의 결합
이런 의존성은 Gear
를 Wheel
에 결합(couple)시킨다. 다르게 표현해 이런 결합이 의존성을 낳는다고도 말할 수 있다.
Wheel
를 수정하면 Gear
도 수정해야 된다.
둘 이상의 객체가 강렬하게 결합되어 있을 때 이들은 한 덩어리로 움직이고 이들 중 하나만 재사용하는 것은 불가능하다.
🎈 다른 의존성들
메시지 연쇄는 원래 있던 두 객체 사이의 의존성뿐 아니라, 최종 목표까지 도달하기 위해 거쳐갔던 모든 객체와 메시지들 사이에도 의존성을 만들어낸다.
연쇄의 중간에 끼어있던 어떤 객체가 변하더라도 이 변화가 첫 번째 객체에 영향을 미친다.
이런 경우를 데메테르의 원칙이 위반되었다고 말한다.
테스트-코드 사이의 지나친 결합은 코드-코드 사이의 지나친 결합과 같은 결과를 낳는다. 이 결합은 코드의 수정이 뒤이어 테스트의 수정을 강제하는 의존성이다.