최근에 RailsConf 2014에서 "All the Little Things" 를 보았습니다 .
def tick
if @name != 'Aged Brie' && @name != 'Backstage passes to a TAFKAL80ETC concert'
if @quality > 0
if @name != 'Sulfuras, Hand of Ragnaros'
@quality -= 1
end
end
else
...
end
...
end
첫 번째 단계는 함수를 여러 개의 작은 함수로 나누는 것입니다.
def tick
case name
when 'Aged Brie'
return brie_tick
...
end
end
def brie_tick
@days_remaining -= 1
return if quality >= 50
@quality += 1
@quality += 1 if @days_remaining <= 0
end
내가 흥미로 웠던 것은이 작은 함수들이 작성되는 방식이었습니다. brie_tick
예를 들어, 원래 tick
함수 의 관련 부분을 추출하여 작성된 것이 아니라 test_brie_*
단위 테스트를 참조하여 처음부터 작성되었습니다 . 이러한 모든 단위 테스트가 통과되면 brie_tick
완료된 것으로 간주됩니다. 모든 작은 기능이 완료되면 원래의 모 놀리 식 tick
기능이 삭제되었습니다.
안타깝게도 발표자는이 접근 방식으로 인해 네 가지 *_tick
기능 중 세 가지 기능이 잘못되었다는 사실을 알지 못했습니다 (다른 기능은 비어 있음). *_tick
기능 의 동작 이 원래 tick
기능 의 동작 과 다른 경우가 있습니다. 예를 들어, @days_remaining <= 0
에 brie_tick
있어야합니다 < 0
- 그래서 brie_tick
호출 할 때 제대로 작동하지 않습니다 days_remaining == 1
와 quality < 50
.
여기서 무엇이 잘못 되었습니까? 이러한 특별한 경우에 대한 테스트가 없었기 때문에 이것이 테스트 실패입니까? 또는 리팩토링 실패-코드를 처음부터 다시 작성하지 않고 단계별로 변환해야합니까?