[엘레강트 오브젝트] 3장 - Employment (1)

HyeBin, Park·2022년 6월 17일
0
post-thumbnail

3장 - Employment

3.1 5개 이하의 public 메서드만 노출하세요

  • 가장 우아하고, 유지보수가 가능하고, 응집력이 높으면서, 테스트하기도 용이한 객체는 작은 객체입니다.
  • 클래스의 크기를 정하는 기준으로 public, protected 메서드의 개수를 사용하고, 5개를 기준으로 생각하세요.
    => 지극히 개인적인 의견입니다.
  • 클래스가 작으면 메서드와 프로퍼티가 더 가까이 있을 수 있기 때문에 응집도가 높아집니다.

    getter 포함인지 궁금한데 포함이겠지? 메서드의 개수를 5개로 유지하려면 하나의 클래스 안에서도 여러개의 객체를 만들어야 할 것 같다. 작은 클래스에 대한 장점은 다 동의한다. 하지만 현재 프로젝트에 반영할 수 있을까? 필드 5개까지는 해보겠지만, 메서드 5개가 가능할까? 의문이 든다.

3.2 정적 메서드를 사용하지 마세요

  • 정적 메서드는 OOP에 NULL을 도입한 것 이상으로 커다란 실수입니다.
  • OOP에 static을 도입한 사람이 누구인지는 알 수 없지만 정적 메서드는 순수한 악입니다.
  • 정적 메서드는 객체 생성과 가비지 컬렉션에 신경 쓸 필요가 없습니다.
  • 유틸클래스의 장점
    • 많은 메서드를 모아 놓고 쉽고 간편하게 사용할 수 있습니다.
    • 사용성 측면에서도 매우 직관적입니다.
      => 하지만 문맥과 상관없이 정적 메서드를 사용하고 있는지 여부는 OOP를 제대로 이해하지못한 형편없는 프로그래머를 구별하기 위해 사용할 수 있는 최적의 지표입니다.

3.2.1 객체 대 컴퓨터 사고

  • 컴퓨터가 우리를 위해 일하고 우리는 명시적인 명령어를 제공해서 컴퓨터에게 지시를 내린다는 것입니다.
  • 컴퓨터는 우리가 명령어를 제공해줄 것이라고 기대하고, 제공된 명령어를 하나씩 순차적으로 실행합니다.
  • 새로운 무엇이 필요하다면 그 무엇을 정의합니다.
  • 함수형, 논리형, 객체지향 프로그래밍이 절차적 프로그래밍과 차별화되는 점이 바로 'is a' 입니다.
  • 정적 메서드는 OOP와 아무런 상관이 없으며, 객체 지향 언어의 문법을 이용해서 절차적인 코드를 작성하도록 부추길 뿐입니다.

3.2.2 선언형 스타일 대 명령형 스타일

  • 명령형 프로그래밍에서는 프로그램의 상태를 변경하는 문장을 사용해서 계산 방식을 서술합니다.
  • 선언형 프로그래밍에서는 제어 흐름을 서술하지 않고 계산 로직을 표현합니다.
  • 선언형 프로그래밍의 장점
    • 선언형 방식은 더 빠릅니다.
    • 다형성 - 코드 블록 사이의 의존성을 끊을 수 있는 능력
    • 표현력 - 선언형 방식은 결과를 이야기하는데 반해, 명령형 방식은 수행 가능한 한가지 방법을 이야기합니다.
    • 응집도 - 시간적인 결합 문제를 제거할 수 있으며, 따라서 유지보수성을 개선할 수 있습니다.

3.2.3 유틸리티 클래스

  • 유틸리티 클래스란 편의를 위해 다른 메서드들이 사용하는 정적 메서드들을 모아 놓은 정적 메서드들의 컬렉션이라고 부릅니다.
  • 클래스를 객체의 팩토리라고 정의했는데 유틸리티 클래스는 어떤 것의 팩토리가 아니기 때문에 진짜 클래스라고 부를 수 없습니다.
  • 유틸리티 클래스는 끔찍한 안티 패턴입니다. 가까이하지 마세요.

3.2.4 싱글톤 패턴

  • 싱글톤 패턴은 정적 메서드 대신 사용할 수 있는 매우 유명한 개념입니다.
  • 싱글톤은 유명한 디자인 패턴이지만 사실 끔찍한 안티 패턴입니다.
  • 싱글톤은 캡슐화할 수 있다.
  • 전역 변수는 순수하게 절차적인 언어를 위해서 존재하는 장치 입니다. 캡슐화를 완벽하게 위반하기 때문에 해롭습니다.
  • 싱글톤은 객체지향 패러다임을 잘못 사용한 예이며, 오직 정적 메서드가 있었기 때문에 탄생할 수 있었습니다.

3.2.5 함수형 프로그램밍

  • 객체의 크기가 작고, 상태가 변하지 않으며 정적 메서드도 포함하지 않는다면, 함수형 프로그래밍을 활용하는 편이 낫지 않느냐?
  • 함수형 프로그래밍보다 객체지향프로그래밍의 표현력이 더 뛰어나고 강력하다.
  • 객체지향 프로그래밍에서는 객체와 메서드를 조합할 수 있다.
  • 이상적인 객체지향 프로그래밍언어에는 클래스와 함께 함수가 포함되어야 합니다. 하나의 출구만 포함하는 순수한 함수형 프로그래밍 패러다임에 기반하는 진정한 함수를 포함해야 합니다.

3.2.6 조합 가능한 데코레이터

  • 제가 새로 고안한 용어입니다. 다른 객체를 감싸는 객체일 뿐입니다.
  • 다중계층 구조로 구성하기 시작하면 매우 깔끔하면서도 객체지향적입니다.
  • 객체지향에는 if, for, switch, while 연산자는 필요 없습니다. If, For, Switch, While 클래스가 필요할 뿐입니다.
  • 정적 메서드는 조합이 불가능합니다. 합성이라는 아이디어와 대치됩니다. static 키워드를 사용해서는 안됩니다.

선언형 방식이 좋다는 말은 오래전 부터 들었고 장점에 동의합니다. 하지만 적응하고 눈에 익는 시간이 필요한 것 같습니다. 이렇게 해 ! 가 아니라 이건 무엇이야? 라는 말이 이해하는데 많이 도움이 되었다. 연산자는 필요없고 클래스만 존재한다는 발상이 신선했습니다. 데코레이터를 사용하니 확실히 가독성이 더 좋았습니다.

0개의 댓글