개념 관점은 도메인 안에 존재하는 개념과 개념들의 관계를 설명하는 것입니다. 명세 관점은 도메인에 초점을 맞추는 것이 아닌 객체들의 책임에 초점을 맞추게 되고 무엇에 집중합니다. 구현 관점은 실제 작업을 수행하는 것과 관련 있습니다. 어떻게 수행할 것인가에 초점을 맞히게 됩니다. 클래스 설계의 방법이 다른 것이 아닌 설계를 진행할 때 위와 3가지 관점 모두 고려해서 설계해야 합니다. 커피 전문점 도메인 커피 주문하는 과정을 천천히 생각해 보세요. 손님이 들어가고 메뉴판을 확인 후 선택한 메뉴를 바리스타에게 주문하게 됩니다. 객체 지향적인 관점으로 해석하면 커피 가게 객체, 손님 객체, 메뉴판 객체, 커피 메뉴 객체, 바리스타 객체가 각자의 역할을 수행하며 협력하고 있는 것으로 해석할 수 있습니다. 객체의..
이번 장에서는 코드 냄새에 관해서 얘기하고 있습니다. 직접 리팩토링하면서 겪은 경험에 관해 얘기하고 있는 부분이기에 어쩌면 이번 책에서 가장 핵심적인 내용이라고 볼 수 있습니다. 읽으면서 기록으로 남길만한 정보들은 남겨보도록 하겠습니다. 주석 부적절한 정보 다른 시스템에 작성될 정보를 코드 주석으로 다는 것은 적절하지 않습니다. 굳이 작성한다면 작성자, 최종 수정 일자, 소프트웨어 번호 등과 같은 메타 정보만 주석으로 작성합니다. 주석은 코드와 설계에 대한 설명을 부연하는 수단입니다. 환경 여러 단계로 빌드하고 테스트해야 한다 가장 이상적인 빌드는 명령어 하나로 빌드가 이루어지는 것입니다. 빌드를 하기 위해서 이것저것 파일을 찾고 명령어를 칠 필요가 존재하지 않아야 합니다. 요즘은 IDE가 이러한 빌드를..
모르는 장소에서 길을 찾을 때 어떤 방법을 선호하시나요? 대표적인 방법으로는 주변 사람들에게 길을 묻거나 지도를 확인하는 방법이 존재합니다. 길을 묻는 방법은 기능적이고 해결책 지향적인 접근 방법입니다. 하지만 이 방법은 일반적이지도 재사용할 수 있지도 않습니다. 위치는 상대적이기 때문에 시간이 지나면서 정보가 희미해져 갑니다. 지도를 확인하는 방법은 구조적이고 문제 지향적인 접근 방법입니다. 지도는 실제 세계를 추상화시켜 놓은 것이기에 풍부한 컨텍스트 정보가 담겨 있습니다. 이는 재사용 가능하며 길을 찾는 목적 이외에도 다양하게 활용할 수 있습니다. 여기서 주목해야 할 키워드는 기능과 구조입니다. 기능에 초점을 맞추다 보면 변화하는 요구사항에 대응하기 어렵습니다. 하지만 구조가 중심이 된다면 재사용할 ..
의도는 메시징이다. 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모듈 내부의 속성과 행동이 어떤가보다는 모듈이 어떻게 커뮤니케이션하는가에 달려 있다. 군중 속에서 책임이 분산되어 흩어지면 책임을 무시하려고 합니다. 이를 책임감 분산이라고 부릅니다. 명확한 책임이 존재하지 않으면 이를 타인의 책임으로 회피해버립니다. 실제 응급 환자 발생 시 훈련했을 때 도움을 청할 대상을 특정하여 도움을 요청하라고 교육받은 경험이 있습니다. '도와주세요'라고만 말하면 이는 타인의 책임으로 인식하여 개인의 실질적인 행동으로 이어지지 않을 수도 있기에 이처럼 교육하는 것 같습니다. 여기서 중요한 점은 명확한 책임과 역할을 가지고 협력에 참여해야 한다는 점입니다. 자율적인 책임 객체지향 공동체를 구성하는 기본 단위는 자율..
이번 장에서는 오픈 소스로 공개한 코드의 리팩토링을 진행하고 있었습니다. 읽으면서 유용했던 내용들만 정리해보고자 합니다. 경계값 검사를 확실하게 진행해야 한다. 추상 클래스에서는 구현을 숨기는 편이 좋기에 명명할 때도 주의해서 결정한다. 불필요한 주석은 제거한다. 일반적으로 상위 클래스는 하위 클래스를 몰라야 바람직하다. ENUM은 독자적인 소스 파일로 옮긴다. 정적 변수와 정적 메서드는 새 클래스로 옮긴다. 마치며 코드가 깨끗해지고 명확해지면 코드가 가지는 가치가 높아집니다. 그 가치는 연쇄적으로 영향을 주기에 처음부터 가치 있는 코드를 작성하도록 많은 시간 투자가 필요합니다.