내가 따르는 경향이있는 추세는 기존 함수에 추가 매개 변수 (또는 새 유효한 값)를 추가하여 새로운 동작을 처리 할 수 있다면 코드를 더 많이 또는 덜 "명백하게 동일하게"남겨 두는 것입니다. 기존의 경우에는 기능을 변경하는 데별로 위험하지 않습니다. 예를 들어
, 이전 코드 :
def utf8len(s):
return len(s.encode('utf8')) # or maybe something more memory-efficient
새로운 사용 사례 - 내가 널 객체 패턴을 사용하는 스타일로 일부 코드를 쓰고 있어요, 그래서 나는 예외를 던지는 대신 None
을 반환 utf8len(None)
를 원한다. 나는 새로운 기능 utf8len_nullobjectpattern
를 정의 할 수 있지만, 그렇게, 아주 빨리 아주 성가신 얻을 것 :
def utf8len(s):
if s != None:
return len(s.encode('utf8')) # old code path is untouched
else:
return None # new code path introduced
그런 utf8len
에 대한 단위 테스트가 불완전하더라도, 나는에 대한 동작을 변경하지 않은 것을 내기 할 수있다 None
이외의 입력또한 어느 누구도 utf8len
에 의존하여 None
입력에 대한 예외를 throw하지 않았는지 확인해야합니다. 이는 (1) 문서 및/또는 테스트의 품질에 대한 질문입니다. (2) 사람들이 실제로 정의 된 인터페이스에주의를 기울여야하는지, 아니면 단지 소스를 사용하는지. 후자의 경우 사이트 호출을 살펴야하지만 상황이 원활하게 수행되면 거의 그렇지 않습니다.
허용되는 입력이 여전히 "똑같은"것으로 취급되는지 여부는 수정되는 코드의 비율에 대한 실제 질문이 아니라 수정 방법입니다. 이전 함수 몸체 전체가 새 함수에서 눈에 띄게 보이기 때문에 의도적으로 간단한 예제를 선택했습니다.하지만이 함수를 볼 때 알 수 있다고 생각합니다. 또 다른 예는 기존 고정 값을 제공하는 기본 매개 변수를 사용하여 구성 가능한 고정 된 (무언가를 값 또는 값을 가져 오는 데 사용 된 종속성을 전달하여) 무언가를 작성하는 것입니다. 오래된 고정 된 것의 모든 인스턴스는 새로운 매개 변수로의 (호출)로 대체되므로, 변경이 의미하는 것을 diff에서 볼 수 있습니다. 적어도 테스트를 통해 바보 같은 오타를 통해 이전 입력을 손상시키지 않았다고 확신 할 수 있으므로 테스트 커버리지에 대한 확신이 없어도 계속 진행할 수 있습니다.
물론 포괄적 인 테스트를 원하지만 꼭 그런 것은 아닙니다. 또한 여기에는 두 가지 상반되는 유지 관리 명령이 있습니다. 1 - 코드를 복제하지 마십시오. 코드에 버그가 있거나 향후 변경해야 할 동작이있을 수 있으므로 버그/현재 동작을 복제하고 있습니다. 2 - 약간 높은 falutin '이지만 기본적으로 말하는 "열리고 닫힌 원리"는 작동하는 재료를 쓰고 그것을 만지지 마십시오. " 1은이 두 가지 유사한 작업 사이에서 코드를 공유하도록 리팩토링해야한다고 말합니다. 2는 아니요, 이전 버전을 출시했거나,이 새로운 기능에 사용할 수 있거나 그렇지 않은지 여부를 확인하고, 그렇지 않은 경우 혼자 두십시오. .
함수가 복잡하여 함수의 10 % 만 수정할 수 있으면 리팩토링해야합니다. –
이상적인 점은 기존 기능을 손상시키지 않고 자신있게 수정할 수있는 테스트가 충분하다는 것입니다. 따라서 여기에 질문 할 질문이 있다는 사실은 테스트가 실제로 충분하지 않다고 가정합니다. 그리고 그 대답은 "우리가 테스트 한 것에서부터 얼마나 나쁜지에 달려 있다고 생각합니다. 우리가 원하는 모든 것을 할 수있는 시간이 없다 ","소름 끼치는 ". –