Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
TIL 3장. 함수
#clean_code
2년 전
512

오늘 TIL 3줄 요약

  • 함수를 만들 때 최대한 작게 만들어라

  • 함수는 한 가지를 해야하며, 한 가지를 잘해야 하고, 한 가지만 해야 한다.

  • 코드를 읽으면서 짐작했던 기능이 각 루틴대로 수행되도록 함수를 잘 나타내는 이름을 사용하라

TIL (Today I Learned) 날짜

2022. 04. 28

오늘 읽은 범위

3장. 깨끗한 코드

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

한 가지만 해라!

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

이것은 소프트웨어 개발에서 가장 중요한 규칙이다. 함수가 한 가지 이상을 수행할 때 구성, 테스트 및 추론이 어려워진다. 함수를 하나의 작업으로 분리할 수 있으면, 쉽게 리팩토링할 수 있고 코드가 훨씬 더 깔끔하게 읽힌다.

지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 하는 것이다. 다른 방법으로는 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 것이다.

서술적인 이름을 사용하라!

코드를 읽으면서 짐작했던 기능이 각 루틴이 그대로 수행한다면 깨끗한 코드로 불러도 되겠다.

함수가 작고 단순할수록 서술적인 이름을 고르기도 쉬워진다. 이름이 길어도 괜찮다. 길고 서술적인 이름이 짧고 어려운 이름보다 좋다. 함수 이름을 정할 때는 여러 단어가 쉽게 읽히는 명명법을 사용해서 짓고, 함수 기능을 잘 표현하는 이름을 선택한다.

서술적인 이름을 사용하면 개발자 머릿속에서도 설계가 뚜렷해지므로 코드를 개선하기 쉬워진다! 이름을 붙일 때는 일관성이 있어야 한다는 것을 잊지말자.

사이드 이펙트를 피하라

자바스크립트에서는 변경할 수 없는 값(immuatable)과 변경할 수 있는 값(mutable)이 있다. 객체나 배열의 경우, 가변값이기 때문에 함수에 파라미터로 전달할 때는 신중하게 취급하는 것이 중요하다. 자바스크립트 함수는 객체의 속성을 변경하거나 배열의 내용을 변경하는 등, 다른 곳에서 버그를 일으키기 쉽다.

또, 단순 요소들은 값에 의해 전달되고, 객체나 배열은 참조에 의해 전달된다. 한 함수가 구매할 상품을 담는 것으로 쇼핑 카트 배열을 변화시킨다고 예를 들어 생각해보자. 그러면 이 cart (쇼핑 카트) 배열에 의존하는 다른 함수들도 추가적으로 영향을 받게 될 것이다. 좋을 수도 있지만, 나쁠 수도 있다.

다음 상황을 한 번 상상해보자:

사용자가 네트워크 요청을 생성하고 카트 어레이를 서버로 보내는 구매 기능을 호출하는 버튼인 ‘구매'를 클릭한다. 네트워크 접속 불량으로 인해 구매 기능은 요청을 계속 재시도 하려고 한다. 그 사이에 사용자가 실제로 원하지 않는 상품의 “카트에 담기" 버튼을 클릭하면 어떻게 될까? 이 경우 네트워크 요청이 시작되면 addItemToCart 함수가 불필요한 아이템을 추가하여 변경한 쇼핑카트 배열을 참조하기 때문에 실수로 추가된 아이템이 해당 구매 함수에 의해 전송된다.

addItemCart 함수에 대한 최고의 해결책은 항상 카트를 복사한 후에 수정하고 복사본을 반환하는 것이다. 이것은 다른 함수들이 쇼핑 카트 참조에 의해 영향을 받아 변하는 것을 방지해준다.

이 접근에 대해 언급해야 할 두 가지 주의 사항:

  1. 실제로 입력 객체를 수정하고 싶은 경우도 있지만, 클린 코드 규칙을 따라가다보면 그러한 경우는 매우 드물 것이다. 대부분의 코드들은 사이드 이펙트가 부작용이 없도록 리팩토링 할 수 있다. (순수 함수)

  2. 큰 객체를 복사하는 것은 성능적으로 비용이 많이 들 수 있다. 다행히 이러한 프로그래밍 접근 방식은 객체나 배열을 수동으로 복제할 때처럼 메모리를 많이 사용하지 않고, 빠르게 실행할 수 있는 훌륭한 라이브러리가 있기 때문에 실제로 큰 문제가 되지 않는다.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

자바스크립트를 사용한 프로그래밍을 하다보면 정말 많은 함수를 만나고, 만나게 된다. 정말 중요한 파트였다고 생각한다. 내가 생각한 좋은 함수를 요약하자면 다음과 같다.

이름을 통해 함수의 기능을 유추할 수 있고, 작아서 한 가지 기능만하며, 인자는 2개 이하로 가지고 반복되지 않는 함수

작업을 하다보면 이러한 함수만으로 앱을 구현하기에는 벅차다고 느낄때가 있다. 조금 더 노력해보자!

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

  • 조건을 피하라는 부분이 이해가 잘되지 않는다. 이게 정말 가능한 일일까?

  • iterator와 generator에 대해 조금 알게 되었는데, 잘 이해가 가지 않는다.