어느 집단이든 따라하는 가치가 있다. 가정에도 있고, 학교에도 있고, 직장에도 있다. 우리 프로그래머에게는 코드를 짜는 것이 일이기 때문에, 이 품질을 높이는 것이 가장 중요한 안건이다. 그러기 위해서 중요한 가치들에 대해서 알아보고, 이를 수호(?)하기 위한 원칙들에 대해서 상기하는 시간을 가지려 한다. 이번 글은 Kent BeckImplement Pattern을 기준으로 작성했다.

판단 기준이 필요한 이유

  • 프로그래밍은 코드 작성 매 순간 판단을 요구함
  • 하지만 제약 시간이 있기 때문에 많은 시간을 쓸 수는 없음
  • 결합도를 낮추고 응집도를 높였는데 코드가 더 이상해짐
  • 왜일까?
  • 판단 기준이 필요함
  • 판단 기준은 합의가 필요

구현에 있어 필요한 가치 3가지

  • 커뮤니케이션
    • 프로그래밍에 있어 가장 중요한 가치
    • 코드는 누군가가 계속 읽어야 함
    • 코드를 통해 소통함
    • 읽고 이해시킬 수 없는 코드는 가치가 없음
  • 단순함
    • 단순하여야 커뮤니케이션에 도움이 됨
    • 버그가 없어짐
    • 복잡한 문제를 단순하게 낮출 수 있음
    • 주의할 점
      • 단순함은 개발자, 조직 수준에 따라 달라짐
        • 상대적인 것
      • 미래의 확장을 위한 불필요하게 복잡한 패턴도 경계의 대상임
        • 그리디하게 사용하는 것이 옳음
      • 단순함과 짧음과는 다름
        • 단순함은 읽기 쉬움에 가까움
  • 유연함
    • 커뮤니케이션과 단순함이 만족되는 범위 내에서 유연한 구조를 추구
    • 대부분의 시간을 기본 코드를 수정하는 일에 사용
      • 가능한 한 유연하게 유지
    • 유연성 확보는 단순함와 Trade off

가치를 지키기 위한 원칙 6가지

  • 지역적 변화
    • 코드 수정시 함께 수정되어야 하는 부분 최소화/지역화
    • 코드 관리 비용을 줄임
    • 중복된 코드는 관리 비용을 높임
  • 최소 중복
    • 중복된 코드는 동시에 다른 부분까지 수정해야 할 가능성이 높음
    • 관리비용을 높임
  • 로직과 데이터의 결합
    • 로직과 데이터는 한 곳에 유지되는 것이 유리
      • 로직은 데이터를 기반으로 동작
    • 데이터 수정시 로직 수정 가능성이 높음
  • 대칭성
    • 코드는 대칭성을 가지면 좋음
      • add - remove
      • 함께 생성된 것은 함께 소멸되도록 구성
    • 코드 이해에 도움을 줌
      • 대칭적 구조로 만들게 되면, A개념 이해와 동시에 B개념 이해가 가능
    • 중복코드 줄이기 쉬움
  • 선언적 표현
    • 선언적 표현을 적절히 사용하면 코드 가독성이 올라감
    • "어떻게 하느냐" 보다 "무엇을 하느냐"를 기술
  • 변화율
    • 같은 시간내 같이 변해야 하는 것들
    • 시간적 대칭성
    • 일반적인 상황을 처리하는 메소드 vs 특정 상황을 처리하는 메소드
    • 의도 전달이 쉬움
    • 코드 수정에 대한 영향이 적음

OOP에 대한 의문과 고민

  • 의문들
    • 단순히 클래스를 만들어 사용하면 OOP일까?
    • OOP에서 말하는 많은 개념중 어떤 것이 핵심 가치일까?
    • 잘 만들어진 framework는 왜 그런 모양일까?
    • 수많은 디자인 패턴들을 일일히 외워야 할까?
  • Inheritance
    • OOP의 가장 중요한 개념인가?
      • 주장: OOP의 가치 중 가장 중요한 것은 재활용, 상속이 그러한 부분에서 유용하기 때문이다
        • Super Class 기능 확장
        • Super class 기능 재활용
    • 좋은 선택지가 아닐 확률이 높음
      • 재활용 위한 상속 남발
      • 고강도의 Coupling임
      • 한번 상속으로 처리했다면, 바꾸는데 비용이 매우 큼
      • 현재로서는 상속보다 Composition이 보다 좋은 해법임
      • 되도록이면 상속을 사용하지 말아라.
  • Abstraction
    • OOP에서 가장 중요한 개념
    • 기본 개념들은 일관되게 추상화의 개념을 사용함
    • 상속 역시, 추상화 관점에서 바라보아야 함
      • 기능의 확장이 아니고, 추상의 구체화 도구로 봐야 함
        • UIViewController를 구체화하여(상속을 사용하여) 내가 사용할 CustomViewController를 만든다.
  • 무엇을 공부해야 할까?
    • 잘 설계된 OOP Code의 공통점을 파악하자.
    • 모든 디자인 패턴을 외우는 것이 아니고, 어떻게 유도할 지 이해하는 것이 중요
    • 이것을 잘하기 위한 개념이 SOLID
    • 즉, 디자인 패턴 아래에 존재하는 개념이 SOLID이다.
  • SOLID
    • Single Respoinsibility Principle (단일 책임 원칙)
    • Open / Closed Principle (개방 폐쇄 원칙)
    • Liskov Subsitution Principle (리스코프 치환 원칙)
    • Interface Sergregation Principle (인터페이스 분리 원칙)
    • Dependency Inversion Principle (의존 관계 역전 원칙)

Reference

profile
Goal, Plan, Execute.

0개의 댓글