본문 바로가기

JAVA/Design Patterns

디자인 패턴의 아름다움 #코드 설계

반응형

디자인 패턴의 아름다움

코드 설계를 배우는 이유

  • 코드 설계에 대한 지식은 확장성과 가독성이 높아 유지보수가 용이한 고품질의 코드를 작성할때 필요하다.

고품질의 코드 작성

  • 먼저 코드 설계에 대한 이론적인 지식을 갖춰야 한다.

복잡한 코드 개발 다루기

  • 소프트웨어를 개발할때 만나는 어려움 2가지
  1. 매우 높은 수준의 기술이 필요한 경우 (자율주행, 비디오 인식, 높은 성능 등)
  2. 높은 수준의 기술이나 최신의 기술이 필요하지는 않지만 복잡한 비즈니스를 갖춘 대규모의 프로젝트 (물류, 금융, ERP 시스템등 개발에 많은 사람이 참여하는 경우)
  • 대부분의 소프트웨어 엔지니어는 프로그래밍 언어, 개발도구, 그리고 개발 프레임워크에 익숙하며 프레임워크를 사용하여 비즈니스 요구사항에 따라 코드를 채우는 것이 일반적인 업무
  • 비즈니스를 이해하고 비즈니스를 코드로 변환하는 한 대단한 코드 설계 능력을 요구하지는 않는다.
  • 그러나 비즈니스와 무관한 일반 기능 모듈의 개발을 요청시에 좀 더 복잡한 코드 설계와 개발이 필요하게 되면, 어디서부터 무엇을 시작해야 할지 막막한 상태가 된다.
  • 단순히 기능을 구현하고 사용 가능한 코드를 만드는 것은 복잡하지 않을 수 있지만, 사용하기 쉬운 코드를 작성하는 것은 쉽지 않다.

질문?

  • 계층화와 하위 모듈화 방법은 무엇인가?
  • 클래스를 어떻게 나누는 것이 좋은가?
  • 각 클래스에서 어떤 속성과 메서드가 있는가?
  • 클래스 간의 상호작용을 설계하는 방법은 무엇인가?
  • 상속이나 연관을 사용하는 것이 옳은가?
  • 인터페이스나 추상 클래스를 사용하는 것이 옳은가?
  • 결합도가 높은 코드와 낮은 코드는 무엇인가?
  • 디커플링을 달성하는 방법은 무엇인가?
  • 싱글턴 패턴이나 정적 메서드를 사용하는 것이 옳은가?
  • 객체를 생성할때 팩터리 패턴을 사용하는 것이 옳은가?
  • 가독성을 유지하면서 확장성을 향상시키기 위해 디자인 패턴을 도입하는 방법은 무엇인가?

프로그래머의 기본 능력

  • 프로그래머는 기술의 넓이와 깊이를 모두 가지고 있어야 한다.
  • 코드 설계와 관련된 지식은 오픈 소스 프로젝트를 쉽게 이해할수 있을 뿐만 아니라 코드의 기술적 본질을 이해하는데 도움이 되는 프로그램 개발의 기본 기술이라고 할수 있다.

코드 품질 평가 방법

  • 어떤 코드가 높은 가독성을 가지는 코드인가?
  • 어떤 종류의 코드가 확장과 유지 관리에 용이한가?
  • 가독성, 확장성, 유지모수 사이의 관계는 무엇인가?
  • 유지보수는 정확히 어떤것을 의미하는 것인가?

유지보수성

  • 코드 개발에서 유지수란 버그의 수정, 이전 코드의 수정 또는 새로운 코드의 추가에 불과하다.
  • 유지보수성이 높다라는 표현의 의미는 기존의 코드 설계를 손상시키거나 새로운 버그를 발생시키지 않고도 빠르게 코드를 수정하거나 추가할수 있는 상태를 말한다.
  • 소프트웨어 엔지니어는 대부분의 시간을 버그의 수정, 기존 기능의 논리 수정, 새로운 기능 논리 추가에 할애 한다.
  • 따라서 코드 유지보수성이 중요하다.
  • 코드가 간결하고 가독성이 높으며, 확장성이 높다면 코드의 유지보수도 쉬워진다.
  • 코드가 명확하게 계층화되어 있으며, 높은 모듈성, 높은 응집도와 낮은 결합도를 가지고 구현보다는 인터페이스의 기반의 설계원칙을 고수한다면 코드의 유지보수가 쉽다는 의미일 수 있다.

가독성

  • 코드를 작성할때 이해하기 쉽고 읽기 쉬운 코드인지 고려해야 한다.
  • 유지보수성에 큰 영향을 미친다.

확장성

  • 기존의 코드를 약간 수정하는 것만으로도 혹은 전혀 수정하지 않고도 확장을 통해 새로운 기능을 추가하는 것을 말한다.
  • 즉, 코드의 확장성은 코드를 작성할때 새로운 기능을 추가할수 있는 여지가 설계 당시부터 고려되어 있어 확장용 인터페이스가 이미 존재함을 의미하며, 확장성이 높으면 새로운 기능 코드를 추가할때 기존 코드의 대량 수정없이도 새로운 코드를 바로 추가할 수 있다.
  • 코드 품질을 평가하는 중요한 기준
  • 요구 사항의 미래 변화에 대처할수 있는 코드의 능력을 의미한다.

유연성

  • 코드의 품질을 설명하는데에도 사용할수 있다.
  • 코드가 확장과 재사용이 용이하고 사용성이 높을 경우 일반적으로 코드가 유연하다고 생각할 수 있다.
  • '유연하다'라는 표현은 광범위한 의미를 가지며 다양한 시나리오에서 두루 사용할 수 있다.

간결성

  • KISS 원칙
  • 코드를 가능한 한 단순하게 유지하려는 간결성을 의미한다.
  • 단순한 코드와 명확한 논리는 코드의 가독성이 높고, 유지보수성이 높다는 것을 의미한다.

재사용성

  • 반복적인 코드 작성을 최소화하고 기존 코드를 재사용하는 것을 이해할수 있다.
  • 객체지향을 도입할때 상속과 다형성의 목적 중 하나가 코드의 재사용성을 향상시키는 것이라고 언급하고 설계원칙을 도입할때는 단일책임원칙과 코드 재사용성은 언급한다.
  • 리팩터링 기술을 도입할때는 디커플링, 높은 응집도, 모듈화가 코드 재사용성을 향상 시킬수 있음을 언급한다.
  • DRY 원칙

테스트 용이성

  • 코드 테스트 용이성 수준이 코드 품질 수준 측면을 정확하게 반영할 수 있기 때문이다.
  • 코드의 테스트 용이성이 낮으면 단위 테스트를 작성하기 어렵다는 뜻이다.
  • 기본적으로 코드의 설계가 문제가 있음을 보여준다.

고품질 코드를 작성하는 방법

  • 고품질 코드는 유지하기 쉽고, 읽기 쉽고, 확장하기 쉽고, 유연하고, 간결하고, 재사용 가능하고, 테스트가 가능한 코드를 의미한다.
  • 코드 품질 평가 표준을 충족하는 고품질의 코드를 작성하려면 객체지향 설계 패러다임, 설계원칙, 코딩 규칙, 리팩터링 기술, 디자인 패턴을 포함하여 일부 세련되고 구현 가능한 프로그래밍 방법론은 마스터 해야 한다.
  • 이러한 프로그래밍 방법론을 마스터하는 궁극적인 목표는 고품질의 코드를 작성하는 것이다.

객체지향

  • 객체지향의 4가지 특성: 캡슐화, 추상화, 상속, 다형성
  • 객체지향 프로그래밍과 절차적 프로그래밍의 차이점과 연계
  • 객체지향 분석, 객체지향 설계, 객체지향 프로그래밍
  • 인터페이스와 추상 클래스의 차이점과 각각의 응용 시나리오
  • 구현이 아닌 인터페이스를 기반으로 한 설계 사상
  • 더 많은 합성, 더 적은 상속의 설계 사상
  • 절차적인 빈약한 도메인 모델과 객체지향의 풍성한 도메인 모델

설계원칙

  • 단일책임원칙
  • 개방폐쇄원칙
  • 리스코프 치환원칙
  • 인터페이스 분리 원칙
  • 의존 역전 원칙
  • KISS 원칙
  • YAGNI 원칙
  • DRY 원칙
  • LoD

디자인 패턴

  • 생성디자인패턴 : 싱글턴, 팩터리 패턴(단순 팩터리패턴, 팩터리 메서드 패턴, 추상 팩터리 패턴), 빌더 패턴, 프로토타입 패턴
  • 구조디자인패턴 : 프록시패턴, 데커레이터 패턴, 어댑터 패턴, 브리지 패턴, 퍼사드 패턴, 복합체 패턴, 플라이웨이트 패턴
  • 행동디자인패턴 : 옵서버 패턴, 템플릿 메서드 패턴, 전략패턴, 책임연쇄패턴, 상태 패턴, 반복자 패턴, 비지터 패턴, 메멘토 패턴, 커맨드 패턴, 인터프리터 패턴, 중재자 패턴

코딩 규칙

리팩터링 기법

  • 리팩터링의 목적, 대상, 시기, 방법
  • 리팩터링에 오류가 없는지 확인하기 위한 기술적 수단: 단위테스트, 코드 테스트 용이성
  • 두자기 다른 규모의 리팩터링 : 대규모 고수준의 리팩터링과 소규모 저수준의 리팩터링

디자인 패턴을 적용하는 목적은 디커플링, 즉 더 나은 코드 구조를 사용하여 단일 책임을 위해 큰 코드 조각을 작은 클래스로 분할하여 코드가 높은 응집도와 낮은 결합도의 특성을 충족하면서 하는 것이다.

  • 생성 디자인 패턴은 코드에서 생성코드를 분리
  • 구조 디자인 패턴은 다른 기능 코드를 분리
  • 행동 디자인 패턴은 다른 행동 코드를 분리

디커플링의 주요 목적은 코드의 복잡성을 처리하는것.
즉 복잡한 코드 문제를 해결하기 위해 디자인 패턴이 만들어진다.

 

디자인 패턴의 아름다움
- 왕정 지음, 김진호 옮김

반응형

'JAVA > Design Patterns' 카테고리의 다른 글

13. 디자인패턴 정리  (0) 2019.01.02
12. 컴파운드 패턴  (0) 2019.01.02
11. 프록시 패턴  (0) 2019.01.02
10.스테이트 패턴  (0) 2018.12.17
9.컴포지트 패턴  (0) 2018.12.13