✍️ 글쓰기/📕 읽고

#노마드북클럽 | 클린 코드 (Clean Code) 9일차

ddubimoon 2022. 3. 1. 16:55

 

TIL (DAY 9)

🔖 오늘 읽은 범위: 6장, 객체와 자료구조


책에서 기억하고 싶은 내용
  • 변수를 비공개(private)로 정의하는 이유가 있다. 남들이 변수에 의존하기 않게 만들고 싶어서다. (p118)
  • 그저 (형식 논리에 치우쳐) 조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되지 않는다. 그보다는 추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다. (p119)
  • 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 아무 생각 없이 조회 / 설정 함수를 추가하는 방법이 가장 나쁘다. (p119)
  • 객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개한다. 자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다. (p119)
  • (자료 구조를 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다. (p122)
  • 절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다. (p122)
    • 새로운 자료 타입을 추가해야 하는 경우 클래스와 객체 지향 기법을; 새로운 함수가 필요한 경우 절차적인 코드와 자료구조를!
  • 기차 충돌 ... 일반 적으로 조잡하다 여겨지는 방식이므로 피하는 편이 좋다. (p123)
    • final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath(); 를 아래와 같이 나누기.
    • Options opts = stxt.getOptions();
      File scratchDir = opts.getScratchDir();
      final String outputDir = scratchDir.getAbsolutePath();
  • 자료 구조체의 전형적인 형태는 공개 변수만 있고 함수가 없는 클래스다. 이런 자료 구조체를 때로는 자료 전달 객체(Data Transfer Object, DTO)라 한다. ... 특히 데이터베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할 때 유용하다. (p126)
  • 활성 레코드는 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과다. ... 활성 레코드는 자료 구조로 취급한다. 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성한다. (p127)
  • 우수한 소프트웨어 개발자는 편견 없이 이 사실(자료구조와 객체의 차이)을 이해해 직면한 문제에 최적인 해결책을 선택한다. (p128)
오늘 읽은 소감 및 생각
  • 학과 수업 중에 자바 선생님이 변수는 최대한 private으로 만들라고 했던 게 생각난다. 정~~~말 필요한 상황이 아닌 이상 변수는 public으로 두면 안된다는 말씀이었다. 변수는 오직 getter와 setter로만 접근할 수 있도록 해야 한다고 가르쳐 주셨다. 하지만 이 책에 따르면 이건 형식 논리에 치우친 클래스 선언법이었다. 소위 객체들은 서로 간의 적당한 거리를 유지할 때 그 결합도와 설계 구조가 좋은 시너지를 발휘한다는 것을, 이 책에서 이야기하고 있다. 한 마디로 기능 욕심(Feature Envy)을 부리지 말 것!
  • 비공개 변수나 내부 구조를 드러내지 않으면서, 한 함수 내에서 해결할 수 있는 업무는 해당 함수 내에서 모두 해결하는 것이 디미터 법칙을 지킬 수 있는 방법이 되겠다. 함수 A에서 객체 a 를 받고, 함수 B에서 객체 b를 받아 함수 C에서 쓰지 말고, 함수 C에서 객체 a와 b를 쓰는 내용을 각 함수 A나 B에서 포함해버리면 굳이 객체를 받아 옮길 필요가 없어지는 것이다.
궁금한 내용이나 새로 알게 된 개념
  • VISITOR 패턴
    : 객체 지향 프로그래밍과 소프트웨어 공학에서 비지터 패턴은 알고리즘을 객체 구조에서 분리시키는 디자인 패턴이다. 이렇게 분리를 하면 구조를 수정하지 않고도 실질적으로 새로운 동작을 기존의 객체 구조에 추가할 수 있게 된다. 개방-폐쇄 원칙을 적용하는 방법의 하나이다. (출처)
    비지터 패턴은 주로 상속 없이 클래스에 메서드를 효과적으로 추가하기 위해 사용한다. 하지만 합성 객체의 내부 구조가 비지터에 의해 열리게 되므로 캡슐화를 위반한다는 문제점이 생긴다. (p121)
    *개방-폐쇄 원칙(Open-Closed Principle): 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 
  • 디미터 법칙 (Law of Demeter)
    : 낯선 사람은 경계하고 친구랑만 놀기. (p123)
    다른 객체가 어떠한 자료를 갖고 있는지 속사정을 몰라야 한다는 것을 의미. 이러한 이유로 Don't talk to strangers 또는 Principle of least knowledge 으로도 알려져 있다. ... 디미터의 법칙을 준수함으로써 캡슐화를 높혀 객체의 자율성과 응집도를 높일 수 있다. (출처)
  • 기능 욕심 (Feature Envy)
    : 한 객체가 조회/설정 함수를 통해 비공개 변수를 그대로 노출할 때, 다른 함수가 절차적인 프로그래밍의 자료 구조 접근 방식처럼 비공개 변수를 사용하고픈 유혹에 빠지는 것. (p124)
  • Bean 구조
    : 비공개 변수를 조회/설정 함수로 조작. (p126) 말그대로 getter와 setter로 비공개 함수를 '공개' 해버리는 구조. 자료구조도 객체도 되지 못한다.