1 분 소요

범위

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

내용

요약

  • 완벽한 소프트웨어를 만들 수 없다!
  • 단정적 프로그램

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

되돌리수 있는 의사결정

결합도가 낮은 코드가 바꾸기 쉽다.

결합의 증상

  • 관계없는 모듈이나 라이브러리 간의 희한한 의존 관계
  • 한 모듈의 간단한 수정이 이와 관계 없는 모듈을 통해 시스템 전역으로 퍼져 나가거나 시스템의 다른 곳에서 무언가를 깨뜨리는 경우
  • 개발자가 수정하는 부분이 시스템에 어떤 영향을 미칠지 몰라 코드의 수정을 두려워하는 경우
  • 변경사항에 누가 영향을 받는지 파악하고 있는 사람이 없어서 결국 모든 사람이 참석해야 하는 회의

테메테르 법칙(LoD)

  • C의 다른 인스턴스 메서드
  • 메스드의 매개 변수
  • 스택이다 힙에 자신이 생성하는 객체의 메서드
  • 전역변수

메소드 호출을 엮지 말라.

안좋은 예시

amount := cousomter.orders.last().totals().amount
orders := customer.oders
last = orders.last()
totals = last.totals()
amout = totals.amout

연쇄와 파이프라인

함수를 조합하여 파이프라인을 만드는 방법

글로벌화의 해악

전역 데이터는 컴포넌트 간 결합을 만들어 낸다

전역 데이터를 피하라.

외부 리소스도 전역 데이터다

전역적이어야 할 만큼 중요하다면 API로 감싸라.

상속은 결합을 늘린다

실세계를 갖고 저글링하기

이벤트

이벤트는 무언가 정보가 있다는 것을 의미한다.

이벤트의 잘 반응하는 애플리케이션을 만들 수 있는가?

  • 유한상태 기계(FSM, Finite State Machine)
  • 감시자 패턴
  • 게시-구독
  • 반응형 프로그래밍과 스트림

변환프로그래밍

프로그래밍은 코드에 관한 것이지만, 프로그램은 데이터에 관한 것이다.

파이프라인은 코드 -> 데이터 -> 코드 -> 데이터의 연속

상속세

  • 시뮬라: 상속은 타입을 조합하는 방법(c++, java)
  • 스몰토크: 상속은 동작을 다양하게 구성하는 방법(ruby, javascript)

코드를 공유하기 위해 상속을 쓸 때의 문제

상속도 일종의 결합이다. 자식 클래스를 사용하는 코드도 이 클래스의 모든 조상과 얽히게 된다.

타입을 정의하기 위해 상속을 쓸 때의 문제

타입으로 정의하다 보면 계층위에 계층을 덮게 되고 복잡해진다.

더나은 대안

  • 인터페이스와 프로토콜

    인터페이스나 클래스가 강력한 까닭은 이들을 타입으로 사용할 수 있고, 해당 인터페이스를 구현하는 클래스라면 무엇이든 그 타입과 호환되기 때문이다.

    다형성은 인터페이스로 표현하는 것이 좋다.

  • 위임

상속은 개발자들이 점점 더 메서드가 많은 클래스를 만들도록 유도한다

상속 대신 위임으로 처리.

서비스에 위임하라. Has-A가 Is-A보다 낫다.

  • 믹스인과 트레이드, 카테고리, 프로토콜 확장

믹스인이란 클래스나 객체에 상속을 사용하지 않고 새로운 기능을 추가하여 확장하고 싶을 때 일련의 함수들을 만들고 이름을 붙인 후 객체를 확인한다. 기존의 것과 새로운것의 기능 집합을 합치는 것.

믹스인으로 기능을 공유하라.

설정

외부 설정으로 애플리케이션을 조정할 수 있게 하라.

마치며

이번 장은 읽으면서 go가 많이 생각나는 내용이였다. 상속을 남용하지마라. 결국 코드를 짜는 나는 결합도를 줄이기 위해 노력하여야 하고 그런 노력들은 유연성을 가진 프로그램으로 변하면서 어느 상황에서도 유연하게 대처할 수 있는 실용주의 프로그래머가 가져야 되는 덕목들을 습득한다.

댓글남기기