두 가지 근본 문제를 내포한다.
1. 프로그래머가 자신이 작성한 코드가 어떤 상황에도 정상 동적할 것이라는 확신을 가지지 못함
2. 해당 코드를 수정해야 될때 프로그래머는 일종의 정신적 공황상태에 빠지기 쉽다. 어떻게 코딩한지 기억이 잘 나지 않는다;;
- 버그를 논리지거은 절차에 따라 해결하지 않고 프로그램의 엔트로피와 복잡성을 기하급수적으로 중대시키는 최악의 해결책을 선택하지 말아야 한다.
- 프로시저적 접근 방식을 사용하는 프로그래머들은 대개 자신의 코드를 이미 존재하는 코드의 골격에 맞추지만, 객체지향 접근방식이 몸에 밴 프로그래머는 거꾸로 원래 존재하는 코드를 새로운 코드가 존재하는 이상적인 방식에 맞춘다.
- 리펙토링(Refactoring) : 다양한 디자인 패턴을 구사해서 객체의 관련성을 수정하고, 불필요하게 중복된 코드를 한 곳으로 모으로, 이해하기 힘든 코드를 간명한 코드로 재작성하고, 객체의 계층관계를 단순화 하는 등, 새로운 기능이 자리를 잡을 장소의 주변을 깔끔하게 청소하는 작업
- but.. 리펙토링 전에 반드시!! 유닛테스트 코드 있어야한다.