2012-07-31 4 views
2

일대 다 연관을 사용하는 Demeter Law 위반을 피하는 방법에 대해 혼란스러워합니다. 이 전 모델과 같이 있다고 가정 해 봅시다 :일대 다 관계가있는 Demeter의 법칙

class Organization < ActiveRecord::Base 
    has_one :address 
    has_many :employees 
end 

내가 이렇게하는 법 데메테르의 위반이 될 것이라고 믿는다

organization.address.street_name 

이것은 *의 address_street_name * 방법을함으로써 피할 수 있습니다. 그만큼 간단한 솔루션입니다. 그러나 이제 우리가 이것을한다고 가정 해 봅시다 :

organization.employees.each { |employee| puts employee.first_name } 

이것은 Demeter의 법칙을 위반 한 것으로 보입니다. 당신은 여전히 ​​Employee의 내부 구조에 대한 지식을 전시하고 있습니다. 이러한 유형의 위반을 피하는 가장 좋은 방법은 무엇입니까?

답변

2

데메테르의 법칙의 목표는 내부 상태를 노출되지 않도록하는 것입니다 및 사용 장려 (다음 내부 구성원 something에 위임 할 수있다) a.do_something를 사용하지 않고 a.something.do_something보다 원칙 "을 요구하지 않는, 말".

이렇게 말하면 결코 위반할 수없는 어렵고 빠른 규칙이 아닙니다. 이 경우에는 직원에게 이름을 사용하여 작업하도록 요청하지 않고 실제 이름을 쿼리하는 것만으로도이 문제를 해결할 실제 방법은 없습니다.

1

흠. 여기에 제 의견입니다 :

  • 당신이보기에 모두 당신의 예제를 사용하는 경우, 당신이 확실히 더 이상의 모델에서 정보를 표시하는 뷰를 작성하는 경우 위의 두 예와 같은 확인을 말하는 것입니다 일반적인 가정, 그럼 왜 안돼? 또한 레일의 뷰는 데이터 구조/모델에 대해 많이 알고 있음이 분명합니다.

  • 두 번째 예에서 요소에 반복 (즉, 일부 논리를 수행하는 경우),이 경우 다른 클래스의 직원으로 배치하는 것이 좋습니다. 그러나 다시 말하지만, 위의 코드가보기에 있다면, 특히 모델 메서드에서 html 코드를 생성하는 것을 의미한다면, 나는 그렇지 않을 것입니다. 필자의 견해로는, 레일 모델은 Data/Object Anti-Symmetry (P. 95, demeter의 법칙 바로 앞에있는) 절의 Clean Code에서 Rob Martin이 묘사 한 것보다 더 많은 데이터 구조이다.

0

Demeter의 법칙에 대한 동기 부여는 "도트 카운트 축소"가 아니라 캡슐화입니다.

도메인 개체의 동작을 숨기는 데 가장 적합하지만보기에 데이터를 표시하는 것은 아닙니다. 결코 깨뜨릴 수없는 규칙은 아닙니다.

이 기사는 해당 주제에 대한 좋은 설명입니다. Law of Demeter and Dot Counting

관련 문제