가장 중요한 두 가지 객체 지향 원칙은 응집력과 결합입니다.
결속력 클래스 내부의 모든 메소드 간의 관계에 관한 것입니다. 동일한 인스턴스 변수 및 매개변수 세트를 사용하고 있습니까, 모두 동일한 목표를 위해 함께 작동 ? 아니면 모든 방법이 서로 분리되어 느껴지나요?
커플링 클래스가 다른 클래스에 얼마나 종속되어 있는지, 시스템의 나머지 부분에 얼마나 "연결"되어 있는지, 이 클래스가 개별적으로 사용되는 능력입니다.
이 두 개념 모두 특정 렌즈 세트를 통해 코드 기반의 모든 클래스를 보는 데 도움이 됩니다. 이 렌즈는 수업 디자인이 얼마나 견고한지, 어떤 부분을 변경할 수 있는지 알아내는 데 도움이 됩니다.
최상의 결과를 얻으려면 높은 응집력을 목표로 합니다. &낮은 결합 .
결속의 예
낮은 응집력은 피자에 특이한 토핑을 얹은 것과 같고 높은 응집력은 모든 것이 있어야 할 위치에 있는 것처럼 느껴집니다.
느낌을 받을 수는 있지만 측정하기 어렵습니다. 수업이 얼마나 응집력이 있는지 알려주는 숫자만 알 수는 없습니다. 따라서 이해하기 정말 명백한 코드 예시를 보여드리고 싶습니다.
여기 있습니다:
class Library def lend_book end def return_book end def make_coffee end end
이 예에서는 make_coffee
이 라이브러리에 카페테리아가 있더라도 Library
에는 의미가 없습니다. 커피를 만드는 수업 🙂
카페테리아는 가지고 있는 책에 대한 정보, 책을 빌리는 방법 등에 대한 정보가 필요하지 않습니다.
그리고 도서관은 남은 커피의 양이나 만드는 방법을 알 필요가 없습니다.
이것이 바로 낮은 응집력이 의미하는 것입니다.
물론입니다 :
항상 이렇게 명확하지는 않습니다. 때로는 주의가 필요합니다. &메소드 이름 너머를 보십시오.
- 이 방법들은 실제로 무엇을 하고 있습니까?
- 어떤 데이터로 작업합니까?
- 어떤 개체와 협력하고 있습니까?
이 질문은 수업의 응집력 수준에 대한 아이디어를 제공해야 합니다.
낮은 응집력을 어떻게 수정하나요?
이 클래스에 속하지 않는 메서드를 다른 클래스(종종 새 클래스)로 추출해야 합니다.
커플링의 예
이제 커플링을 살펴보겠습니다.
예시입니다 :
class ShoppingCart attr_accessor :items def initialize @items = [] end end class Order def process_order(cart) cart.items.map(&:price).inject(:+) end end
이 예에서는 Order
ShoppingCart
와 밀접하게 연결되어 있습니다. 너무 많이 알고 있기 때문에 items
가 있다는 것을 알고 있습니다. 변수 &그것으로 약간의 계산을 하고 있습니다.
이제 ShoppingCart
를 변경하면 의 items
구현 , Order
도 변경해야 합니다. .
좋지 않습니다!
이렇게 고칠 수 있습니다 :
class ShoppingCart attr_accessor :items def initialize @items = [] end def calculate_total items.map(&:price).inject(:+) end end class Order def process_order(cart) cart.calculate_total end end
결합 감소가 있습니다. 계산 세부 정보를 해당 위치로 이동합니다.
이에 대한 은유가 필요하다면 고정 배터리와 함께 제공되는 이러한 휴대전화를 생각해보세요. 그것은 높은 결합입니다. .
배터리를 교체할 수 있다면 낮은 결합입니다. .
어느 정도의 연결이 여전히 필요하며 배터리 및 Order
없이는 전화가 작동하지 않습니다. 고객에게 청구할 금액을 모르면 수업이 작동하지 않을 것입니다.
요약
두 가지 매우 중요한 OOP 원칙인 응집력과 결합에 대해 배웠습니다. 이 두 가지 개념은 클래스의 메소드가 얼마나 잘 함께 작동하고 클래스가 시스템의 나머지 부분과 얼마나 독립적인지 알아내는 데 도움이 됩니다.
지금 바로 이것을 프로젝트 중 하나에 적용하고 열어서 일부 수업을 볼 수 있습니다. . 방금 배운 내용을 사용하여 어떻게 개선할 수 있습니까?
읽어 주셔서 감사합니다! 공유를 잊지 마세요. &아직 뉴스레터를 구독하지 않으셨다면 구독하세요 🙂