문제

현재 예상되는 방식으로 기능하는 프로그램이 있다고 가정 해 봅시다. 응용 프로그램은 그 뒤에 코드가 매우 열악하고, 많은 메모리를 먹으며, 비평 할 수 없으며 기능의 변경 사항을 구현하기 위해 주요 재 작성이 필요합니다.

리팩토링은 어느 시점에서 총 재건이 덜 논리적이됩니까?

도움이 되었습니까?

해결책

Joel 은이 주제에 대한 멋진 에세이를 썼습니다.

절대하지 말아야 할 일, 1 부

내가 이것으로부터 얻은 주요 교훈은 오래된 코드가 끔찍하지만 눈과 미적 감각을 아프게한다는 것입니다. 그 코드의 많은 부분이 문서화되지 않은 오류와 문제를 패치 할 가능성이 상당히 높다는 것입니다. 즉, 많은 도메인 지식이 포함되어 있으며 복제하기가 어렵거나 불가능할 것입니다. 당신은 끊임없이 지배 버그에 맞서 싸울 것입니다.

내가 가장 유용한 책은 책이 있습니다 레거시 코드로 효과적으로 작동합니다 Michael C. Feathers. 그것은 진정으로 못생긴 레거시 코드에 접근하기위한 전략과 방법을 제공합니다.

다른 팁

재건에 대한 리팩토링의 한 가지 이점은 단계별로 리팩토링을 수행 할 수 있다면, 즉, 전체 시스템의 컨텍스트에서 증분을 테스트하여 개발 및 디버깅을 더 빠르게 테스트 할 수 있다는 것입니다.

구식 및 배포 된 코드는 추악하고 느려도 철저히 테스트 된 이점이 있으며 처음부터 시작하면이 혜택이 손실됩니다.

증분 리팩토링 접근 방식은 또한 배송 할 수있는 제품이 항상 가능하도록하는 데 도움이됩니다 (그리고 지속적으로 개선하고 있습니다).

웹에 좋은 기사가 있습니다 Netscape 6이 처음부터 작성된 방법과 비즈니스 측면에서 나쁜 생각이었습니다..

글쎄, 가장 간단한 대답은 재건하는 것보다 리팩터에 더 오래 걸리면 재건해야한다는 것입니다.

그것이 개인 프로젝트라면, 당신은 어쨌든 리팩토링보다 처음부터 건축에서 더 많이 배우게 될 것이기 때문에 그것을 재건하고 싶을 것입니다. 그것은 개인 프로젝트의 큰 목표입니다.

그러나 전문적인 시간 제한 환경에서는 장기적으로 회사에 최소한의 돈을 지불하는 비용으로 항상 가야합니다.

물론, 그것보다 조금 더 복잡 할 수 있습니다. 리팩토링이 완료되는 동안 다른 사람들이 기능을 수행 할 수 있다면, 모든 사람이 완전히 새로운 버전을 구축 할 때까지 기다리는 것보다 더 나은 선택 일 수 있습니다. 이 경우 재건축은 시간보다 시간이 덜 걸릴 수 있습니다 단지 리팩토링은 취했을 것입니다. 그러나 전체 프로젝트와 프로젝트의 모든 기고자를 고려해야합니다.

실제로 코드를 작성하는 것보다 리팩토링에 더 많은 시간을 할애 할 때.

소프트웨어가해야 할 일을하지 않는 시점에서. 리팩토링 (기능을 변경하지 않고 코드 변경)은 기능이 "의도 된대로"인 경우에만 적합합니다.

앱을 완전히 재건 할 시간을 감당할 수 있다면 기능을 점차적으로 향상시킬 필요가 없으며 기존 코드를 유지하고 싶지 않으면 다시 쓰기가 실행 가능한 대안입니다. 반면에 리팩토링을 사용하여 기존 기능을 서면으로 더 잘 작성하고 효율적으로 동등한 기능으로 천천히 대체하여 증분 재 작성을 수행 할 수 있습니다.

응용 프로그램이 매우 작 으면 처음부터 다시 작성할 수 있습니다. 응용 프로그램이 커지면 절대하지 마십시오. 점차적으로 다시 작성하십시오. 한 번에 한 단계 씩 당신이 아무 것도 깨지지 않았다는 것을 확인하십시오.

응용 프로그램은 사양입니다. 처음부터 다시 쓰면 "이 기능에 대한 호출이 그 특정한 경우에 3을 반환해야한다는 것을 아무도 몰랐기 때문에 많은 교활한 버그가 발생할 가능성이 높습니다 (문서화되지 않은 동작 ...).

처음부터 다시 쓰는 것이 항상 더 재미있어서 뇌가 올바른 선택이라고 생각하도록 속일 수 있습니다. 조심하십시오. 아마도 그렇지 않을 것입니다.

나는 과거에 그러한 응용 프로그램과 함께 일했습니다. 내가 찾은 가장 좋은 방법은 점진적인 접근 방식입니다. 코드 작업을 할 때 여러 번 수행되는 작업을 찾아 기능으로 그룹화하십시오. 진행 상황을 표시 할 수 있도록 노트북 (종이, 종이, 연필 또는 펜)을 보관하십시오. 대신 VC와 함께 사용하십시오. 노트북은 리팩토링의 일부로 만든 새로운 기능에 대한 개요를 제공하는 데 사용될 수 있으며 VCS는 물론 세부 사항을 위해 공백을 채 웁니다.

시간이 지남에 따라, 당신은 많은 코드를보다 적절한 장소로 통합했을 것입니다. 이 기간 동안의 코드 복제는 불가능할 것입니다. 따라서 가능한 지점에 도달 할 때까지 최선을 다하십시오. 진짜 리팩토링 프로세스를 시작하고 전체 코드 기반을 감사하고 전체 작업을 수행하십시오.

해당 프로세스에 시간이 충분하지 않으면 (매우 오랜 시간이 걸릴 것임), 테스트 우선 접근 방식을 사용하여 처음부터 다시 쓰는 것이 더 나을 것입니다.

밥 아저씨는 무게가 있습니다 다음과 함께 :

올바른 전략의 재 설계는 언제입니까?

그 질문을 해줘서 다행입니다. 여기에 답이 있습니다. 절대.

봐, 당신은 엉망이되어 이제 정리하십시오.

한 가지 옵션은 단위 테스트를 작성하여 기존 애플리케이션을 다루고 단위 테스트를 사용하여 모든 것이 이전과 같이 작동하는지 확인하기 시작하는 것입니다.

이상적인 세상에서 당신은 이미 프로그램에 대한 단위 테스트를 받았지만 앱의 품질에 대한 의견이 주어졌습니다.

문서, 독창적 인 작가, 테스트 케이스 및 남은 버그가 없습니다.

내가 상속하는 코드가 실제로 나쁘면 작은 증분 변화에 대한 운이 많지 않았습니다. 이론적으로 작은 점진적인 접근 방식은 좋지만 실제로는 모든 것이 더 좋지만 여전히 모든 사람이 당신의 디자인이라고 생각하는 잘 설계되지 않은 응용 프로그램입니다. 일이 깨지면 사람들은 더 이상 이전 코드 때문이라고 생각하지 않으면 이제는 당신의 잘못이됩니다. 그래서 나는 재 설계, 리 팩터 또는 다른 것을 암시하는 다른 것을 사용하지 않을 것입니다. 관리자 유형 내가 정말로 내 방식대로하지 않는 한 당신이 당신의 길로 바꾸고 있다는 것. 그렇지 않으면, 수십 가지 문제가 고정되어 있더라도 여전히 존재했지만 발견되지 않은 문제는 이제 재 작업에 기인 할 것입니다. 코드가 나쁘면 코드가 시작하기에 너무 나쁘기 때문에 수정 사항이 훨씬 더 많은 버그를 발견 할 것입니다.

소프트웨어 시스템을 개발하는 방법을 진정으로 알고 있다면 전체 시스템을 재 설계 할 것입니다. 좋은 소프트웨어를 디자인하는 방법을 진정으로 모른다면 원본만큼 나쁜 코드베이스로 끝날 수 있으므로 작은 증분 변화를 고수 할 것입니다.

재 설계 할 때 종종 저지른 실수 중 하나는 사람들이 원래 코드 기반을 무시한다는 것입니다. 그러나 재 설계는 이전 코드를 완전히 무시할 필요가 없습니다. 이전 코드는 여전히 새 코드가해야 할 일을해야했기 때문에 많은 경우 필요한 단계가 이미 이전 코드에 있습니다. 시스템을 재 설계 할 때 복사하여 붙여 넣은 다음 조정은 놀라운 일입니다. 많은 경우 원래 코드에서 응용 프로그램을 재 설계하고 재 작성하고 스 니펫을 훔치는 것이 작은 증분 변경보다 훨씬 빠르고 훨씬 더 신뢰할 수 있음을 발견했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top