2 원칙 프로그래밍의 가이드라인 - ChoDragon9/posts GitHub Wiki

뒤로가기

2. 원칙: 프로그래밍의 가이드라인

2.1 KISS(Keep It Simple, Stupid / Keep It Short and Simple)

오컴의 면도날 : 어떤 사항을 설명하는 데 필요 이상으로 많은 전제를 가정해서는 안된다는 사고방식

코드를 작성할 때는 최우선 가치를 단순성과 간결성에 둔다. 복잡한 코드는 읽기 어렵고 수정하기 어려워진다. 프로그래밍 중에도 코드가 동작할 수 있는 가장 간단한 방법은 무엇인지 항상 질문을 던져야 한다.

복잡함으로 향하는 상황

  1. 새롭게 배운 기술을 사용하고 싶다
  2. 장래의 필요에 대비하고 싶다
  3. 멋대로 요구사항을 추가한다

2.2 DRY(Don't Repeat Yourself)

똑같은 코드가 여러 군데 있으면 모든 곳을 정확하게 수정하지 않는 이상 전체적으로 정합성을 보장할 수 없다. 코드 로직은 함수화, 모듈화하고, 데이터라면 이름을 붙여 상수를 정의한다.

디자인 패턴은 같은 문제에 관해 몇 번씩 반복해서 해결책을 생각하는 사고의 중복이 일어나지 않게 하는 기법이라고도 할 수 있다.

2.3 YAGNI(You Aren't Going to Need it)

확장성을 고려해서 넣은 설계라도 예상은 대부분 빗나간다. 빗나간다는 것은 거기에 들인 시간이 쓸모없어진다는 뜻이다. 범용성보다는 단순성을 생각하자. 범용성이 가져다주는 재사용성이나 확작성도 좋지만, 그 보다는 우선 사용할 수 있는 데 가치를 두자.

2.4 PIE(Program Intently and Expressively)

코드를 작성할 때는 의도를 명확하게 표현해야 한다. 소프트웨어의 동작을 파악하려면 코드를 읽는 수밖에 없다. 따라서 이해하기 쉬운 코드를 작성해서 코드로 의도를 표현해야 한다.

주석 없어도 읽을 수 있을 법한 이해하기 쉬운 코드를 작성하는 것이 이상적이다. 다만 코드는 언제까지나 '무엇을 하는지'와 '어떻게 하는지'밖에 표현하지 못한다. 즉 '어째서 그것을 하는지'를 표현하려면 주석을 사용할 필요가 있다.

2.5 SLAP(Single Level of Abstraction Principle)

코드를 작성할 때 높은 수준의 추상화 개념과 낮은 수준의 추상화 개념을 분리하도록 한다. 추상화 단계는 상하가 아니라 기능의 복잡도에 따라 여러 계층으로 분리한다. 결과적으로 추상화 수준을 일치시킨 코드는 훌륭한 책과 같다. 최고 수준부터 중간 수준의 처리가 책의 '목차'가 되고 최저 수준의 처리가 책의 '본문 내용'이 된다.

function 고수준() { 중수준1(); 중수준2(); } // 수준1의 목차
function 중수준1() { 저수준1(); 저수준2(); } // 수준2의 목자-1
function 저수준1() { // } //
function 저수준2() { // }
function 중수준2() { 저수준3(); }
function 저수준3() { // }

2.6 OCP(Open Closed Principle)

코드는 확장에 대해서 열려 있고 수정에 대해서 닫혀 있는 2가지 속성을 동시에 충족하도록 설계한다. 확장에 대해서 열려 있다는 말은 코드의 동작을 확장할 수 있나는 의미다. 수정에 대해서 닫쳐 있다는 말은 코드의 동작을 확장하더라도 그 밖의 코드는 전혀 영향을 받지 않는다는 의미다. 코드가 이런 2가지 속성을 동시에 충족한다면 기존 코드에 전혀 영향을 주지 않고도 기능을 확장할 수 있다.

2.7 명명이 중요하다(Naming is important)

적절한 이름을 붙일 수 있었다는 것은 해당 요소가 바르게 이해되고 바르게 설계되어 있다는 뜻이다. 반대로 어울리지 않는 이름을 붙여졌다는 것은 해당 요소가 달성해야 할 역할에 대해 프로그래머 자신이 충분히 이해하지 못했다는 뜻이다.

이름은 코드를 통해 프로그래머끼리 의사소통을 이루어지므로 이름이 적절하지 않으면 코드상의 대화는 성립하지 않는다.

효과적인 이름 작성

  • 이름이 효과와 목적을 설명하도록 한다.
  • 이름은 발음 가능한 것으로 한다.
  • 이름은 검색 가능하도록 붙인다.

루프백 확인

명명에는 '이름 가역성'이라는 개념이 있다. 이는 '이름이란 명명의 기반이 된 내용의 설명문을 복원할 수 있어야 한다'는 명명 방침이다. 이 방침을 충족하려면 루프백 확인을 수행해야 한다. 내용의 설명문으로부터 이름을 떠올렸다면 이번에는 반대로 이름을 추측할 수 있는 설명문을 생각해 보는 것이다. 설명->이름->설명의 순으로 한 바퀴 돌아서 원래로 돌아왔을 때(루프백) 설명이 일치하면 좋은 이름이고, 일치하지 않으면 주의가 필요하다.