Skip to main content

Command Palette

Search for a command to run...

Ch05 더 좋은 액션 만들기

Published
2 min readView as Markdown

액션은 필요하다. 모든 액션을 없앨 수는 없다.

액션에서 암묵적 입/출력을 줄여 설계를 개선하자

암묵적 입력과 출력은 적을수록 좋다

계산 뿐만 아니라, 액션에서도

  • 어떤 함수에 암묵적 입/출력이 있다면 다른 컴포넌트와 강하게 연결된 컴포넌트

  • 다른 곳에서 사용할 수 없기 때문에 모듈이 아님

암묵적 입/출력 줄이는 방법

  • 전역/공용 변수를 직접 사용하는 대신 인자를 전달

  • 중복, 불필요한 코드 있는지 확인

  • 과한 코드는 다른 함수 안으로 옮기기

계산 분류하기

의미 있는 계층별로 계산 분류

  • 장바구니 코드

    • cart에 대한 동작

    • item에 대한 동작

    • 비즈니스 규칙: 일반적인 전자상거래 서비스와는 다른 이 서비스만의 특별한 규칙

엉켜있는 코드 풀기

설계는 엉켜있는 코드를 푸는 것

  • 함수를 사용하면 관심사를 자연스럽게 분리할 수 있음

  • 분리된 것은 언제든 쉽게 조합할 수 있음

addItem()을 분리해 더 좋은 설계 만들기

기존코드
  • 간단해 보이지만 4가지 역할을 하고 있음

  • cart와 item 구조를 모두 알고 있음

function addItem(cart, name, price) {
  // 1. 배열 복사
  const newCart = cart.slice();
  // 2. item 객체 생성
  // 3. 복사본에 item 추가
  newCart.push({ name, price });
  // 4. 복사본 리턴
  return newCart;
}
item에 관한 코드를 별도 함수로 분리
  • makeCartItem: item 구조만 알고 있는 함수

  • addItem: cart 구조만 알고 있는 함수

  • 👉 cart, item을 독립적으로 확장할 수 있음

function makeCartItem(name, price) {
  return { name, price };
}

function addItem(cart, item) {
  const newCart = cart.slice();
  newCart.push(item);
  return newCart;
}
copy-on-write 패턴 빼내기
  • addItem은 크기가 작고 괜찮은 함수이지만

  • copy-on-write를 사용해 배열에 항목을 추가하는 함수이므로, 이 부분을 분리

  • 어떤 배열/항목에도 쓸 수 있는 유틸리티 함수로 분리

// `copy-on-write` 분리
function addElementLast(array, elem) {
  const newArray = array.slice();
  newArray.push(elem);
  return newArray;
}

function makeCartItem(name, price) {
  return { name, price };
}

function addItem(cart, item) {
  return addElementLast(cart, item);
}
계산 분류 다시하기
  • 장바구니 코드

    • cart에 대한 동작

    • item에 대한 동작

    • 비즈니스 규칙

    • 배열 유틸리티 👈 새로 추가됨

More from this blog

Kimi Agentic Slides + Nano Banana로 4살 아들 맞춤 동화 만들기

Kimi Agentic Slides 지난주 금요일 (11. 28.) Kimi에서 Agentic Slide를 런칭하면서, 48시간 무제한 슬라이드 생성 이벤트를 진행했다. Nano Banana Pro가 워낙 강렬해서 이건 또 뭐가 다른지 써보고 있는 와중에, 아들이 옆방에서 징징대는 소리가 들렸고, 이걸로 동화책을 만들어봐도 되겠다는 생각이 뇌리를 스쳤다. 아들이 워낙 자동차를 좋아하고, 요즘 육아 이슈가 사회성을 길러주는 거라, 처음엔 사회성...

Dec 1, 20252 min read29
Kimi Agentic Slides + Nano Banana로 4살 아들 맞춤 동화 만들기

[발번역] Deno에 package.json 지원을 추가한 이유

원문: Why We Added package.json Support to Deno 내맘대로 세줄 요약 Node.js package.json 구린거 맞음. 이거에 대한 생각 여전함 근데 HTTP URL 쓰다보니 더 복잡하고 지저분해진 것도 맞음 이것저것 해보다가 뭐 어쩔수없이 이번에 package.json 지원하긴 했는데, 앞으로 deno: URL 지원할 거임. 기대해보셈 Deno 최신 버전 (v1.31, https://deno.com...

Mar 21, 20235 min read199

Wii-World

28 posts