Skip to content
This repository was archived by the owner on Dec 30, 2021. It is now read-only.

Chapter 05. Formatting

sujin edited this page Aug 16, 2021 · 13 revisions

2021.08.14 (SAT) 10:20-12:00 (100mins)
πŸš€ Lead by. 'Sujin'

Intro

λ°₯ μ•„μ €μ”¨μ˜ λ°”λž¨:
  - μ½”λ“œκ°€ κΉ”λ”ν•˜κ³ , 일관적이며, κΌΌκΌΌν•˜κ³ , μ§ˆμ„œ μ •μ—°ν–ˆμœΌλ©΄ μ’‹κ² λ‹€.
  - κ·Έλ ‡κ²Œ μ§°λ‹€λ©΄ μ „λ¬Έκ°€κ°€ μ§°λ‹€λŠ” 인상을 심어쀄 수 μžˆλ‹€.
  - λ°˜λŒ€λ‘œ, μ½”λ“œκ°€ μ–΄μˆ˜μ„ ν•΄ 보인닀면 ν”„λ‘œμ νŠΈλ₯Ό μ „λ°˜μ μœΌλ‘œ λ¬΄μ„±μ˜ν•œ νƒœλ„λ‘œ μž‘μ„±ν–ˆλ‹€κ³  생각할 것이닀.
  - κ·œμΉ™μ„ μ •ν•˜κ³  κ·Έ κ·œμΉ™μ„ 따라야 ν•œλ‹€.
  - κ·œμΉ™μ„ μžλ™μœΌλ‘œ μ μš©μ‹œν‚€λŠ” 도ꡬλ₯Ό ν™œμš©ν•΄λ„ μ’‹λ‹€.

ν˜•μ‹μ„ λ§žμΆ”λŠ” λͺ©μ 

  • μ½”λ“œ ν˜•μ‹μ€ μ€‘μš”ν•˜λ‹€! 맀우 μ€‘μš”ν•˜λ‹€! ⭐️
  • 'λŒμ•„κ°€λŠ” μ½”λ“œ'에 λ§Œμ‘±ν•˜λ©΄ μ•ˆλœλ‹€.
  • 였늘 κ΅¬ν˜„ν•œ κΈ°λŠ₯은 λ‹€μŒ λ²„μ „μ—μ„œ λ°”λ€” 수 μžˆλ‹€.
  • 처음 μž‘μ•„λ†“μ€ κ΅¬ν˜„ μŠ€νƒ€μΌκ³Ό 가독성 μˆ˜μ€€μ€ μœ μ§€λ³΄μˆ˜μ™€ ν™•μž₯성에 계속 영ν–₯을 λ―ΈμΉœλ‹€.

μ½”λ“œλŠ” μ‚¬λΌμ§ˆμ§€λΌλ„ 개발자의 μŠ€νƒ€μΌκ³Ό κ·œμœ¨μ€ 사라지지 μ•ŠλŠ”λ‹€!

μ μ ˆν•œ ν–‰ 길이λ₯Ό μœ μ§€ν•˜λΌ

파일의 μ„Έλ‘œ κΈΈμ΄λŠ” 짧으면 μ§§μ„μˆ˜λ‘ μ’‹λ‹€. 일반적으둜 큰 νŒŒμΌλ³΄λ‹€ μž‘μ€ 파일이 μ΄ν•΄ν•˜κΈ° 쉽닀.

μ‹ λ¬Έ κΈ°μ‚¬μ²˜λŸΌ μž‘μ„±ν•˜λΌ

  • μ½”λ“œλŠ” μœ„μ—μ„œ μ•„λž˜λ‘œ μ½νžŒλ‹€λŠ” 사싀을 κΈ°μ–΅ν•˜μž
  • 이름은 κ°„λ‹¨ν•˜λ©΄μ„œλ„ μ„€λͺ…이 κ°€λŠ₯ν•˜κ²Œ μ§“λŠ”λ‹€.
  • μ΅œμƒλ‹¨μ—λŠ” μ˜λ„λ₯Ό λ“œλŸ¬λ‚΄κ³  ν•˜λ‹¨μ—λŠ” ꡬ체적인 λ‚΄μš©μ„ λ°°μΉ˜ν•œλ‹€.

κ°œλ…μ€ 빈 ν–‰μœΌλ‘œ λΆ„λ¦¬ν•˜λΌ

  • 생각 μ‚¬μ΄μ—λŠ” 빈 행을 λ„£μ–΄ λΆ„λ¦¬ν•˜μž
  • import λ¬Έ, 각 ν•¨μˆ˜ 사이, νŒ¨ν‚€μ§€ 선언뢀에 빈 행을 λ„£λŠ”λ‹€.
  • μ΄λŠ” μƒˆλ‘œμš΄ κ°œλ…μ„ μ‹œμž‘ν•œλ‹€λŠ” μ‹œκ°μ  λ‹¨μ„œλ‹€.
import React from 'react';
import MyComponent from './MyComponent';

const App = () => {
  return <MyComponent />
};

export default App;

μ„Έλ‘œ 밀집도

  • μ€„λ°”κΏˆμ΄ κ°œλ…μ„ λΆ„λ¦¬ν•œλ‹€λ©΄ μ„Έλ‘œ λ°€μ§‘λ„λŠ” 연관성을 μ˜λ―Έν•œλ‹€.
  • μ„œλ‘œ λ°€μ ‘ν•œ μ½”λ“œλŠ” κ°€κΉŒμ΄ λ°°μΉ˜ν•œλ‹€.
  • 의미 μ—†λŠ” 주석은 μžμ œν•œλ‹€.
// BAD
// μ˜λ―Έμ—†λŠ” μ£Όμ„μœΌλ‘œ λ³€μˆ˜λ₯Ό λ–¨μ–΄λœ¨λ €μ„œ ν•œλˆˆμ— νŒŒμ•…μ΄ 잘 μ•ˆλœλ‹€.

public class ReporterConfig {
  /**
   * 리포터 λ¦¬μŠ€λ„ˆμ˜ 클래슀 이름
   */
  private String m_className;

  /**
   * 리포터 λ¦¬μŠ€λ„ˆμ˜ 속성
   */
  private List<Property> m_properties = new ArrayList<Property>();
  public void addProperty(Property property) {
      m_properties.add(property);
  }
}
// GOOD
// 의미 μ—†λŠ” 주석을 μ œκ±°ν•¨μœΌλ‘œμ¨ μ½”λ“œκ°€ ν•œλˆˆμ— λ“€μ–΄μ˜¨λ‹€.
// λ³€μˆ˜ 2κ°œμ— λ©”μ†Œλ“œκ°€ 1개인 ν΄λž˜μŠ€λΌλŠ” 사싀이 λ“œλŸ¬λ‚œλ‹€.

public class ReporterConfig {
  private String m_className;
  private List<Property> m_properties = new ArrayList<Property>();

  public void addProperty(Property property) {
    m_properties.add(property);
  }
}

수직 거리

이 ν•¨μˆ˜μ—μ„œ ν˜ΈμΆœν•˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ°ΎκΈ° μœ„ν•΄ λ―Έλ‘œκ°™μ€ μ½”λ“œλ₯Ό λ’€μ§„ κ²½ν—˜μ΄ μžˆλŠ”κ°€? 🀦
이 쑰각, μ € 쑰각이 어디에 μžˆλŠ”μ§€ μ°Ύκ³  κΈ°μ–΅ν•˜λŠ” 데에 μ‹œκ°„κ³Ό λ…Έλ ₯이 λ„ˆλ¬΄ 많이 λ“ λ‹€.

  • μ„œλ‘œ λ°€μ ‘ν•œ κ°œλ…μ€ μ„Έλ‘œλ‘œ κ°€κΉŒμ΄μ— 두며, ν•œ νŒŒμΌμ— μœ„μΉ˜ν•΄μ•Ό ν•œλ‹€.
  • λ³€μˆ˜λŠ” μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜μ™€ μ΅œλŒ€ν•œ κ°€κΉŒμ΄ μ„ μ–Έν•œλ‹€.

1. λ³€μˆ˜μ„ μ–Έ

  • λ³€μˆ˜λŠ” μ‚¬μš©ν•˜λŠ” μœ„μΉ˜μ— μ΅œλŒ€ν•œ κ°€κΉŒμ΄ μ„ μ–Έν•œλ‹€.

    const confirmName = () => {
      const name = getName();
    
      if (name === 'test') {
        return false;
      }
      return name;
    }
  • μ§€μ—­λ³€μˆ˜λŠ” ν•¨μˆ˜ 맨 처음, 블둝 상단, 루프 직전에 μ„ μ–Έν•œλ‹€.

  • 루프λ₯Ό μ œμ–΄ν•˜λŠ” λ³€μˆ˜λŠ” 루프문 내뢀에 ν”νžˆ μ„ μ–Έν•œλ‹€.

    const list = [1, 2, 4, 3, 5];
    let sum = 0;
    
    for (let num of list) {
      sum += num;
    }
    const hashIt = (data) => {
      let hash = 0;
      const length = data.length; // μ§€μ—­ λ³€μˆ˜ μ„ μ–Έ
    
      for (let i = 0; i < length; i++) {
        const char = data.charCodeAt(i);
        hash = ((hash << 5) - hash) + char;
        hash &= hash;
      }
    }

2. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” μœ„μΉ˜λŠ” λ…ΌμŸμ΄ λΆ„λΆ„ν•˜λ‹€.
  • μžλ°”λŠ” 클래슀 맨 μ²˜μŒμ— μ„ μ–Έν•˜μ§€λ§Œ C++은 λ§ˆμ§€λ§‰μ— μ„ μ–Έ(κ°€μœ„ κ·œμΉ™)ν•œλ‹€.
  • μ–΄λŠ μͺ½μ΄λ“  상관 μ—†μœΌλ‚˜ 잘 μ•Œλ €μ§„ μœ„μΉ˜μ— μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό λͺ¨μ•„μ•Ό ν•œλ‹€.

3. 쒅속 ν•¨μˆ˜

A ν•¨μˆ˜μ™€ B ν•¨μˆ˜κ°€ μžˆλ‹€κ³  ν•˜μž:
  A ν•¨μˆ˜κ°€ B ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€λ©΄:
    - A ν•¨μˆ˜λ₯Ό λ¨Όμ € λ°°μΉ˜ν•œλ‹€.
    - A, B ν•¨μˆ˜λŠ” μ„œλ‘œ κ°€κΉŒμš΄ μœ„μΉ˜μ— μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

---
κ²°κ³Ό: ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ°ΎκΈ° μ‰¬μ›Œμ§€λ©°, 가독성도 λ†’μ•„μ§„λ‹€.

---
졜근 동ν–₯: ν•¨μˆ˜λŠ” μ •μ˜λ˜λŠ” μ‹œμ μ΄ μ•„λ‹ˆλΌ ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— λ™μž‘ν•˜λ©° ν˜Έμ΄μŠ€νŒ…μ΄ μ§€μ›λ˜κΈ° λ•Œλ¬Έμ—
         Aν•¨μˆ˜λ₯Ό λ¨Όμ € 쓰냐 B ν•¨μˆ˜λ₯Ό λ¨Όμ € μ“°λƒλŠ” 차이가 μ—†μŠ΅λ‹ˆλ‹€.  
         ν˜ΈμΆœμ‹œμ κ³Ό μ •μ˜ μ‹œμ μ΄ λΆ„λ¦¬λ˜μ„œ μˆœμ„œλŠ” 상관 μ—†μœΌλ‹ˆ μžμ—°μŠ€λŸ½κ²Œ 읽어 λ‚΄λ €κ°€λŠ” λ°©ν–₯으둜 κΈ°μž¬ν•œλ‹€.
let todos = [];

const deleteTodo = (e) => {
  const deleteButton = e.target;
  const item = deleteButton.parentNode;
  const cleanTodo = todos.filter((todo) => todo.id !== item.id);
  saveTodos();
}

const saveTodos = () => {
  localStorage.setItem(todoItem, JSON.stringify(todos));
}

const loadTodos = () => {
  const loadedTodos = localStorage.getItem(todoItem);
}

const init = () => {
  loadTodos();
  todoForm.addEventListener('submit', handleSubmit);
}

init();

4. κ°œλ…μ  μœ μ‚¬μ„±

κ°œλ…μ μΈ μΉœν™”λ„κ°€ λ†’μ„μˆ˜λ‘ μ½”λ“œλ₯Ό κ°€κΉŒμ΄ λ°°μΉ˜ν•œλ‹€.

μΉœν™”λ„κ°€ 높은 μš”μΈ:
  - 직접적인 쒅속성 (ν•œ ν•¨μˆ˜κ°€ λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 호좜)
  - λ³€μˆ˜μ™€ κ·Έ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜
  - λΉ„μŠ·ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜
class BankAccount {
  alias;
  numberCode;
  balance;

  constructor({ alias = "λ³„μΉ­μ—†μŒ", numberCode, balance }) {
    this.alias = alias;
    this.numberCode = numberCode;
    this.balance = balance;
  }

  get basicInfo() {
    return `${this.alias}: ${this.numberCode} / ν˜„μž¬ μž”μ•‘: ${this.balance.toLocaleString("ko-KR")} 원`;
  }
}

const dataFromAPI = {
  alias: "γ…Œγ…… κ³„μ’Œ",
  numberCode: "5353-825-82825",
  balance: 5126500
};

const myBankAccount = new BankAccount(dataFromAPI);
console.log(`[INFO] myBankAccount.alias > ${myBankAccount.alias}`);
console.log(`[INFO] myBankAccount.numberCode > ${myBankAccount.numberCode}`);
console.log(`[INFO] myBankAccount.balance > ${myBankAccount.balance}`);
// [INFO] myBankAccount.alias > γ…Œγ…… κ³„μ’Œ
// [INFO] myBankAccount.numberCode > 5353-825-82825
// [INFO] myBankAccount.balance > 5126500
console.log(`[INFO] myBankAccount.basicInfo > ${myBankAccount.basicInfo}`);
// [INFO] myBankAccount.basicInfo > γ…Œγ…… κ³„μ’Œ: 5353-825-82825 / ν˜„μž¬ μž”μ•‘: 5,126,500 원

5. μ„Έλ‘œ μˆœμ„œ

  • ν•¨μˆ˜ 호좜 쒅속성은 μ•„λž˜λ°©ν–₯을 μœ μ§€ν•œλ‹€.
  • ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ³΄λ‹€ 뒀에 λ°°μΉ˜ν•œλ‹€.
    • μ†ŒμŠ€μ½”λ“œλŠ” μžμ—°μŠ€λŸ½κ²Œ 고차원 -> μ €μ°¨μ›μœΌλ‘œ λ‚΄λ €κ°„λ‹€.
    • μ€‘μš” κ°œλ…μ€ κ°€μž₯ λ¨Όμ €, μ„Έμ„Έν•œ 사항은 λ§ˆμ§€λ§‰μ—!

κ°€λ‘œ ν˜•μ‹ λ§žμΆ”κΈ°

Q. ν•œ 행은 κ°€λ‘œλ‘œ μ–Όλ§ˆλ‚˜ κΈΈμ–΄μ•Ό μ λ‹Ήν• κΉŒ?

A. λŒ€λ‹€μˆ˜μ˜ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ λͺ…λ°±νžˆ 짧은 행을 μ„ ν˜Έν•˜λ―€λ‘œ 짧은 행이 λ°”λžŒμ§ν•˜λ‹€.
일반적인 ν”„λ‘œκ·Έλž¨μ—μ„œ 평균적인 κ°€λ‘œν–‰μ˜ κΈΈμ΄λŠ” λŒ€λž΅ 20-60자 사이
더 길어도 상관없닀 μš”μ¦˜ μ Šμ€ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ λͺ¨λ‹ˆν„°λ„ 크고 λˆˆλ„ μ’‹μ•„μ„œ 200μžλ„ κ°€λŠ₯
ν•„μž κ°œμΈμ μœΌλ‘œλŠ” 120자 μ •λ„λ‘œ 길이λ₯Ό μ œν•œν•œλ‹€.

κ°€λ‘œ 곡백과 밀집도

κ°€λ‘œλ‘œλŠ” 곡백을 μ‚¬μš©ν•΄ λ°€μ ‘ν•œ κ°œλ…κ³Ό λŠμŠ¨ν•œ κ°œλ…μ„ ν‘œν˜„ν•œλ‹€.

// ν• λ‹Ή μ—°μ‚°μž 쒌우둜 곡백을 쀌 => μ™Όμͺ½, 였λ₯Έμͺ½ μš”μ†Œκ°€ ν™•μ‹€ν•˜κ²Œ ꡬ뢄됨  
const totalQuantity = items
  // ν•¨μˆ˜ 이름과 κ΄„ν˜Έ μ‚¬μ΄μ—λŠ” 곡백을 λ„£μ§€ μ•ŠμŒ => ν•¨μˆ˜μ™€ 인수의 밀접함을 λ³΄μ—¬μ€Œ
  .filter((item) => item.limitQuantity === null)
  // κ΄„ν˜Έ μ•ˆμ˜ μΈμˆ˜λΌλ¦¬λŠ” μ‰Όν‘œ λ’€μ˜ 곡백을 톡해 μΈμˆ˜κ°€ λ³„κ°œλΌλŠ” 사싀을 λ³΄μ—¬μ€Œ
  .reduce((acc, val) => acc + val.quantity, 0);
  • μ—°μ‚°μž μš°μ„ μˆœμœ„λ₯Ό κ°•μ‘°ν•˜κΈ° μœ„ν•΄μ„œλ„ 곡백을 μ‚¬μš©ν•œλ‹€. return b*b - 4*a*c;

  • ν•˜μ§€λ§Œ.. Code Formatterλ“±μ˜ 도ꡬ가 μ—°μ‚°μž μš°μ„ μˆœμœ„κΉŒμ§€ κ³ λ €ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ
    곡백을 μž„μ˜λ‘œ 넣어주더라도 μ‚¬λΌμ§€λŠ” κ²½μš°κ°€ λŒ€λΆ€λΆ„.

    Q. κ·Έλ ‡λ‹€λ©΄ κ΄„ν˜Έλ‘œ λ¬Άμ–΄μ£ΌλŠ” 것이 더 λ°”λžŒμ§ν•˜μ§€ μ•Šμ„κΉŒ? πŸ€”

κ°€λ‘œ μ •λ ¬

  • 이런 정렬은 μ½”λ“œκ°€ μ—‰λš±ν•œ 뢀뢄을 κ°•μ‘°ν•΄ μ˜λ„κ°€ κ°€λ €μ§ˆ 수 μžˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, λ³€μˆ˜ μœ ν˜•μ„ λ¬΄μ‹œν•˜κ³  λ³€μˆ˜μ΄λ¦„λΆ€ν„° 읽을 수 μžˆλ‹€.
  • κ²Œλ‹€κ°€ Code Formatter λŒ€λΆ€λΆ„λ“€μ€ μ΄λ ‡κ²Œ ν•΄λ†”λ΄€μž λ¬΄μ‹œν•˜κ³  μ›λž˜λŒ€λ‘œ λŒλ €λ†“λŠ”λ‹€.
  • κ·ΈλŸ¬λ―€λ‘œ μ„ μ–Έλ¬Έκ³Ό 할당문을 λ³„λ„λ‘œ μ •λ ¬ν•  ν•„μš”κ°€ μ—†λ‹€.
// BAD
public class FitNessExpenditer implements ResponseSender {
  private Socket          socket;
  private InputStream     input;
  private FitNesseContext context;

  public FitNEsseExpenditer(Socket s, FitNesseContext context) throws Exception {
    this.context = context;
    socket       = s;
    input        = s.getInputStream();
  }
}
// GOOD
public class FitNessExpenditer implements ResponseSender {
  private Socket socket;
  private InputStream input;
  private FitNesseContext context;

  public FitNEsseExpenditer(Socket s, FitNesseContext context) throws Exception {
    this.context = context;
    socket = s;
    input = s.getInputStream();
  }
}

λ“€μ—¬μ“°κΈ°

  • λ“€μ—¬μ“°κΈ°ν•œ νŒŒμΌμ€ ꡬ쑰가 ν•œλˆˆμ— λ“€μ–΄μ˜¨λ‹€.
  • ν•˜μ§€λ§Œ λ“€μ—¬μ“°κΈ°λ₯Ό ν•˜μ§€ μ•Šμ€ 일λͺ… μŠ€νŒŒκ²Œν‹° μ½”λ“œλŠ” μ—΄μ‹¬νžˆ λΆ„μ„ν•˜μ§€ μ•ŠλŠ” ν•œ μ΄ν•΄ν•˜κΈ°κ°€ νž˜λ“€λ‹€.
// BAD
public class CommentWidget extends TextWidget {
  public static final String REGEXP = "^#[^\r\n]*(?:(?:\r\n)|\n|\r)?";

  public CommentWidget(ParentWidget parent, String text){super(parent, text);}
  public String render() throws Exception {return ""; }
}
// GOOD
// 가독성을 μœ„ν•΄ ν•œμ€„μ΄λΌλ„ μ •μ„±μŠ€λŸ½κ²Œ λ“€μ—¬μ“°κΈ°λ‘œ κ°μ‹Έμ£Όμž.

public class CommentWidget extends TextWidget {
  public static final String REGEXP = "^#[^\r\n]*(?:(?:\r\n)|\n|\r)?";

  public CommentWidget(ParentWidget parent, String text){
    super(parent, text);
  }

  public String render() throws Exception {
    return "";
  }
}

κ°€μ§œ λ²”μœ„

빈 whileλ¬Έμ΄λ‚˜ for문을 μ ‘ν•  λ•Œκ°€ μžˆλ‹€.
κ°€λŠ₯ν•œν•œ ν”Όν•΄μ•Ό λ˜μ§€λ§Œ, ν”Όν•˜μ§€ λͺ» ν•  κ²½μš°μ—” 빈 블둝을 μ˜¬λ°”λ‘œ λ“€μ—¬μ“°κ³  κ΄„ν˜Έλ‘œ 감싼닀.
κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 찾을 수 μ—†λŠ” 버그가 λ°œμƒν• μ§€λ„..

빈 λΈ”λ‘μ˜ 반볡문의 경우 잘 보이지 μ•ŠμœΌλ―€λ‘œ, ;(μ„Έλ―Έμ½œλ‘ )의 κ²½μš°μ—λŠ” μƒˆν–‰μ— μ μ–΄μ„œ λˆˆμ— λ„κ²Œ ν•΄μ£Όμž!

while(dis.read(buf, 0, readBufferSize) != -1)
;

νŒ€ κ·œμΉ™

νŒ€μ— μ†ν•΄μžˆλ‹€λ©΄, νŒ€ κ·œμΉ™μ„ κ°€μž₯ μš°μ„ μ‹œ ν•˜κ³  μ„ ν˜Έν•΄μ•Ό ν•œλ‹€.

처음 νŒ€μ΄ 이루어 μ‘Œλ‹€λ©΄,
코딩을 μ‹œμž‘ν•˜κΈ° μ „, μ½”λ”© μŠ€νƒ€μΌμ„ μ˜λ…Ό(κ΄„ν˜Έλ₯Ό 어디에 넣을지, 넀이밍은 μ–΄λ–»κ²Œ ν• μ§€ λ“±)ν•˜μ—¬
IDE Fomatter둜 μ§€μ •ν•˜μ—¬ κ΅¬ν˜„ν•˜λŠ” 것이 μ˜³μ€ 방식이닀.

쒋은 μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ€ 읽기 μ‰¬μš΄ λ¬Έμ„œλ‘œ 이루어진닀.
μŠ€νƒ€μΌμ€ 일관적이고 λ§€λ„λŸ¬μ›Œμ•Ό ν•œλ‹€.
μ˜¨κ°– μŠ€νƒ€μΌμ„ μ„žμ–΄ μ½”λ“œλ₯Ό ν•„μš” μ΄μƒμœΌλ‘œ λ³΅μž‘ν•˜κ²Œ λ§Œλ“€μ§€ 말자.

Suite-up

πŸ“” Prerequisites

πŸ“” How to use

Artifacts

πŸ“Œ Clean Code

πŸ“Œ Meaningful Names + Extra

πŸ“Œ Functions

πŸ“Œ Comments

πŸ“Œ Formatting

πŸ“Œ Objects and Data Structures

Remains

ongoing! πŸ€

πŸ“Œ Error Handling

πŸ“Œ Boundaries

πŸ“Œ Unit Tests

πŸ“Œ Classes

πŸ“Œ Systems

πŸ“Œ Emergence

up-to-here! πŸš€

🧷 Concurrency

🧷 Successive Refinement

🧷 JUnit Internals

🧷 Refactoring SerialDate

Clone this wiki locally