객체지향 12

계약에 의한 설계

계약에 의한 설계 느낀점부록 A인데 계약에 의한 설계를 읽어보면서 프레임워크나 라이브러리를 내부를 어떻게 구현하고, 외부에 어떤 인터페이스들을 어떻게 제공하면 좋은지 더 생각하는 부록이었음.  계약에 의한 설계인터페이스를 다듬고 명령과 쿼리를 분리했다고 하더라도 명령으로 인해 발생하는 부수효과를 명확하게 표현하는 데는 한계가 존재주석으로 부수효과를 설명하는 것도 가능하겠으나, 파급효과를 명확하게 전달하기가 쉽지 않을 뿐더러 시간이 흐를수록 구현을 정확하게 반영하지 못할 가능성도 높음메서드의 구현이 단순하다면 부수효과를 쉽게 이해할 수 있을지도 모르지만, 부수효과를 가진 다수의 메서드들을 연이어 호출하는 코드를 분석하는 경우에는 실행결과를 예측하기 어려울 수 있음명령의 부수효과를 쉽고 명확하게 표현할 수 ..

오브젝트: 코드로 이해하는 객체지향 설계 나아가기를 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 나아가기를 읽으며 느낀점패턴에 대해서 더 상세히 알게 되었음. 컴포넌트 재사용과 합성이 이상적으로는 좋지만 현실에서는 아쉬웠다는 포인트에서 합성은 정말 좋은 방법이지만 모든 문제를 이 형태로 강제하여 해결하려는 건 어렵다고 생각하게 되었음  나아가기새로운 기술을 학습하기 위해서는 3가지 단계를 거침따라하는 수준적합한 열 가지 절차가 있더라도 모든 절차를 한번에 습득하는건 불가하여 한 가지 절차를 학습하고 그대로 모방분리 수준단 하나의 절차만으로는 모든 문제를 해결할 수 없는 사실을 깨닫고 다양한 절차를 학습하고 트레이드오프 함.모든 경우에 올바른 절차란 존재하지 않는다는 사실을 이해하고 각 상황에 따라 판단력과 유연함을 익힘.거침없는 수준이제 절차는 중요하지 않은..

오브젝트: 코드로 이해하는 객체지향 설계 14장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 14장을 읽으며 느낀점서비스 발전하면서 계속 코드 수정하게 되는데, 그때는 맞고 지금은 틀리다가 가장 정확한 표현인 것 같다  일관성 있는 협력객체는 협력을 위해 존재하며, 협력은 객체가 존재하는 이유와 문맥을 제고잘 설계된 애플리케이션은 이해하기 쉽고, 수정이 용이하며, 재사용 가능합 협력의 모임일관성 있는 패턴을 적용하면 이해하기 쉽고 직관적이며 유연해진다는 것코드 재사용을 위한 상속은 해롭다두 클래스 사이의 강한 결합도는 설계 개선과 기능의 추가를 방해 설계에 일관성 부여하기일관성 있는 설계를 만드는데 가장 훌룡한 조언은 다양한 설계 경험을 익히는 것풍부한 설계를 가진 사람은, 그 변경을 어떻게 다뤄야 하는지에 대한 통찰력을 가짐일관성을 제공하기 위해 어떤 ..

오브젝트: 코드로 이해하는 객체지향 설계 13장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 13장을 읽으며 느낀점상속과 관련된 설계에서 부모 클래스와 자식 클래스 간의 계약이 어떻게 정의되고 지켜져야 하는지 알게 되었음. 부모 클래스에서 정의된 규칙과 제약을 자식 클래스가 확장하거나 변경할 때, 이를 위반하지 않고 일관성을 유지하는 것이 객체지향 설계의 핵심상속이 단순히 코드 재사용을 위한 도구가 아니라, 명확하고 견고한 계약을 기반으로 하는 책임의 연속성을 의미.계약에 의한 설계에서 계약 위반이 발생했을 때 시스템이 얼마나 취약해질 수 있는지에 설득력 있었고, 상속보다는 합성(composition)을 활용해 계약을 명시적으로 정의하고 관리하는 것이 때로는 더 효과적일 것 같음.  서브클래싱과 서브타이핑상속의 첫번째 용도는 타입 계층을 구현하는 것타입 ..

오브젝트: 코드로 이해하는 객체지향 설계 10장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 10장을 읽으며 느낀점상속은 경험에 의해서 기피하는 경향이 있는데, 문제에 대해서 다시보면서 인터페이스 상속이 아닌 구현 상속이 일반적으로 문제가 있구나를 알게 되었음. 상속과 코드 재사용객체지향 프로그래밍의 장점 중 하나는 코드를 재사용하기가 용이하다는 것.전통적인 패러다임에서 코드를 복사한 후 수정하는 것클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 기법인 상속에 관해 살펴보기로 함.기존 클래스의 인스턴스를 포함시키는 방법으로 흔히 합성이라고 부름상속과 중복 코드중복 코드는 사람들의 마음속에 의심과 불신의 씨앗을 뿌림.눈 앞 코드가 어떤 코드와 비슷하다고 느끼는 순간 우리의 뇌는 혼란속으로 내던져 짐. DRY 원칙중복 코드는 변경을 방해함...

오브젝트: 코드로 이해하는 객체지향 설계 9장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 9장을 읽으며 느낀점개방 폐쇄 원칙 및 컴파일 타임 의존성, 런타임 의존성 보면서 기존 설계한 코드들을 다시 보게 되었음. 특히 Factory는 많이 사용하는데, 이거 어디에 위치시킬지 매번 고민했는데, 순수한 기술적 결정이므로 어디에 위치시킬지 명확한 근거를 알게 되었음. create, use를 분리하는거 경험적으로 행하고 있었는데, 문서로 보니까 더욱 좋았음! 유연할 설계이전 장에서는 재사용 가능한 설계를 만들기 위해 적용할 수 있는 다양한 의존성 관리 기번을 소개. 이번에는 원칙이라는 관점에서 정리개방 폐쇄 원칙은 확장과 수정이 키워드확장에 대해 열려 있다: 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 동작을 추가해서 애플리케이션의 기능을 확장..

오브젝트: 코드로 이해하는 객체지향 설계 8장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 8장을 읽으며 느낀점의존성에 대해서 더 잘 알게 되었음. 사내에서 이렇게 하면 더 좋겠다라고 생각해서 작성한 코드가 컨텍스트 확장과 조합 가능한 행동을 따른다는 데서 짜릿함을 느낌 의존성 관리하기잘 설계된 애플리케이션은 작고 응집도 높은 객체들로 구성협력은 필수적이지만 과도한 협력은 설계를 곤경에 빠뜨리기도 함.객체지향 설계란 의존성을 관리하는 것이고 객체가 변화를 받아들일 수 있게 의존성을 정리하는 기술변경과 의존성객체가 협력하기 위해 다른 객체를 필요로 할 때 의존성이 존재. 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가짐실행 시점: 의존하는 객체가 정상적으로 동작하기 위해서는 실행 시에 의존 대상 객체가 반드시 존재해야 함구현 시점: 이존 대상 객체..

오브젝트: 코드로 이해하는 객체지향 설계 6장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 6장을 읽으며 느낀점함수형 프로그래밍의 개념과 부수효과를 최소화하는 방법, 명령(Command)과 쿼리(Query)를 분리하는 설계 원칙에 대해 배운 것이 인상적이었음. 메시지를 통해 객체 간의 협력이 이루어질 때, 불필요한 부수효과를 피하는 것이 얼마나 중요한지 체감했고, 코드의 안정성과 일관성을 높이는 방법을 구체적으로 알게 되었음. 메시지와 인터페이스객체지향 프로그래밍에 대한 가장 흔한 오해는 애플리케이션이 클래스의 집합으로 구성된다고 생각하는 것. 클래스는 구현 도구일 뿐.가장 중요한 재료는 클래스가 아니라 객체들이 주고받는 메시지 클라이언트 - 서버 모델두 객체 사이의 협력 관계를 설명하기 위해 사용하는 전통적인 메타포는 클라이언트-서버 모델두 객체 사이..

오브젝트: 코드로 이해하는 객체지향 설계 5장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 5장을 읽으며 느낀점영화 설계를 바꾸는 모습을 보면서 어떻게 설계하는지에 대해서 생각을 많이 함. 재사용 되지 않는 메서드를 분리하면 시선이 분산되는 느낌이라 특정 메서드는 주석을 통해 전개하는데 몬스터 메서드라는 개념을 보면서 새로운 시각에 대해서 생각하게 됨. 책임 할당하기문맥을 벗어나 고립된 객체의 상태에 초점을 맞추기 때문에 캡슐화를 위반하기 쉽고 요소들 사이의 결합도가 높아짐. 다양한 객체 할당 방법이 존재하고 어떤 방법이 최선인지는 상황과 문맥에 따라 달라짐 데이터보다 행동을 먼저 결정하라객체에게 중요한 것은 데이터가 아니라 외부에 제공하는 행동. 객체지향 설계에서 가장 중요한 것은 적절한 객체에게 적절한 책임을 할당하는 능력 협력이라는 문맥 안에서 ..

오브젝트: 코드로 이해하는 객체지향 설계 4장을 읽으며

오브젝트: 코드로 이해하는 객체지향 설계 4장을 읽으며 느낀점리플 이펙트와 강한 결합도의 문제를 다룬 코드 예제가 큰 인상으로 남음. 강한 결합도가 있을 때, 하나의 코드 변경이 시스템 전체에 걸쳐 어떤 파급 효과를 일으킬 수 있는지 직접 예제를 통해 보면서, 결합도를 낮추는 것에 대해서 고민하게 되었음. 코드의 유연성이 떨어지고, 작은 수정에도 많은 부분이 연쇄적으로 영향을 받는다는 점에서 코드의 유지보수성에 큰 장애물이 된다는 걸 체감. enum으로 값을 정의하는 코드들이 정의 케이스가 바뀌면서 외부에서 대응해주는 것들이 많았는데 이게 강한 결합도와 리플 이펙트 영역과 예시가 많이 닮아 있어서 좋은 인사이트가 되었다! 설계 품질과 트레이드오프객체지향 설계의 핵심은 역할, 책임, 협력임. 협력: 기능을..