도금 장미 카타 지나기 - 2부: 복제품은 너의 친구 (처음)
31131 단어 ooprubyrefactorit
만약 당신이 이kata를 시도해 보았거나, 만약 당신이 겪는 어려운 코드 세션과 연결하려고 한다면, 당신은 발생한 일들을 이해하고, 그리고 하나하나 인내심을 가지고 코드를 풀려고 할 것이다.
내가 말한 바와 같이 나는 할 줄 모른다.나 못해.이건 조건이 있어!싫다
하지만 내가 이해하고 좋아하는 것은 보호 조항이다.
보호 조항은 매우 간단하고 좋다. 나에게 있어서 가장 중요한 것은 편평하다는 것이다.
보호 조항?
이 개념에 익숙하지 않은 사람에게guard자구는 하나의 모델로 한 방법을 일찍 떠나 간단한 결과나 특수한 상황의 결과를 되돌려 이 방법이 주요 알고리즘에 전념하도록 해야 한다.
하나의 예를 통해 모든 것이 더욱 좋고 또렷해졌다.한 정수를 다른 정수로 나누는 방법이 있다고 상상해 보세요.
def divide(dividend:, divisor:)
dividend.to_f / divisor
end
이것은 좋지만 divisor
가0
라면 문제가 있을 수 있다.사용자가 이러한 연산을 시도할 때, 우리는 문자열 "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
방법의 문제에서 벗어날 만큼 간단한 것 같다.
저희가 원하는 게 뭐예요?
def divide(dividend:, divisor:)
dividend.to_f / divisor
end
# 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
나는 내가 가진 것을 풀려고 하는 것이 아니라 뭔가를 배제할 것이다.아무거나 좋습니다.코드를 살펴보겠습니다.
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
방법의 문제에서 벗어날 만큼 간단한 것 같다.저희가 원하는 게 뭐예요?
item.sell_in
이 기한이 지나면 매번 추가 품질을 획득한다.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부까지!
읽어주셔서 감사합니다.😊
Reference
이 문제에 관하여(도금 장미 카타 지나기 - 2부: 복제품은 너의 친구 (처음)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/lomig/a-walk-through-the-gilded-rose-kata-pt-2-duplication-is-your-friend-at-first-28ao
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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부까지!
읽어주셔서 감사합니다.😊
Reference
이 문제에 관하여(도금 장미 카타 지나기 - 2부: 복제품은 너의 친구 (처음)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/lomig/a-walk-through-the-gilded-rose-kata-pt-2-duplication-is-your-friend-at-first-28ao
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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부까지!읽어주셔서 감사합니다.😊
Reference
이 문제에 관하여(도금 장미 카타 지나기 - 2부: 복제품은 너의 친구 (처음)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lomig/a-walk-through-the-gilded-rose-kata-pt-2-duplication-is-your-friend-at-first-28ao텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)