도금 로즈 카타 지나기 - 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
방법에서 그것의 호출을 변경할 것이다
def aged_brie_update(item)
end
def backstage_update(item)
end
def sulfuras_update(item)
end
def common_update(item)
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
새로 만들어진 클래스에는 다음과 같은 여러 가지 반복 패턴이 있습니다.
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보다 낮을 수 없다는 것을 전혀 개의치 않는다.그러나 어쨌든 이것은 사실이다.하나하나가 모두 이렇다.AgedBrie
의 품질은 영원히 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
종류를 더욱 쉽게 이해하고 유지할 수 있도록 하고, 기능을 추가하도록 합니다.좋은 하루 되세요!
Reference
이 문제에 관하여(도금 로즈 카타 지나기 - 3부: 인조 O부터 OO까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lomig/a-walk-through-the-gilded-rose-kata-pt-3-from-faux-o-to-oo-4fd6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)