설계원칙-디미트의 법칙
한마디로 요약하면'친구와만 사귀고 친구의 친구는 친구가 아니다'. 한 대상에 대해 그의 친구는 다음과 같은 몇 가지를 포함한다. (1) 현재 대상 자체(self).(2) 현재 대상 방법에 매개 변수 형식으로 전송된 대상;(3) 현재 대상의 구성원 대상(rails에 따르면assocation은 구성원 대상에 속한다).(4) 현재 대상의 구성원 대상이 하나의 집합이라면 집합 중의 요소도 모두 친구이다.(5) 현재 객체가 작성한 객체입니다.
예를 들어 비준을 발표할 때 제품 정보 가격을 업데이트합니다. 가격망quotationbatch.rb 정의 방법은 다음과 같습니다.
class QuotationBatch
def publish_prices_no_transaction(options={})
sql, arr = options[:publish_type] == :full ?
['', self.id] : [' and products.id in (?)',[self.id, options[:ids]]]
products_ids = Product.all :conditions => "some",:select => "id"
return 'true' if products_ids.blank?
products_ids.each_slice(1000) do |id_arr|
products = Product.all(:conditions => ['id in (?)', id_arr],
:include => [:all_product_prices])
products.each do |product|
raise ActiveRecord::Rollback unless product.publish_price(options[:user], self)
end
end
'true'
end
end
간략한 설명: quotationbatch는 비트를 저장하는 클래스입니다.product_price는 쿼트를 저장하는 클래스입니다. 필드batchid 저장 로트 번호, 필드 제품id는 제품 번호를 저장하고last 필드는 최신 오퍼인지 역사 오퍼인지 설명하는 데 사용됩니다(1은 최신 오퍼이고 3은 역사 오퍼입니다).제품류입니다.코드의 대략적인 흐름은 다음과 같다:publishprices_no_transactionproduct를 옮겨다니며 product의publish 를 호출합니다price에서 견적을 발표하고 제품에서 조건에 따라 제품을 수정합니다.price 상태
코드가 디미트의 법칙에 맞지 않아,product와quotationbatch 사이에 관련이 있어서는 안 된다. 코드를 처음 봤을 때 안개가 낀 것 같다.
우선, 실제 견적을 발표하는 방법은 제품에 정의되지 않고, 제품에 정의되어야 한다price 중, 제품만 있으니price와product와batch는 친구 관계입니다. 그러면publishprices_no_transaction에서productprice, 제품 위조 코드가 아닌 것은 다음과 같습니다.
class ProductPrice
belongs_to :product
belongs_to :batch
def publish_price
#
self.prev_price.update_status
#
self.make_newst_price
...
end
end
class Product
has_many :product_prices
end
class QuotationBatch
has_many :product_prices
def publish_batch
self.product_prices.each do |product_price|
product_price.publish_price
end
#
end
end
이렇게 고치면 논리가 많이 명확해지는 것 같아서 작업 중에 디자인 원칙에 주의해야 할 것 같아요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.