도금 로즈 카타 지나기 - 3부: 인조 O부터 OO까지

23796 단어 ooprubyrefactorit
지난 게시물에서 나는 너희들에게 GildedRose반을 남겼다. 나는 이 반이 우리가 처음 만났을 때보다 훨씬 건강하다고 말할 수 있다.하지만 나는 여전히 할 수 있는 일이 있다고 생각한다.
내가 하나의 모델이 필요하다는 것을 깨달았듯이, 여기에는 또 하나의 모델이 우리를 향해 비명을 지르고 있다.

소식이 있는 곳...


나의 한 늙은 선생님이 한 말씀 하셨다. (진정한 OO 전문가라면 누구나 이런 말을 할 수 있을 거라고 생각하지만, 나의 늙은 선생님을 현명한 은사로 상상하고 신비로운 방식으로 그의 지식을 가치 있는 사람에게 공유하게 해 주세요) "접두사는 정보를 의미합니다."
응, 나는 프랑스인이라서 좀 어색해. 왜냐하면 우리는 종종 다른 사람들처럼 순서대로 단어를 배열하지 않기 때문이다.영어에서 우리는 반드시 '접미사는 정보를 의미한다.' 라고 말해야 한다.
코드를 간단히 살펴보겠습니다.
def aged_brie_update(item)
end

def backstage_update(item)
end

def sulfuras_update(item)
end

def common_update(item)
end
case ... when ... end는 하나의 정보이다.하나의 메시지가 대상을 호출할 것을 요구한다.

。。。수업이 있다!


사람들은 교실이 심사숙고한 창조력으로 시간과 공예, 정확한 모델이 필요하다고 생각하는 경향이 있다.
그중 일부 사람들에게는 그렇지만 모두가 그렇지는 않다.우리는 큰 종류가 아니라 작은 대상이 소식을 교환하는 것을 더 좋아해야 한다. 그것은 현실 생활의 대상을 모방했지만 너무 많은 일을 하고 너무 많은 것을 안다.이런 작은 대상들은 통상적으로 코드와 디자인에서만 나타난다._update는 하나의 메시지로 한 종류에 보내면 나는 이 종류를 스스로 설계하게 할 것이다.
다음을 수행합니다.
def aged_brie_update(item)
  item.sell_in -= 1

  item.quality +=1
  item.quality +=1 if item.sell_in < 0
  item.quality = 50 if item.quality > 50
end
다음을 수행합니다.
class AgedBrie
  attr_reader :item

  def initialize(item)
    @item = item
  end

  def update
    item.sell_in -= 1

    item.quality +=1
    item.quality +=1 if item.sell_in < 0
    item.quality = 50 if item.quality > 50
  end
end
별거 아니야, 이제 우리가 볼 수 있어.
분명히, 나는 #update 방법에서 그것의 호출을 변경할 것이다
  • 보낸 사람: #update_quality
  • -aged_brie_update(item)
  • 여기저기 똑같은 레시피를 써요.



    지금, 이것은 보잘것없는 것일 것이다.
    그러나 또 하나의 특례가 있다. AgedBrie.new(item).update와 그 빈 방법이다.너는 내가 왜 그것을 이렇게 오래 보관했는지 스스로에게 물어볼 수도 있다.
    나는 방법이 비어 있든 없든 상관없다.빈 건 좋은데.아무것도 하지 않는 것은 좋은 일이다.개발자로서 나는 전형적인 여정을 따르지 않았다.대학에서 나의 첫 번째 프로그래밍 방법은 수학과 함수 언어를 통과하는 것이다.그곳에서, 우리는 '표지 함수' 같은 것이 있는데, 그것은 그것들에게 전달된 내용을 되돌려주고, 어떠한 변경도 하지 않는다.고립된 것은 완전히 쓸모가 없지만, 다른 개념 중에서 가장 강력한 개념 중의 하나가 된다.
    아무것도 아니야.나는 아무것도 좋아하지 않는다.만약 내가 이 코드의 Sulfuras 를 참을 수 있다면, 나는 네가 빈 방법을 참을 수 있을 것이라고 믿는다.특히 지금은 프로젝트 유형을 나타내는 클래스를 만들고 있습니다.내가 방법을 보류하는 동시에, 나는 Sulfuras에 메시지를 보내는 개념을 보류했다. 지금은 이것이 다른 어떤 항목과 같은 항목이라는 것을 알 수 있다.진작에 이 방법을 쓸모없는 물건으로 던져 버렸더라면 나는 이 점을 몰랐을 것이다.

    기교를 재구성하다


    코드 중복 제거, 빈 방법, 어리석은 일에 너무 열중하지 마세요.너무 이르다.정확한 알고리즘 추상을 놓치고 미래의 자아를 위해 불필요한 고통을 만들 수도 있다.
    어쨌든, 아이고, 나는 다시 한 번 했다. 나는 나의 종류를 재구성하기 전보다 더 길고 복잡하게 만들었다.예전과 마찬가지로 나는 너무 개의치 않을 것이다.나는 나의 노교수가 동굴에서 한 말을 존중한다.
    다음은 현재 상태의 코드입니다.
    class GildedRose
    
      def initialize(items)
        @items = items
      end
    
      def update_quality
        @items.each do |item|
          case item.name
          when "Aged Brie"
            AgedBrie.new(item).update
          when "Backstage passes to a TAFKAL80ETC concert"
            Backstage.new(item).update
          when "Sulfuras, Hand of Ragnaros"
            Sulfuras.new(item).update
          else
            Common.new(item).update
          end
        end
      end
    
      class Common
        attr_reader :item
    
        def initialize(item)
          @item = item
        end
    
        def update
          item.sell_in -= 1
    
          item.quality -= 1
          item.quality -= 1 if item.sell_in < 0
          item.quality = 0 if item.quality < 0
        end
      end
    
      class AgedBrie
        attr_reader :item
    
        def initialize(item)
          @item = item
        end
    
        def update
          item.sell_in -= 1
    
          item.quality +=1
          item.quality +=1 if item.sell_in < 0
          item.quality = 50 if item.quality > 50
        end
      end
    
      class Backstage
        attr_reader :item
    
        def initialize(item)
          @item = item
        end
    
        def update
          item.sell_in -= 1
    
          item.quality += 1
          item.quality += 1 if item.sell_in < 10
          item.quality += 1 if item.sell_in < 5
          item.quality = 0 if item.sell_in < 0
          item.quality = 50 if item.quality > 50
        end
      end
    
      class Sulfuras
        attr_reader :item
    
        def initialize(item)
          @item = item
        end
    
        def update; end
      end
    end
    
    class Item
      attr_accessor :name, :sell_in, :quality
    
      def initialize(name, sell_in, quality)
        @name = name
        @sell_in = sell_in
        @quality = quality
      end
    
      def to_s()
        "#{@name}, #{@sell_in}, #{@quality}"
      end
    end
    
    새로 만들어진 클래스에는 다음과 같은 여러 가지 반복 패턴이 있습니다.
  • 같은 개념(일종의 무역상품)
  • 서명이 같다case ... when, 회답Item
  • 오류 없이 교체 가능
  • 네가 알아맞혔어, 유산을 상속받을 때야!

    그렇게 특별하지 않은 상황이 부모가 됐어요.


    이성을 유지하기 위해서 나는 아버지의 대상이 내 것이라고 결정했다#update.사실 이 새로운 과정 중 어느 것이든 적합할 수 있다.이것이 바로 내가 이런 위험한 계승 개념을 사용하는 것에 그렇게 싫증이 나지 않는 이유입니다. 위의 요점을 참고하십시오.
    나는 또 이 모든 대상이 형제의 대상이어야 한다면 가능한 한 같은 방식으로 행동해 보아야 한다고 결정했다.
    한 물품에 마이너스 품질이 있을 수도 없고 50 이상의 품질이 있을 수도 없다.필요할 때, 나는 특수한 사례가 있지만, 절차를 간소화할 생각은 한 번도 하지 않았다.
  • CommonItem 그것의 질이 향상된 것을 보았기 때문에 나는 그것이 0보다 낮을 수 없다는 것을 전혀 개의치 않는다.그러나 어쨌든 이것은 사실이다.하나하나가 모두 이렇다.
  • 마찬가지로 나도 aAgedBrie의 품질은 영원히 50을 넘지 않지만 모든 상품에 대해 제한이 있다.
  • 다음과 같은 간단한 바인딩 도우미 함수를 구현했습니다.
    def limit_quality
      return item.quality = 0 if item.quality < 0
    
      item.quality = 50 if item.quality > 50
    end
    
    몇 분 후에 모든 것이 합법적인 부모로부터 물려받으면 우리는 이렇게 위대한 결과를 얻게 된다.
    class GildedRose
    
      def initialize(items)
        @items = items
      end
    
      def update_quality
        @items.each do |item|
          case item.name
          when "Aged Brie"
            AgedBrie.new(item).update
          when "Backstage passes to a TAFKAL80ETC concert"
            Backstage.new(item).update
          when "Sulfuras, Hand of Ragnaros"
            Sulfuras.new(item).update
          else
            CommonItem.new(item).update
          end
        end
      end
    
      class CommonItem
        attr_reader :item
    
        def initialize(item)
          @item = item
        end
    
    
        def update
          item.sell_in -= 1
    
          item.quality -= 1
          item.quality -= 1 if item.sell_in < 0
    
          limit_quality
        end
    
        private
    
        def limit_quality
          return item.quality = 0 if item.quality < 0
    
          item.quality = 50 if item.quality > 50
        end
      end
    
      class AgedBrie < CommonItem
        def update
          item.sell_in -= 1
    
          item.quality +=1
          item.quality +=1 if item.sell_in < 0
    
          limit_quality
        end
      end
    
      class Backstage < CommonItem
        def update
          item.sell_in -= 1
          return item.quality = 0 if item.sell_in < 0
    
          item.quality += 1
          item.quality += 1 if item.sell_in < 10
          item.quality += 1 if item.sell_in < 5
    
          limit_quality
        end
      end
    
      class Sulfuras < CommonItem
        def update; end
      end
    end
    
    class Item
      attr_accessor :name, :sell_in, :quality
    
      def initialize(name, sell_in, quality)
        @name = name
        @sell_in = sell_in
        @quality = quality
      end
    
      def to_s()
        "#{@name}, #{@sell_in}, #{@quality}"
      end
    end
    
    우리는 곧 시작할 것이다. 내일 우리는 이러한 종류를 어떻게 최종적으로 활용하고, 우리의 재구성 방안에서 그들의 존재를 증명할 것이다.
    왜냐하면, 그렇습니다. 우리는 목표가 하나 있습니다. 그것은 여전히 레이더에 있습니다. 이 CommonItem 종류를 더욱 쉽게 이해하고 유지할 수 있도록 하고, 기능을 추가하도록 합니다.
    좋은 하루 되세요!

    좋은 웹페이지 즐겨찾기