클린 코드 Assignment #05 [3장. 함수]

Ellie·2022년 4월 27일
0

클린코드

목록 보기
5/11

오늘은 앞장에 비해 꽤 분량이 많다. 게다가 내용이 어려울 것 같은 "함수" 파트이기 때문에 이해를 잘하기 위해 읽으면서 정리를 하려고 한다. 그럼 바로 시작~~!

TIL (Today I Learned)

2022.04.26 ~ 2022.04.27

오늘 읽은 범위

3장. 함수 (40p ~ 65p)

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

  • 어떤 프로그램이든 가장 기본적인 단위가 함수다.(40p)

    • 함수의 중요성을 잘 나타낸 문장이다. 함수만 잘 다룰 줄 알아도 기본은 한다고 말할 수 있을 것 같다.

  • 좋은 함수를 만드는 규칙

    1. 작게 만들어라!
    함수를 만드는 첫째 규칙은 '작게'다. 함수를 만드는 둘째 규칙은 '더 작게!'다.

    함수는 짧을 수록 좋으며 심지어 3줄 4줄 정도면 충분하다고 말한다.
    예를 들어 if문 / else문 / while문 등에 들어가는 블록은 한 줄이어야 한다. 여기에서 if문 안의 if문 등 중첩 구조가 생길만큼 커져서는 안된다. 또한 함수에서 들여쓰기 수준은 1단이난 2단을 넘어서는 안된다. (오호...그렇구나...)

    2. 한 가지만 해라!
    함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.

    문제는 그 '한 가지'가 무엇인지 잘 모른다는 점인데, 지정된 함수 이름 아래 추상화 수준이 하나면 된다고 한다. 그런데 이렇게 말해도 100% 이해했다고 말하기는 어려운 것 같다... 추상화는 참... 단어 그대로 너무 추상적이다ㅜㅜ

    함수가 한가지 일만 하는지 판단하는 방법이 하나 더 있는데, 어떤 함수에서 의미있는 이름으로 다른 함수를 추출할 수 없어야 한다고 말한다. 정말 어떤 함수를 더 뽑아낼 수도 없을 정도로 정말 코어만 적은 함수여야 할테다...

    또한 한 가지 작업만 하는 함수는 자연스럽게 섹션을 나누기 어렵다. 하나의 함수에서 섹션을 나누지 말 것!

    3. 서술적인 이름을 사용하라!
    한 가지만 하는 작은 함수에 좋은 이름을 붙인다면 이런 원칙을 달성함에 있어 이미 절반은 성공했다.

    이름을 붙일 때는 일관성이 있어야 한다.

    4. 함수 인수는 가급적 쓰지 마라!
    함수에서 이상적인 인수 개수는 0개다. 4개 이상은 특별한 이유가 필요하다. 특별한 이유가 있어도 사용하면 안 된다.

    플래그 인수
    참이면 이걸 하고 거짓이면 저걸한다고 공표하는 플래그 인수는 끔찍하다.

    동사와 키워드
    단항 함수는 함수와 인수가 동사/명사 쌍을 이뤄야 한다.

    동사와 키워드 함수 예시)
    writeField(name), assertExpectedEqualsActual(expected, equal)

    5. 부수 효과를 일으키지 마라
    부수효과는 거짓말이다. 함수에서 한 가지를 하겠다고 약속하고선 남몰래 다른 짓도 하니까.

    6. 명령과 조회를 분리하라
    함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다. 객체 상태를 변경하거나 객체 정보를 반환하거나 둘 중 하나다.

    7. 오류 코드보다 예외를 사용하라
    명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.

    try - catch 구문 잘 이용하기
    그런데 이 구문을 별도의 함수로 뽑아낸다.

    8. 반복하지 마라
    어쩌면 중복은 소프트웨어에서 모든 악의 근원이다.

함수를 어떻게 짜죠?

  • 소프트웨어를 짜는 행위는 여느 글짓기와 비슷하다. 먼저 생각나는대로 작성하는 후 읽기 좋게 다듬는다.

결론

  • 함수는 그 언어에서 동사며, 클래스는 명사다.
  • 하지만 진짜 목표는 시스템이라는 이야기를 풀어가는 데 있다는 사실을 명심하기 바란다.


궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

p47.
switch문

  • 불행하게도 switch문을 완전히 피할 방법은 없다. 하지만 각 switch문을 저차원 클래스에 숨기고 절대로 반복하지 않는 방법은 있다.

이 부분이 잘 이해되지 않는다. 자바 언어로 설명해서 그런건가? 자바스크립트의 경우에 전역 스코프에서는 접근할 수 없도록 private스코프로 감싸야 한다는 것과 일맥상통하는 건가?

자바 언어를 잘 모르다보니 뒤의 파생 클래스의 인스턴스를 생성하며 다형성으로 인해 실제 파생 클래스의 함수가 실행된다는 말이 이해가 안된다... 클로져와 컨텍스트의 차원에서 이해하면 되는 걸까?

p56.
출력인수

출력인수는 객체 지향 프로그래밍이 나오고 나서 사용할 필요가 없는 문법이라고 한다.

profile
정말로 아는 것인지 항상 의심하기

0개의 댓글