TIL (Today I Learned) 날짜

    1. 28

오늘의 미션

5장 구부러지거나 부러지거나 - 연습문제 23


<aside> ❓ 연습 문제 23 | “X 언어에는 파이프라인이 없는데요” 에서 우리는 다음과 같은 코드를 썼다.

//1번 코드
const content = File.read( file_name );
const lines = find_matching_lines( content, pattern );
const result = truncate_lines ( lines );

많은 사람들이 객체 지향 코드를 짤 때 메서드 호출을 연결해서 쓴다. 그래서 어쩌면 위 코드도 다음과 같이 바꾸고 싶을지도 모른다.

//2번 코드
const result = content_of( file_name )
							 .find_matching_lines( pattern )
							 .truncate_lines(); 

1) 두가지 코드의 차이는 무엇인가?

2) 어느 쪽을 선호할 것 같은가?

</aside>

풀이

일단 파이프 라인이라는 개념은 책에서 나온 내용에서 |> 이런 모양의 기호로 왼쪽에 있는 값을 가져다 오른쪽에 있는 함수의 첫 번째 인자로 넣는 다라는 의미

( 엘릭서에 대한 관련자료 )

기본 개념은 결국 인자를 다음 함수에 넘기는 입력 → 출력 → 입력 →출력 ... 으로 단계별로 만들어 결합도를 줄이기 위한 의도인 것이다.

  1. 두코드의 차이는... 1번 코드처럼 파이프라인의 개념을 변수로 받아서 전달하면 파이프라인이 없어도 개념은 상통하다.

그렇지만, 2번 코드는 결과값을 도출하기까지 중간 과정이 객체에 있는 함수로 매우 밀접하게 결합되어있다. ( 풀이에서는 객체가 우리 코드와 결합되어 있다고 표현함. )

//1번 코드
const content = File.read( file_name ); // 파일의 내용을 변수에 담는다.
const lines = find_matching_lines( content, pattern ); // 파일의 내용과 일정 패턴일치한 줄을 찾는다.
const result = truncate_lines ( lines ); // 그 줄들을 연결한다.
// 흐름이 단계별로 끊어져있어서 연결고리를 해제하는데 부담이 없다.
//2번 코드
const result = content_of( file_name ) // 파일명인 인자로 내용을 확인하고 ->
							 .find_matching_lines( pattern ) // 어떤 패턴이 일치하는 줄을 찾아서 ->
							 .truncate_lines(); // 라인들을 연결한다..
							 // 연결 - 연결 - 연결 중간에 끊을수 없는 연결고리들..

  1. 결국 선호하는 쪽은 파이프라인을 잘 구현한 1번 코드를 더 선호 할 수 밖에 없다.

1번 코드 처럼 단계별로 코드를 구현하였기 때문에 변동사항이 있는 경우 코드를 수정하기가 더 쉬워진다. 예를 들어 예외가 되는 줄 ( 주석처리가 들어간 줄을 탐색한다. ) 라는 로직이 추가 되었을때 단계별로 짜여진 1번 코드는 파일의 내용을 변수로 담은 데이터를 주석이 없는 데이터로 변환하면 된다. 즉

//1번 코드
const content = File.read( file_name ); // 파일의 내용을 변수에 담는다.
// 이부분에서 주석을 제외 시킨 내용을 추가한다.
const except_comment_content = remove_comment( content ); // 파일의 내용을 변수에 담는다.
const lines = find_matching_lines( except_comment_content , pattern ); // 파일의 내용과 일정 패턴일치한 줄을 찾는다.
const result = truncate_lines ( lines ); // 그 줄들을 연결한다.
// 흐름이 단계별로 끊어져있어서 연결고리를 해제하는데 부담이 없다.