2011-10-25 2 views
3

기존 기능 건너 경우 거의 당신이에 가장 좋은 방법입니다 필요한다는 것을 기존 시스템에 새로운 기능을 추가 할 때 : 기존의 기능은재사용 기존 기능

  • 복사하여 변경 (코드 복사가 동료 개발자를 울리는 것을 알고 있음).

    - 또는 편집 기존의 케이스와 당신 (품질 보증 팀 외침을 만드는) 시스템의 기존 부분으로 새로운 버그를 도입 할 수 있다는 위험 새로운 사례를 모두 처리 할 수있는 기존의 기능

    • 새로운 독립적 기능 (사본을 기반으로)을 작성하기 전에 선을 그려야하는 기존 기능을 편집하는 경우 ... 기능의 10 %, 기능의 50 %?
+2

함수가 복잡하여 함수의 10 % 만 수정할 수 있으면 리팩토링해야합니다. –

+1

이상적인 점은 기존 기능을 손상시키지 않고 자신있게 수정할 수있는 테스트가 충분하다는 것입니다. 따라서 여기에 질문 할 질문이 있다는 사실은 테스트가 실제로 충분하지 않다고 가정합니다. 그리고 그 대답은 "우리가 테스트 한 것에서부터 얼마나 나쁜지에 달려 있다고 생각합니다. 우리가 원하는 모든 것을 할 수있는 시간이 없다 ","소름 끼치는 ". –

답변

2

내가 따르는 경향이있는 추세는 기존 함수에 추가 매개 변수 (또는 새 유효한 값)를 추가하여 새로운 동작을 처리 할 수 ​​있다면 코드를 더 많이 또는 덜 "명백하게 동일하게"남겨 두는 것입니다. 기존의 경우에는 기능을 변경하는 데별로 위험하지 않습니다. 예를 들어

, 이전 코드 :

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는 아니요, 이전 버전을 출시했거나,이 새로운 기능에 사용할 수 있거나 그렇지 않은지 여부를 확인하고, 그렇지 않은 경우 혼자 두십시오. .

1

당신은 항상 코드 중복을 피하기 위해 노력해야한다. 따라서 새로운 기능을 구현하기 위해 이미 존재하는 함수의 반환 값을 수정하는 새로운 함수를 작성하는 것이 좋습니다.

어떤 경우에는 그렇게 할 수 없다는 것을 알고 있습니다. 이 경우 인터페이스를 변경하지 않고 기존 기능을 다시 작성해야합니다. 그리고 을 수행하여 새로운 버그를 도입하면이 수정 된 함수 에서 실행될 수있는 단위 테스트에 의해 예방되고 전에 프로젝트 코드에 추가됩니다.

기존 함수의 일부만 필요하면 기존 함수에서 새 함수를 추출하고 기존 함수와 새 함수에서이 새로운 "helper"함수를 사용하십시오. 단위 테스트를 통해 의도 한대로 모든 것을 다시 확인합니다.

3

항상 그렇게 할 수는 없지만 기존의 기능을 다른 작은 부분으로 나눠서 모든 코드를 편집하지 않고도 필요한 부분을 사용할 수 있고 작은 조각을 쉽게 편집 할 수 있습니다. 코드

그렇다면 시스템의 기존 부분에 새로운 버그를 알릴 수 있다고 생각한다면 아마도 단위 테스트를 사용해야한다고 생각할 것입니다.

관련 문제