[노개북]실용주의 프로그래머 #6~8

·2022년 3월 26일
0
post-thumbnail

📚 노마드 개발자 북클럽 aka. 노개북 - 실용주의 프로그래머 3주 완독 챌린지의 기록을 남긴다.
챌린지 이동

📝 TIL 2022.03.26

오늘 읽은 범위

4장. 실용주의 편집증 ~ 5장. 구부러지거나 부러지거나

책에서 기억하고 싶은 내용을 써보세요.

cp21. 계약에 의한 설계

계약에 따른 설계를 하라.

  • 정확한 프로그램이란 무엇인가? 스스로 자신이 하는 일이라고 주장하는 것보다 많거나 적지도 않게 딱 그만큼만 하는 프로그램을 말한다. 이 주장을 문서화하고 검증하는 것이 계약에 의한 설계(Design By Contract, DBC)의 핵심이다. (p.185)

  • DBC를 사용하는 최고의 장점은 요구사항과 보증의 문제를 전면으로 내세운다는 것이다. 입력 도메인 범위가 무엇인지, 경계 조건이 무엇인지, 루틴이 뭘 전달한다고 약속하는지(...)하는 것들을 설계 시기에 나열하는 것만으로도 더 나은 소프트웨어를 작성하는 데에 엄청난 도움이 된다.(p.189)

cp24. 언제 예외를 사용할까

예외는 예외적인 문제에 사용하라.

  • 예외에 문제가 있다면 하나는 이걸 언제 사용할지 아는 것이다. 우리는 예외가 프로그램의 정상 흐름의 일부로 사용되는 일이 거의 없어야 한다고 믿는다. 예외는 의외의 상황을 위해 남겨두어야 한다. (p.208)


cp26. 결합도 줄이기와 디미터 법칙

모듈간의 결합도를 최소화하라.

  • 코드를 세포(모듈, module)로 구성하고, 이들 간의 상호작용을 제한하라. 그러면 한 모듈이 변경되거나 교체된다 하더라도 다른 모듈들은 변경 없이 수행될 수 있을 것이다. (p.227)
    -> 3장의 직교성, 4장의 계약의 의한 설계와 연결


  • 디미터 함수 법칙은 프로그램에서 모듈간 결합도를 최소화하려 시도한다. 이 법칙은 한 객체가 제공하는 메서드에 접근하기 위해 또 다른 객체들을 통하는 것을 허용하지 않는다.

    • 디미터 함수 법칙
    class Demeter {
    private:
    A *a;
    Int func();
    pubilc:
    //...
    void example (B&b);
    }
    void Demeter:: example (B&b){
    C c;
    Int f = func(); // 자신
    b..invert(); // 메서드로 넘어온 인자
    a = new A();
    a->setActive(); //자신이 생성한 객체
    c.print(); // 직접 포함하고 있는 객체
  • 디미터 법칙은 코드를 더 적응성 있고 강하게 만들어 주지만 '주계약자 general contractor'로서의 대가를 치러야 한다. (...) 실제로 이는 위임자에게 단순히 요청을 전달하는 역할만을 하는 간단한 위임 메서드를 상당수 만들어야 함을 의미한다. (p.231)

cp27. 메타프로그래밍

통합하지 말고 설정하라.

  • 메타데이터는 애플리케이션을 기술하는 모든 데이터다. 애플리케이션이 어떻게 실행되어야 하고, 어떤 자원을 이용해야 하는지 등을 기술한다면 메타데이터라 할 수 있다. (p.236)


코드에는 추상화를, 메타데이터에는 세부 내용(구체화)을.

  • 우리의 목표는 (어떻게가 아닌 무엇을 해야 하는지를 명시함으로써) 선언적 declarative으로 생각하는 것이고, 이로써 더 동적이고 적응가능한 프로그램을 만드는 것이다. 이를 위해서 다음의 일반 규칙을 따른다. 일반적 경우에 대해서 프로그램을 만들고, 특별한 것들은 컴파일된 코드 밖 어딘가에 내놓는다. (p. 159)

cp.29 단지 뷰일 뿐이야

모델에서 뷰를 분리하라.

  • 모델을 표시하는 뷰, 그리고 뷰를 관리하는 컨트롤러에서 모델을 분리해 내는 것. 바로 이것이 모델-뷰-컨트롤러 Model-View-Controller, MVC 이디엄의 핵심 개념이다.
  • 모델 : 대상 객체를 나타내는 추상 데이터 모델. 모델은 어떤 뷰나 컨트롤러에 대해서도 직접적인 지시글 지니지 않는다.
  • 뷰: 모델을 해석하는 방법. 뷰는 모델의 변화 그리고 컨트롤러가 보내는 논리저 사건을 구독한다.
  • 컨트롤러: 뷰를 제어하고 모델에 새로운 데이터를 제공하는 방법. 모델과 뷰 둘 모두에 이벤트를 보낸다.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • 4장은 낯선 용어와 개념들이 많이 등장했다. 자바나 C 기반 언어를 배워보지 않은 나에게는 중간중간의 예제 코드들 또한 이해하기가 어려웠다. 하지만 계약에 의한 설계, 단정적 프로그래밍, 예외와 리소스 사용의 균형이라는 각 소챕터에서 말하고자 하는 것은 3장에서 나온 직교성, 가역성 등과 같은 실용주의 프로그래밍의 원칙에서 뿌리를 찾을 수 있었다.
  • 책 초반에서부터 느낀 점 중 하나로서 이 책의 주제는 프로그래밍이지만, 실용주의라는 관점에서 해석할 때 삶의 전반에 적용하기에도 무리가 없는 내용이라는 것이 와닿는 챕터였다.

  • 코드의 의존성이나 상호 영향에 대해 생각해보지 못했는데 새로운 깨달음을 주었다. 스파이나 비밀 조직에서 세포라는 작은 단위의 그룹을 만들고, 그룹 간의 정보 공유 등 상호 작용을 철저히 통제하는 방식을 코드에서 적용할 수 있다고 비유한 점이 이해에 도움이 되었다. 시스템 내에서 동떨어진 것처럼 보이는 변화가 코드에 영향을 주지 않길 원한다면, 독립성을 확보해야 한다. 이는 유지보수 차원에서도 중요한 원칙이다.
  • MVC의 개념은 리액트를 처음 배울 때 들어보았었다. 리액트는 View에만 집중한 자바스크립트 라이브러리라는 것. 그래서 리액트에서는 필요에 따라 상태관리 시스템으로 Redux라는 라이브러리를 사용한다. 이 책에서는 MVC 개념의 원론적인 이해와 모델과 뷰가 분리되었을 때의 장점을 알게 되었다. 이는 유연한 설계를 가능하게 하고, 결합도를 줄여 가역성까지 유지할 수 있는 방법이다.
profile
걸음마 개발 분투기

0개의 댓글