TDD, Clean Code with Java 11기

개발 습관 개선을 위한 학습

객체 지향

GRASP

  • GRASP - General Responsibility Assignment Software Patterns

  • 책임 기반 객체지향 관점에서 객체에 책임을 할당하기 위한 패턴을 정리한 것을 의미

  • 책임할당에 기반한 객체 설계 원칙 : applying uml and patterns 책의 GRASP 설명 정리한 내용

  • GRASP : GRASP을 잘 설명하고 있는 영어로 된 문서

  • Information Expert

    • 역할을 수행할 수 있는 정보를 가지고 있는 객체에 역할을 부여하자.

    • Problem: What is a basic principle by which to assign responsibilities to objects?

    • Solution: Assign a responsibility to the class that has the information needed to fulfill it.

  • Creator

    • 객체의 생성은 생성되는 객체의 컨텍스트를 알고 있는 다른 객체가 있다면, 컨텍스트를 알고 있는 객체에 부여하자.

    • Problem: Who creates object A?

    • Solution: Assign class B the responsibility to create object A if one of these is true (more is better)

      • B contains or compositely aggregates A

      • B records A

      • B closely uses A

      • B has the initializing data for A

  • Controller

    • 시스템 이벤트(사용자의 요청)를 처리할 객체를 만들자. 시스템, 서브시스템으로 들어오는 외부 요청을 처리하는 객체를 만들어 사용하라.

    • Problem: What first object beyond the UI layer receives and coordinates “controls” a system operation?

    • Solution: Assign the responsibility to an object representing one of these choices:

    • Represents the overall “system”, “root object”, device that the software is running within, or a major

      subsystem (these are all variations of a facade controller)

    • Represents a use case scenario within which the system operation occurs (a use case or session controller)

  • Low Coupling

    • 객체들간, 서브 시스템들간의 상호의존도가 낮게 역할을 부여하자.

    • Problem: How to reduce the impact of change? How to support low dependency and increased reuse?

    • Solution: Assign responsibilities so that (unnecessary) coupling remains low. Use this principle to evaluate

      alternatives.

  • High Cohesion

    • 각 객체가 밀접하게 연관된 역할들만 가지도록 역할을 부여하자.

    • Problem: How to keep objects focused, understandable, manageable and as a side effect support Low Coupling?

    • Solution: Assign a responsibility so that cohesion remains high. Use this to evaluate alternatives.

  • Indirection

    • 두 객체 사이의 직접적인 Coupling을 피하고 싶으면, 그 사이에 다른 객체를 사용하라.

    • Problem: Where to assign a responsibility to avoid direct coupling between two or more things?

    • Solution: Assign the responsibility to an intermediate object to mediate between other components or services

      so that they are not directly coupled.

  • Polymorphism

    • 객체의 종류에 따라 행동양식이 바뀐다면, Polymorphism 기능을 사용하자.

    • Problem: How handle alternatives based on type?

    • Solution: When related alternatives or behaviors vary by type (class), assingn responsibility for the

      behavior (using polymorphi operations) to the types for which the behavior varies.

  • Pure Fabrication

    • Information Expert 패턴을 적용하면 Low Coupling과 High Cohesion의 원칙이 깨어진다면, 기능적인 역할을 별도로 한 곳으로 모으자.

    • Problem: What object should have the responsibility, when you do not want to viloate High Cohesion and Low

      Coupling but solutions offered by other principles are not appopriate?

    • Solution: Assign a highly cohesive set of responsibilites to an artifical or convenience class that does not

      represent a problem domain conecept.

  • Protected Variations

    • 변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 사용하자.

    • Problem: How to design objects, subsystems and systems so that the variations or instability in these

      elements does not have an undesirable impact on other elements?

    • Solution: Identify points of predicted variation or instability, assign responsibilities to create a stable

      interface around them.

객체지향 5원칙(SOLID)

  • SRP (단일책임의 원칙: Single Responsibility Principle)

    • 작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임(변화의 축: axis of change)을 수행하는 데 집중되어 있어야 한다

  • OCP (개방폐쇄의 원칙: Open Close Principle)

    • 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다.

  • LSP (리스코브 치환의 원칙: The Liskov Substitution Principle)

    • 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다. 즉, 서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다.

  • ISP (인터페이스 분리의 원칙: Interface Segregation Principle)

    • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.

  • DIP (의존성역전의 원칙: Dependency Inversion Principle)

    • 구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의 역전 원칙이다.

자동차 경주

로또

사다리 타기

볼링 게임 점수판

Last updated