저는 Rails AntiPatterns라는 책을 읽고 있습니다. 그들은 Demeter of Demeter를 위반하지 않기 위해 위임을 사용하는 것에 대해 이야기합니다. 주요 예는 다음과 같습니다.
그들은 컨트롤러에서 이와 같은 것을 호출하는 것이 좋지 않다고 생각합니다 (그리고 나는 동의합니다)
@street = @invoice.customer.address.street
제안 된 해결책은 다음을 수행하는 것입니다.
class Customer
has_one :address
belongs_to :invoice
def street
address.street
end
end
class Invoice
has_one :customer
def customer_street
customer.street
end
end
@street = @invoice.customer_street
그들은 당신이 하나의 점만을 사용하기 때문에 여기서 데메테르 법칙을 어 기지 않는다고 말합니다. 인보이스의 거리를 얻기 위해 고객이 주소를 통과하기 때문에 여전히 잘못된 것으로 생각합니다. 나는 주로 내가 읽은 블로그 게시물 에서이 아이디어를 얻었습니다.
http://www.dan-manges.com/blog/37
블로그 게시물에서 주요 예는
class Wallet
attr_accessor :cash
end
class Customer
has_one :wallet
# attribute delegation
def cash
@wallet.cash
end
end
class Paperboy
def collect_money(customer, due_amount)
if customer.cash < due_ammount
raise InsufficientFundsError
else
customer.cash -= due_amount
@collected_amount += due_amount
end
end
end
블로그 게시물에는 customer.cash
대신 점이 하나만 있지만 customer.wallet.cash
이 코드는 여전히 Demeter의 법칙을 위반한다고합니다.
이제 Paperboy collect_money 메소드에는 두 개의 점이 없으며 "customer.cash"에 하나의 점만 있습니다. 이 대표단이 우리의 문제를 해결 했습니까? 전혀. 우리가 그 행동을 살펴보면, 한 신문 소년이 여전히 현금을 얻기 위해 고객의 지갑에 직접 닿고 있습니다.
편집하다
본인은 이것이 여전히 위반이며 본인에 대한 Wallet
지불을 처리하고 Customer
클래스 내에서 해당 메소드를 호출해야하는 인출이라는 메소드를 작성해야한다는 것을 완전히 이해하고 동의합니다 . 내가 얻지 못하는 것은이 과정에 따르면 첫 번째 예제 Invoice
는 여전히 Customer
거리를 얻기 위해 직접 도달 하기 때문에 데 미터 법칙을 위반한다는 것 입니다.
누군가 혼란을 해결하도록 도와 줄 수 있습니까? 지난 2 일 동안이 주제에 대해 알아 보려고했지만 여전히 혼란 스럽습니다.