[실용주의 프로그래머] 5장. 구부러지거나 부러지거나

MEUN·2022년 3월 26일
0
post-thumbnail

2 주차

토 | Assignment #08

  • 📚 5장. 구부러지거나 부러지거나
  • ✔️ TIL

5장. 구부러지거나 부러지거나


📘 책에서 기억하고 싶은 내용

  • 결합도 줄이기 (p.182)
    • 우리가 어떤 것 하나만을 골라내려고 해도, 그거싱 우주의 다른 모든 것과 얽혀 있음을 깨닫게 된다. - 존 뮤어
    • 열차 사고 : 모든 메소드나 속성들이 서로 연결되어 있는 상황
    • 디미터(LoD) 법칙
      • 클래스 C에 정의된 메소드가 다음 목록에 속하는 것만 사용 가능
        • C의 다른 인스턴스 메소드
        • 메소드의 매개 변수
        • 스택이나 힙에 자신이 생성하는 객체의 메소드
        • 전역 변수
      • 현재는 의미가 많이 퇴색되었으나 기반 원칙 자체는 유효하다.
    • 전역 변수를 추가하는 것은 전체 메소드에 매개 변수를 하나씩 추가하는 것과 같다.
    • 싱글톤 객체, 외부 리스소를 포함한 전역 변수 및 데이터는 결합도를 높인다.
    • 상속도 결국 결합도를 높이는 것과 같다.
  • 실세계를 갖고 저글링하기 (p.193)
    • 이벤트 : 무언가 (새로운)정보가 있다는 것을 의미
    • 이벤트 기반 애플리케이션 개발 전략
      • 유한 상태 기계
        • 상태 기계는 이벤트를 어떻게 처리할지 정의한 명세, 이벤트와 관련된 모든 문제를 해결하지는 못한다.
      • 감시자(Observer) 패턴
        • 이벤트를 발생시키는 "감시 대상"과 이벤트에 관심이 있는 클라이언트인 "감시자"로 이루어진다.
        • 모든 감시자가 감시 대상에 등록되어야 하기 때문에 결합이 생긴다.
        • 또한, 감시 대상이 콜백을 직접 호출하도록 구현하기 때문에 이 부분이 성능 병목이 될 수 있다.
        • 감시자 패턴의 문제는 "게시-구독"으로 해결한다.
      • 게시-구독
        • 감시자 패턴을 일반화한 것으로, 감시자 모델의 문제(결합도, 성능)를 해결한다.
        • 게시-구독 모델을 많이 사용하는 시스템의 경우 현재 어떤 일이 벌어지고 있는지 파악하기가 힘들다는 것이 단점이다.
      • 반응형 프로그래밍과 스트림
    • 이벤트를 중심으로 공들여 만든 코드는 일직선으로 수행되는 코드보다 더 잘 반응하고 결합도가 낮다.
  • 변환 프로그래밍 (p.207)
    • 언어에서 파이프라인을 지원하지 않을 경우 아래와 같이 사용 가능하다.
      	const content = File.read(file_name);
       	const lines = find_matching_lines(content, pattern);
          const result = truncate_lines(lines);
    • 변환 사이에 값을 절대 날것으로 넘기지 않고, Wrapper 역할을 하는 자료 구조나 타입으로 값을 싸서 넘겨야 한다.
  • 상속세 (p.224)
    • 상속은 타입을 조합하는 방법이라고 설명하는 시뮬라 방식C++Java 같은 언어가 계승했다.
    • 상속은 동작을 다양하게 구성하는 방법이라고 설명하는 스몰토크 방식RubyJavaScript 에서 찾아볼 수 있다.
    • 상속도 일종의 결합이고, 다중 상속은 더 심한 문제를 일으킨다.
    • 상속을 대체하는 방법
      • 인터페이스와 프로토콜
        • 이들을 타입으로 사용할 수도 있고, 해당 인터페이스를 구현하는 클래스라면 무엇이든 그 타입과 호환되기 때문에 강력하다.
        • 다형성은 인터페이스로 표현하는 것이 좋다.
      • 위임(Delegation)
        • 멤버변수에 실제 상속받아 구현하려 했던 객체를 담고, 이를 사용
      • 믹스인과 트레이트
        • 바깥세상에 노출해야 하는 메소드들을 일일이 위임해야 하는 위임의 단점을 보완한 방안
        • 플래그를 이용하여 모든 검증 상황을 관리하는 것이 아닌 믹스인을 사용하여 각 상황에 맞는 전문호된 클래스를 만드는 것이 더 낫다.
    • 상속이 답인 경우는 드물다.
  • 설정 (p.236)
    • 외부 설정으로 애플리케이션을 조정할 수 있게 하라.
      • 인증 정보, 로그 레벨과 저장 위치, 포트/IP, 라이선스 키 등
    • 설정 정보를 전역에서 접근할 수 있도록 하는 것이 아닌 API 뒤로 숨기는 서비스형 설정을 사용하라.
    • 설정 정보를 바꾸기 위해 코드 빌드가 필요해서는 안 된다.
    • 외부 설정을 사용하지 않는다면 코드는 적응성이나 유연성을 어느 정도 포기해야만 한다.
    • 나의 프로젝트가, 나의 경력이 도도의 전철을 밟지 않도록 하라.

🤔 소감 및 생각

  • 이번 챕터를 읽으며 반응형 프로그래밍을 처음 배울 때 책에서 말하는 데이터를 거대한 강으로, 흐름으로 생각하라 라는 개념이 쉽지 않았었던 기억이 났다(지금도 사실 쉽지 않다). 그 당시에는 개념은 이해가 되어도 막상 코드를 작성하려니 막막하였고, 러닝커브가 크다는 사실에 잠깐 절망에 빠지기도 했다. 하지만 적응하며 답답했던 시기가 지나고 나니 반응형 프로그래밍의 장점을 점점 이해하게 됐는데, 이처럼 새로운 개념에 지속적으로 적응하려는 노력을 해야겠다고 생각하였다.
  • WebFilter 등 일부 인터페이스 및 클래스를 상속받아 커스터마이징에 사용할 때 상속이 당연하다고 생각했었는데, 이번 챕터를 읽으며 그 생각이 바뀌게 되는 계기가 되었다. 앞으로 클래스 상속 전에 다른 방안도 고려해볼 수 있도록 노력해야겠다.

🔍 새롭게 또는 다시 알게 된 내용

  • 애너그램 : 단어의 철자 순서를 바꾸어서 만든 다른 단어
  • 믹스인 : 다른 클래스의 부모클래스가 되지 않으면서 다른 클래스에서 사용할 수 있는 메소드를 포함하는 클래스

0개의 댓글