it 책 18

계약에 의한 설계

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

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

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

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

오브젝트: 코드로 이해하는 객체지향 설계 15장을 읽으며 느낀점패턴에 대해서 더 상세히 알게 되었음. 컴포넌트 재사용과 합성이 이상적으로는 좋지만 현실에서는 실패했다는 이야기에서 내 코드에서도 일부는 일관성있는 구조를 시간 및 여러가지 사유로 어긴 케이스가 있어서 이에 대한 근거를 찾으려고 마련하게 되었던 것 같음.  디자인 패턴과  프레임워크소프트웨어 설계에서 반복적으로 발생하는 문제에 대해 반복적으로 적용할 수 있는 해결 방법을 디자인 패턴이라고 부름디자인 패턴의 목적은 설계를 재사용하는 것디자인 패턴을 익히고 나면 변경의 방향과 주기를 이해하는 것만으로도 필요한 역할과 책임, 역할들의 협력 방식을 순간적으로 떠올릴 수 있음프레임워크는 설계와 코드를 함께 재사용하기 위한 것프레임워크는 아키텍처를 구현..

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

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

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

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

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

오브젝트: 코드로 이해하는 객체지향 설계 12장을 읽으며 느낀점self, super 등 다형성에 점점 더 지식이 늘어가는 것 같다 가끔 수동 배포 할 때 ad hoc이란 용어가 있었는데, 임시라는 의미였다니! 다형성코드 재사용을 목적으로 상속을 사용하면 변경하기 어렵고 유연하지 못한 설계에 이를 확률이 높아짐상속의 목적은 코드 재사용이 아님상속은 타입 계층을 구조화하기 위해 사용해야 함.클라이언트 관점에서 인스턴스들을 동일하게 행동하는 그룹으로 묶기 위해서라면 사용하지 말아야 함.상속의 일차적인 목적은 코드 재사용이 아닌 서브 타입의 구현이라는 사실을 이해할 것객체지향에서 다형성은 유니버셜 다형성과 임시(ad Hoc) 다형성으로 분류할 수 있음유니버셜 다형성은 매개변수(Parametric) 다형성과 포함..

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

오브젝트: 코드로 이해하는 객체지향 설계 11장을 읽으며 느낀점프로그래밍 언어의 발전과 구조에 대한 이론에 점점 더 흥미가 생기는 것 같음. 언어마다 다중 상속을 지원하지 않거나 mixin을 제공하는 방식을 보며 각 언어가 선택한 설계 철학과 구조의 차이를 이해하는 데 많은 인사이트를 얻음. 이러한 차이점은 단순히 문법적 요소에 국한되지 않고, 언어가 지향하는 객체지향의 특성과 설계 원칙에 깊이 뿌리를 두고 있다는 점이 체계적으로 언어를 잘 만든 것 같음. 합성과 유연한 설계상속이 부모 클래스를 자식 클래스를 연결해서 부모 클래스의 코드를 재사용하는 데 비해 합성은 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용상속에서 부모와 자식 클래스 간의 관계는 컴파일 타임에 해결..

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

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

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

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

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

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