DaehunGwak / study-pragmatic-programmer

실용주의 프로그래머 (20주년 판) 스터디
5 stars 1 forks source link

4주차 - 2.10 직교성 #8

Open DaehunGwak opened 1 year ago

DaehunGwak commented 1 year ago

진도

2.10 직교성

일시

donghoon-song commented 1 year ago

Topic10 직교성

하나가 바뀌어도 나머지에 어떤 영향도 주지 않으면 서로 직교한다.

우리가 설계하고 싶은 것은 자족적인(단일하고 잘 정의된 목적을 가진) 독립적인 컴포넌트

직교적인 컴포넌트들을 결합함으로써 단위 노력당 더 많은 기능을 얻을 수 있다.(M x N)

‘특정 기능에 대한 요구 사항을 대폭 변경하는 경우 몇 개의 모듈이 영향을 받는가?’ → 한개여야 한다.

불필요한 것은 다른 모듈에 보여 주지 않으며, 다른 모듈의 구현에 의존하지 않는 코드를 작성할 것.(shy)

직교적으로 설계하고 구현한 시스템 → 테스트하기 더 쉽다

모듈 수준의 테스트나 단위 테스트가 통합 테스트보다 테스트 케이스를 만들고 수행하기 훨씬 쉽다.

단위 테스트를 작성하는 행위는 직교성을 테스트해 볼 수 있는 기회

도전해 볼 것

연습 문제 1

Edwin222 commented 1 year ago

대체로 너무나 맞는 말...

자신의 힘으로 제어할 수 없는 값에 의존하면 안된다. : 어렵긴 한데 유념은 해두어야 하는 가치 같다

도전해 볼 것

Q1. 배우긴 GUI툴이 쉽고, 여러 도구와 함께 동작해야 한다면 셸 스크립트가 쉽다.

사실 대부분의 툴들은 GUI와 셸 스크립트를 함께 제공한다.

셸 스크립트는 대체로 국소적이고 원자적인 수준의 여러 동작을 커맨드라인으로 지원하고, GUI 툴은 커맨드라인으로 일일히 라인마다 입력해야 하는 동작을 버튼 하나에 묶어서 처리할 수 있도록 해주는 방향의 설계가 정석이라 생각.

위와 같은 방식으로 만들면, 개별 기능들은 프로그램 내부에 한 벌씩만 존재하고, 접근하는 방법이 스크립트/GUI로 갈리는 형태가 된다.

Q2. 상속을 쓰면... 속상하지...

학교에서 상속을 가르칠 때 마치 이것이 모든 중복에 대한 답인 것 처럼 소개하지만 그래선 안된다... 신중하게 고르고 골라서 쓰지 않으면 격렬한 결합도 상승을 겪게 된다.. 특히 잘 모르고 쓰면 Composition 관계여야 하는 걸 상속으로 표현하게 된다.

상속을 사용하면 베이스 클래스의 변경이 모든 확장 클래스들에 여파를 주는데 심지어 그게 눈으로 잘 보이지 않는다.

그래서 깡 상속은 정말 어지간하면 피하는게 맞다 생각하고, 최소 추상 클래스, 가능하면 인터페이스를 쓰는게 좋다고 본다.

인터페이스는 뭐가 다르냐? 내부 구현이 없이 메소드나 프로퍼티의 모양만을 정의하기 때문에 상속에 비해 결합도를 덜 올리면서도 다형성의 이점을 얻을 수 있음.

연습 문제

Q1. Split2

입력이 들어오는 방법이 변해도 동일하게 사용 가능하다.

가령 파일에서 데이터를 읽는게 아니라 어떤 프로세스의 표준 출력을 읽어서 쪼개고 싶다거나..

아니면 네트워크 스트림을 읽어서 쪼개고 싶다거나 등등..

Q2.

객체지향은 상태의 관리 측면에서 직교적이다. 적절히 캡슐화되었다면 서로 다른 클래스 A와 B의 상태 변화는 서로에 대한 영향 없이 일어나고 관리된다는 것을 보장할 수 있다.

함수형은 각각의 기능들이 직교적이다. 사이드 이펙트가 없는 기능들로 잘 만들었다면 개별 기능들은 의도한 입력과 출력을 동일하게 유지할 수 있다는 전제 하에 어떻게 갈아끼우거나 고쳐도 상관이 없음.

어떤 언어는 무슨 패러다임으로 작성하기 좀더 쉬울 수 있다거나 할 수 있겠지만 결국 사용하는 방법의 차이라고 생각한다.

minkukjo commented 1 year ago

이야기 해볼 것

Venners:When asked what you might do differently 
if you could recreate Java, you've said you've wondered what it would be like to have a language that just does delegation.

Gosling:Yes.

연습문제

1

2

DaehunGwak commented 1 year ago
DaehunGwak commented 1 year ago
DaehunGwak commented 1 year ago
// client -> server A
class IngoingRequest {
  public OutgoingRequest toOutgoingRequest() {
    // 1 번. 클라이언트를 고치는건 빌드에 영향이가서 서버에서만 고치는 방향이 좋을 수 있다. (클라이언트 빌드 및 심사 케이스)
    return new OutgoingRequest(this...);
  }
}

// server A -> server B
class OutgoingRequest { 
  public OutogingRequest(IngoingRequest request) {
    // 2 번. 이것 보단
  }

  public OutogingRequest(필요한 값만 적기) {
    // 2 번. 필요한 파라미터만 생성자로 가져가고 비즈니스로직에서 풀어헤치면 생성자가 많아지는 것을 방지할 수 있을 것이다.
  }
}