도금 장미 카타 지나기 - 2부: 복제품은 너의 친구 (처음)

31131 단어 ooprubyrefactorit
따라서 이전 글의 말미에 카타에게 테스트를 남겼지만 GildedRose 응용 프로그램의 핵심인gross conditional에 얽힌 것을 어떻게 처리하는지에 대한 단서가 없습니다.
만약 당신이 이kata를 시도해 보았거나, 만약 당신이 겪는 어려운 코드 세션과 연결하려고 한다면, 당신은 발생한 일들을 이해하고, 그리고 하나하나 인내심을 가지고 코드를 풀려고 할 것이다.
내가 말한 바와 같이 나는 할 줄 모른다.나 못해.이건 조건이 있어!싫다
하지만 내가 이해하고 좋아하는 것은 보호 조항이다.
보호 조항은 매우 간단하고 좋다. 나에게 있어서 가장 중요한 것은 편평하다는 것이다.

보호 조항?


이 개념에 익숙하지 않은 사람에게guard자구는 하나의 모델로 한 방법을 일찍 떠나 간단한 결과나 특수한 상황의 결과를 되돌려 이 방법이 주요 알고리즘에 전념하도록 해야 한다.
하나의 예를 통해 모든 것이 더욱 좋고 또렷해졌다.한 정수를 다른 정수로 나누는 방법이 있다고 상상해 보세요.
def divide(dividend:, divisor:)
  dividend.to_f / divisor
end
이것은 좋지만 divisor0라면 문제가 있을 수 있다.사용자가 이러한 연산을 시도할 때, 우리는 문자열 "error" 을 되돌려 주기를 희망합니다.
# Conditional
def divide(dividend:, divisor:)
  if !divisor.zero?
    dividend.to_f / divisor
  else
    "error"
  end
end

# Guard clause
def divide(dividend:, divisor:)
  return "error" if divisor.zero?

  dividend.to_f / divisor
end
그것이 효과가 있는 이유는 return가 이 방법의 집행을 멈추었기 때문에 그 어떤 else도 쓸모가 없기 때문이다.
그러나 우리는 어떻게 이 개념을 내 수중의 혼란스러운 방법에 응용할 것인가?

첫 번째 특수 상황을 집행에서 배제하다


나는 내가 가진 것을 풀려고 하는 것이 아니라 뭔가를 배제할 것이다.아무거나 좋습니다.코드를 살펴보겠습니다.
def update_quality()
    @items.each do |item|
      if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert"
        # <Moar code here!>
      end
    end
  end
item.name와 같은 경우Aged Brie가 있는 것 같다.나는 (랜덤으로, 어떤 다른 것도 괜찮지만, 이것은 단지 이곳에 처음 나타난 것일 뿐이다) 이것이 나의 특례가 될 것이라고 결정했다.
그럼 반품만 할게요.뭘 반품하고 싶어요?아직 모르겠지만 문제가 있습니까?어쨌든 단원 테스트는 나를 지지한다!
⚠️ 위의 Guard 자문 예시에서 나는 return 정지 방법의 집행을 사용했다.여기서 블록 실행을 멈추고 싶습니다.Ruby는 다른 언어와 달리 블록return에서 대체next하기에 충분합니다.
def aged_brie_update(item)
  # Here will be what we want to do with our Aged Brie!
end

def update_quality()
    @items.each do |item|
      next aged_brie_update(item) if item.name == "Aged Brie"

      if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert"
        # <Moar code here!>
      end
    end
  end
다시 한 번, 너는 내가 이 조건을 풀려고 하지 않았다는 것을 볼 수 있다.만약 항목이 Aged Brie이라면 나는 조건 외에 그것을 처리할 수 있을 것이다.만약 그렇지 않다면, 조건이 있으면 인수할 것이다.이렇게 해서 유일하게 실패해야 할 테스트는 Aged Brie와 관련된 테스트이다. 분명히 우리는 그것에 대해 아무것도 하지 않았다.😊

그래서 한 번 또 한 번의 테스트, 나는 녹색을 향해 노력했다.비록 우리는 나만의 인코딩 스타일이 있다고 말할 수 있지만, 나는 특별한 재구성에 진정으로 관심이 없다.그것은 우리 #update_quality 방법의 문제에서 벗어날 만큼 간단한 것 같다.
저희가 원하는 게 뭐예요?
  • 매번 늙는다.
  • 매번 1개 품질 획득하기;
  • 만약item.sell_in이 기한이 지나면 매번 추가 품질을 획득한다.
  • 품질은 50을 초과할 수 없다.
  • 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
    
    나의 테스트는 또 녹색이어서 나는 당연히 내가 아무것도 깨뜨리지 않았다고 생각할 수 있다.
    너는 내가 실행 경로를 더욱 복잡하게 만들었다고 생각할 수도 있다. GildedRose 종류가 더 길어졌다고 생각할 수도 있지만, 나를 용서해라. 나는 어리석은 사람이라는 것을 잊지 마라. 나는 어떤 일을 해서든 else 내장을 맞힐 것이다.

    되풀이


    내 비밀번호로:
    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
    
    def update_quality()
      @items.each do |item|
        next aged_brie_update(item) if item.name == "Aged Brie"
    
        if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert"
          # <Moar code here!>
        end
      end
    end
    
    나는 특례를 하나 발췌했다.
    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
    
    def backstage_update(item)
      #What should we do with the backstage pass?
    end
    
    def update_quality()
      @items.each do |item|
        next aged_brie_update(item) if item.name == "Aged Brie"
        next backstage_update(item) if item.name == "Backstage passes to a TAFKAL80ETC concert"
    
        if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert"
          # <Moar code here!>
        end
      end
    end
    
    백스테이지 통행증 시험은 빨간색이었다. 나는 그것들을 녹색으로 만들었다.
    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
    
    def backstage_update(item)
      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
      item.quality = 50 if item.quality > 50
    end
    
    def update_quality()
      @items.each do |item|
        next aged_brie_update(item) if item.name == "Aged Brie"
        next backstage_update(item) if item.name == "Backstage passes to a TAFKAL80ETC concert"
    
        if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert"
          # <Moar code here!>
        end
      end
    end
    

    그리고 씻어!


    하나하나 추출, 하나하나 추출, 나는 더 이상 특별한 상황을 찾을 수 없는 상태를 향해 노력했다.
    이 단계에서 제 코드는 이렇습니다. (Sulfuras 방법이 비어 있음을 주의하십시오.)😀 — 내가 이 특례를 꺼내자마자 테스트는 이미 녹색이었다!):
    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
    
    def backstage_update(item)
      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
      item.quality = 50 if item.quality > 50
    end
    
    def sulfuras_update(item)
    end
    
    def update_quality()
      @items.each do |item|
        next aged_brie_update(item) if item.name == "Aged Brie"
        next backstage_update(item) if item.name == "Backstage passes to a TAFKAL80ETC concert"
        next sulfuras_update(item)  if item.name == "Sulfuras, Hand of Ragnaros"
    
        if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert"
          # <Moar code here!>
        end
      end
    end
    
    나는 더 이상 어떤 특수한 상황도 없기 때문에, 조건이 있는 사람은 무엇을 합니까?
    사실 우리는 모든 특수한 상황을 처리하지 않았다. 우리는'비특수한 상황'을 처리해야 한다. 왜냐하면 나의 제품은 치즈도 음악회 입장권도 유황도 아니기 때문이다.
    나는 이것이 인류가 쉽게 잊어버리는 일이라고 생각한다. 우리가 X특례를 이야기할 때마다 실제로 우리는 X+1특례를 이야기하고 '비특례' 를 계산한다.

    최종 추출


    우리는 마침내 현재의 쓸모없는 조건을 삭제한 후에 모든'정상항'의 테스트를 녹색으로 바꾸었다. 이것이 바로 결과인 완전한 코드이다. 이번에:
    class GildedRose
    
      def initialize(items)
        @items = items
      end
    
      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
    
      def backstage_update(item)
        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
        item.quality = 50 if item.quality > 50
      end
    
      def sulfuras_update(item)
      end
    
      def common_update(item)
        item.sell_in -= 1
    
        item.quality -= 1
        item.quality -= 1 if item.sell_in < 0
        item.quality = 0 if item.quality < 0
      end
    
      def update_quality()
        @items.each do |item|
          next aged_brie_update(item) if item.name == "Aged Brie"
          next backstage_update(item) if item.name == "Backstage passes to a TAFKAL80ETC concert"
          next sulfuras_update(item)  if item.name == "Sulfuras, Hand of Ragnaros"
    
          common_update(item)
        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
    

    나 빛 봤어?


    걱정하지 마라, 내 가방 안에는 더 많은 수법이 있다.그럼에도 불구하고, 우리는 그것이 더 좋아 보이고, 우리 "Conjured items" 의 신제품을 첨가하는 것이 더욱 쉽다고 말할 수 있다.
    두 번째 부분을 끝내기 전에 (더 많이) 우리는 적어도 이곳의 보호 조항을 삭제할 수 있다.신호는 다음과 같습니다.

    def update_quality()
      @items.each do |item|
        case item.name
        when "Aged Brie"
          aged_brie_update(item)
        when "Backstage passes to a TAFKAL80ETC concert"
          backstage_update(item)
        when "Sulfuras, Hand of Ragnaros"
          sulfuras_update(item)
        else
          common_update(item)
        end
      end
    end
    
    나는 너희들에게 이 변화를 생각하게 할 것이다. (내가 조건문을 싫어한다고 했지?)3부까지!
    읽어주셔서 감사합니다.😊

    좋은 웹페이지 즐겨찾기