설계원칙-디미트의 법칙

2377 단어
디미트 법칙(Law of Demeter)은 최소 지식 원칙이라고도 하는데, 쉽게 말하면 한 대상이 다른 대상에 대해 최소한의 이해를 가져야 한다는 것이다.디미트 법칙은 클래스와 클래스 간의 결합을 낮추는 데 사용되며 그 중 어느 모듈이 수정될 때 다른 모듈에 최대한 영향을 주지 않고 확장이 비교적 쉽다.
한마디로 요약하면'친구와만 사귀고 친구의 친구는 친구가 아니다'. 한 대상에 대해 그의 친구는 다음과 같은 몇 가지를 포함한다. (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 

이렇게 고치면 논리가 많이 명확해지는 것 같아서 작업 중에 디자인 원칙에 주의해야 할 것 같아요.

좋은 웹페이지 즐겨찾기