CHAPTER 1 개요

CHAPTER 1 개요

1.1 코드 설계를 배우는 이유

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

1.1.1 고품질의 코드 작성

속도와 확장성을 맹목적으로 추구하는 현재의 개발 환경에서 안타깝게도 대다수의 소프트웨어 엔지니어는
고품질의 코드를 작성하는 방법에 대한 생각할 시간이 많지 않은것도 사실이다

높은 품질의 코드를 작성할 수 있도록 스킬을 향상하려면 어떻게 해야 될까?
먼저 코드 설계에 대한 이론적인 지식을 갖춰야 한다

1.1.2 복잡한 코드 개발 다루기

소프트웨어 개발의 복잡성을 다루는 방법

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

1.1.3 프로그래머의 기본 능력

기술의 넓이와 깊이를 모두 가지고 있어야 된다

소스코드를 읽으면서 종종 그것이 어떤 의미인지 이해 못하는 경우가 있다 이것의 원인은
코드를 완벽히 이해하기 위한 기본적인 지식이 부족하기 때문이다

1.1.4 경력 개발에 필요한 기술

프레임워크를 잘쓰고 아키텍처에 대해 이야기하면서도 정작 코드가 나쁘면 결코 좋은 소프트웨어 엔지니어가 될수 없다

고품질 코드가 무엇인지, 고품질의 코드를 어떻게 작성해야 하는지 모른다면 어떻게 다른사람을 이끌고 설득할 수 있겠는가?

1.2 코드 품질 평가 방법

코드 품질에 대한 설명 방법

  • 유연성 flexibility
  • 확장성 extensibility
  • 유지보수성 maintainability
  • 가독성 readability
  • 이해 용이성 understandability
  • 가변성 changeability
  • 재사용성 reusability
  • 테스트 용이성 testability
  • 모듈성 modularity
  • 높은 응집도 와 낮은 결합도 high cohesion and low coupling
  • 높은 효율성 high efficiency
  • 고성능 high performance
  • 보안성 security
  • 호환성 compatibility
  • 사용성 usability
  • 깨끗함 clean
  • 명확성 clarity
  • 간결성 simplicity
  • 직접성 straightforward
  • 더 작은 코드가 더 많은 것을 담는다 less code does more
  • 문서화가 잘 된 well-documented
  • 계층화가 잘 이루어진 well-layered
  • 정확성 correctness, bug free
  • 강건성 robustness
  • 신뢰성 reliability
  • 확장성 scalability
  • 안정성 stability
  • 우아함 elegant

서로 다른 평가 관점들은 완전히 독립적이지 않으며 일부는 포괄 관계, 중첩 관계이거나 서로 영향을 미칠 수 있다

1.2.1 유지 보수성

기존의 코드 설계를 손상시키거나 새로운 버그를 발생시키지 않고도 빠르게 코드를 수정하거나 추가할 수 있는 상태를 말한다

1.2.2 가독성

컴퓨터가 이해할 수 있는 코드는 바보라도 작성할 수 있다 - 마틴파울러

any fool can write code that a computer can understand. Good programmers write code that humans can understand. - Martin Fowler

코드를 읽는 시간이 코드를 작성하는 시간보다 훨씬 많다

1.2.3 확장성

기존 코드를 약간 수정하는 것만으로도 혹은 전혀 수정하지 않고도 확장을 통해 새로운 기능을 추가하는 것을 말한다

1.2.4 유연성

유연하다는 것은 추상적인 평가 기준이며 어떤 것이 유연한 것인지 한 마디로 정의하는 것은 쉽지 않다

1.2.5 간결성

keep it simple, stupid - KISS

1.2.6 재사용성

객체 지향을 도입할 때 상속과 다형성의 목적 중 하나가 코드의 재사용성을 향상시키는 것이라고 언급

D.R.Y. - Don’t Repeat Yourself

1.2.7 테스트 용이성

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

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

1.3.1 객체지향

프로그래밍 패더다임을 주도하는 세 가지 스타일이 있는데, 바로 절차적 프로그래밍, 함수형 프로그래밍, 객체지향 프로그래밍 이다

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

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 디자인 패턴

1.3.4 코딩 규칙

주로 코드 가독성 문제를 해결한다

1.3.5 리팩터링 기법

  • 리팩터링 목적, 대상, 시기, 방법
  • 리팩터링에 오류가 없는지 확인하기 위한 기술적 수단
  • 두 가지 다른 규모의 리팩터링

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

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

설계를 위한 설계가 되면 안된다

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

페인 포인트(pain point)를 찾고 해결책을 찾는 것

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

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

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

잘못된 요구사항 예측으로 인한 과도한 설계를 피하기 위해 지속적인 리팩터링 개발 방법을 권장한다

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

코드 설계는 매우 주간적이다. 코드 설계는 예술이라고 해도 과언이 아니다 따라서 코드 설계의 품질을 판단하기 매우 어렵다

참조