Skip to content

[책] 디자인 패턴의 아름다움 #25

@SAgiKPJH

Description

@SAgiKPJH

개요

1.1 코드를 배우는 이유

1.1.1 고품질의 코드 작성

  • 속도와 확장성을 맹목적으로 추구하는 현재의 개발 환경
    • 고품질 코드 작성할 시간이 많이 없다.
    • 유지보수하는 것은 무척 힘들다.
  • 높은 품질의 코드를 작성할려면? -> 코드 설계에 대한 이론적인 지식을 갖춰야 한다.

1.1.2 복잡한 코드 개발

  • 어려움 2가지
    • 매우 높은 수준의 기술이 필요한 경우
    • 복잡한 비즈니스, 코드양이 매우 많은 시스템 즉, 소프트웨어 개발의 복잡성
  • 코드 설계에 대한 지식이 있어야 한다.
  • 보통은, 비즈니스의 요구 사항에 따라 코드를 채우는 것이 일반적인 업무
  • 질문, 코드 설계를 의식하고 개발하자.
    • 계층화와 하위 모듈화 방법
    • 클래스 어떻게 나눌지
    • 각 클래스에 어떤 속성과 메서드를?
    • 클래스 간의 상호작용 설계 방법은?
    • 상속이나 연관을 사용하는게 좋을까?
    • 인터페이스나 추상 클래스 사용이 옳은가?
    • 결합도가 높은 코드와 낮은 코드?
    • 디커플링을 달성하는 방법은?
    • 싱글턴 패턴이나 정적 메서드 사용하는 것이 옳은가?
    • 객체를 생성할 때 팩토리 패턴을 사용하는 것이 옳은가?
    • 가독성 유지 및 확장성 향상을 위한 디자인 패턴 도입 방법은?

1.1.3 프로그래머의 기본 능력

  • 프로그래머는 기술의 넓이와 깊이 둘다 있어야 한다.
  • 심층적인 이해가 필요.’
  • 우수한 프로젝트는 코드와 클래스가 많으며, 클래스 구조와 클래스 간의 관계 호출 관계도 복잡하다..
  • 고도의 본질을 이해하자.

1.1.4 경력 개발에 필요한 기술

  • 기본적인 능력 향상 및 기본적인 지식 습득에 꾸준히 신경을 써야 한다.
  • 신입과 주니어 엔제니어의 코드리뷰 및 양성, 이끄는 일도 해야 한다.
  • 팀의 개발 효율성을 신경써야 한다.
  • 잘 설계되고 유지보수가 쉬운 시스템이 되어 의미있는 일을 더 할 수 있도록 한다.

1.2 코드 품질 평가 방법

  • 코드 품질 평가
    • 어떤 코드가 높은 가독성을 가지는 코드인가?
    • 어떤 종류의 코드가 확장과 유지 관리에 용이한가?
    • 가독성, 확장성, 유지보수 사이의 관계는 무엇인가?
    • 유지 보수는 정확히 어떤 것을 의미하는 것인가?
  • 코드 품질 요소
    • 유연성 (Flexibility)
    • *확장성 (Extensibility)
    • *유지 보수성(Maintainability)
    • *가독성 (Readability)
    • 이해 용이성 (Understandability)
    • 가변성 (Changeability)
    • *재사용성 (Reusability)
    • *테스트 용이성 (Testability)
    • 모듈성 (Moduarity)
    • 높은 응집도와 낮은 결합도 (High cohesion loose coupling)
    • 높은 효율성 (High efficiency)
    • 고성능 (High performance)
    • 보안성 (Security)
    • 호환성 (Compatibility)
    • 사용성 (Usability)
    • 깨끗함 (Clean)
    • 명확성 (Clarity)
    • *간결성 (Simplicity)
    • 직접성 (Straightforward)
    • 더 작은 코드가 더 많은 것을 담는다 (less code is more)
    • 문서화가 잘 된 (well-documented)
    • 계층화가 잘 이루어진 (well-layered)
    • 정확성 (Correctness, Bug free)
    • 강건성 (Robustness)
    • 신뢰성 (Reliability)
    • 확장성 (Scalability)
    • 안정성 (Stability)
    • 우아함 (Elegant)

1.2.1 유지보수성

  • 서비스 중인 프로젝트의 경우, 새로운 코드보다는 유지관리하는데 시간이 훨씬 오래 걸릴 수 있다.
  • 따라서 코드의 유지보수성이 특히 중요하다.
  • 코드가 간결하고 가독성이 좋으며 확장성이 높고 명확하게 계층화되어 있으며 높은 모듈성 높은 응집도 낮은 결합도를 가지고, 구현보다는 인터페이스 기반의 설계원칙을 고수하면 코드의 유지보수가 쉽다는 의미일 수 있다.

1.2.2 가독성

  • SW 설계 전문가 마틴 파울러(Matin Fowler) : ”컴퓨터가 이해할 수 있는 코드는 바보라도 작성할 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 작성한다.“
  • 코드의 명명이 의미가 있는지, 주석이 자세히 기술되어 있는지, 함수길이 적절한지, 모듈 구분이 명확한지, 높은 응집도와 낮은 결합도를 가지는지 확인

1.2.3 확장성

  • 기존 코드를 약간 수정 아니면 전혀 수정하지 않는 것 만으로 새로운 기능을 추가하는 것

1.2.4 유연성

  • 유연성은 추장적인 표현이다.
  • 코드가 확장 및 재사용에 용이하고 사용성이 높은 경우 일반적으로 코드가 유연하다고 할 수 있다.

1.2.5 간결성

  • KISS (Keep It Simple, Stupid) 원칙
  • 코드를 가능한 한 단순하게 유지한다. 즉, 단순하고 면확한 코드

1.2.6 재사용성

  • 코드 작성을 최소화하고 기존 코드를 재사용 하는 것
  • 다양한 설계 원칙, 설계 사상, 디자인 패턴에 의해 달성되는 최종 효과
  • DRY(Don’t repeat yourself)원칙

1.2.7 테스트 용이성

  • 테스트 용이성 수준이 코드 품질 수준 측면을 정확하게 반영

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

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

1.3.1 객체지향

  • 프로그래밍 패러다임 주도하는 세 가지 스타일
    • 절차지향 프로그래밍
    • 함수형 프로그래밍
    • 객체지향 프로그래밍
  • 객체지향 프로그래밍은 캡슐화, 추상화, 상속, 다형성의 풍부한 특성으로 인해 복잡한 설계 사상을 실현할 수 있다.
    • 때문에 다양한 설계 원칙과 디자인 패턴 코딩 구현의 기초가 된다.
  • 2장 예고
    • 객체지향의 네 가지 주요 특성
      • 캡슐화, 추상화, 상속, 다형성
    • 객체지향 프로그래밍과 절차저 프로그래밍의 차이점과 연계
    • 객체지향 분석, 설계, 프로그래밍
    • 인터페이스와 추상 클래스의 차이점과 각각 응용 시나리오
    • 구현이 아닌 인터페이스를 기반으로 한 설계 사상
    • 더 많은 합성, 더 적은 상속의 설계 상사
    • 절차적인 빈약한 도메인 모델과 객체지향의 풍성한 도메인 모델

1.3.2 설계 원칙

  • 설계 원칙이 어떤 문제와 응용 시나리오를 해결하는데 사용되는 것인지 파악해야 한다.
  • 설계원칙인 정신적인 방법, 디자인 패턴은 움직임
  • 설계 원칙들
    • 단일 책임 원칙
    • 개방 폐쇄 원칙
    • 리스코프 치완 원칙
    • 인터페이스 분리 원칙
    • 의존 역전 원칙
    • KISS 원칙 (keep it simple stupid)
    • YAGNI 원칙 (you aren’t gonna need it)
    • DRY원칙 (don’t repeat yourself)
    • LoD원칙 (law of demeter)

1.3.3 디자인 패턴

  • 개발에서 자주 접하게 되는 일부 설계 문제에 대해 요약된 솔루션 또는 설계 사상을 모아둔 것.
  • 디자인 패턴의 대부분은 디커플링과 확장성 문제를 해결한다.
  • 디자인 패턴의 연구는 어떤 문제와 일반적인 애플리케이션 시나리오를 과용하지 않고 해결할 수 있는지 숙달하는데 집중해야 한다.
  • 프로그래밍 언어가 발전하면서, 싱글턴 패턴과 같은 일부 디자인 패턴은 더 이상 사용되지 않고 안티패턴으로 간주한다.
  • 반면에 반복자 패턴같은 일부 새로운 디자인 패턴이 등장하고 있다.
  • 22개의 고차원적인 디자인 패턴을 다룰 예정.
  • 패턴은 범주인 생성, 구조, 행동 패턴으로 구분할 수 있다.

1.3.4 코딩 규칙

  • 주로 코드의 가독성 문제를 해결한다. 더 기본적이고 중요하다.
  • 코딩규칙은 설계원칙과 디자인 패턴에 비해 구체적이며, 코드 세부 사항에 중점을 두기 마련이다.
  • 최소한 변수, 클래스, 함수 명명규칙, 코드 주석 다는 범위와 같은 코드 규칙에 능숙해야 한다.
  • 코드 품질을 향상시키는 17가지 규칙을 요약해줄 예정.

1.3.5 리팩터링 기법

  • 지속적인 리팩터링은 코드 품질 저하를 방지하는 효과
  • 코드의 희망이 없는 수준의 손상을 효과적으로 방지한다.
  • 리팩터링을 위한 도구
    • 객체지향 프로그래밍 패러다임, 설계 원칙, 디자인 패턴, 코딩 규칙
  • 설계 원칙과 디자인 패턴의 중요한 응용 시나리오는 리팩터링
    • 디자인 패턴을 과도하게 사용하면 코드의 복잡성이 증가.
    • 초기 단계의 과도한 설계와 개발 문제를 효과적으로 방지할 수 있다.
  • 리팩터링의 3가지 측면
    • 리팩터링 목적, 대상, 시기, 방법
    • 오류가 없는지 확인하기 위한 기술적 수단
    • 두 가지 다른 규모의 리팩터링 (대규모 고수준, 소규모 저수준 리팩터링)

요약

  • 객체지향 프로그래밍 페러다임
    • 캡슐화, 추상화, 상속, 다형성등 풍부한 기능으로 복작한 설계 사상을 구현할수 있다.
    • 디자인 패턴 구현의 기초
  • 설계 원칙
    • 코드 설계를 이끌어 내는 몇 가지 경험의 요약
    • 일반적인 방향을 나타내는 정신
    • 디자인 패턴보다 더 일반적이다.
  • 디자인 패턴
    • 개발에서 자주 접하는 문제에 대한 해결방법 및 사상을 모아둔 것.
    • 디커플링을 통해 코드 확장이 주 목적.
    • 디자인 패턴은 더 구체적이고 구현하기 쉽다.
  • 코딩 규칙
    • 가독성 문제를 해결
  • 리팩터링
    • 코드 품질 저하를 방지
    • 객체지향 프로그래밍 패러다임, 설계원칙, 디자인 패턴, 코딩 규칙에 의존
  • 최종 목적은 고품질 코드 작성

1.4 과도한 설계를 피하는 방법

  • 과도한 설계는 나중에 요구사항이 변하지 않을 수도 있기 때문에 코드의 복잡성만 높일 뿐이다.

1.4.1 코드 설계 원리 의도는 코드 품질을 향상 시키는 것이다.

  • 이를 적용 하는 궁극적인 목적, 원래 위도는 코드의 품질을 향상시키는 것이다.
  • 왜 이런 방식으로 살게 하는지, 왜 이 디자인 부터을 제공 하는지, 실제로 코드 품질을 향상 시킬 수 있는지, 코드 품질을 어떤 측면을 계산할 수 있는지를 생각해야 한다.
  • 과도한 설계는 설계를 위한 설계

1.4.2 코드의 설계 원칙은 앞에 문제가 있고, 뒤에 방안이 있다.

  • 제품의 포인트(불편함을 느끼는 지점)가 어디인지, 사용자의 니즈가 무엇인지 생각하고 요구사항에 맞는 기능을 개발해야지, 화려한 기능을 먼저 개발한 후 요구사항을 끼워 맞추는 방식은 좋지 않다.

1.4.3 코드 설계의 응용 시나리오는 복잡한 코드에 적용되어야 한다.

  • 간단한 문제 -> 복잡한 디자인 패턴을 사용할 필요가 없다.
  • 디커플링의 주요 목적은 코드의 복잡성 처리.
  • 복잡한 코드 문제를 해결하기 위해 디자인 패턴이 만들어졌다.
  • 코드가 복잡할 수 록 설계에 더 많은 시간을 할애해야 한다.

1.4.4 지속적인 리팩토링은 과도한 설계를 효과적으로 방지할 수 있다.

1.4.5 특정 시나리오 외의 코드 설계에 대해 이야기 하지 않는다.

  • 특정 시나리오 없이 코드 설계가 합리적인지 이야기 하는 것은 무의미.
  • 비즈니스에서 아키택쳐에 대해 이야기하는 것은 비현실적이다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions