coding-philosophylisted
Install: claude install-skill gagip/gagip-dev
# 코딩 철학 가이드라인
개인 코딩 철학. 코드 리뷰·설계 검토 시 이 기준으로 가독성·정확성·구조를 평가한다.
**언어와 프레임워크에 무관하게 적용되는 원칙**이며, 코드 예시는 의사코드(pseudocode)로 표기한다.
특정 언어의 문법을 강요하지 않는다 — 대상 레포에 이미 관례가 있으면 그 관례로 이 원칙을 구현한다.
의사코드의 `assert`는 **릴리즈에서도 항상 활성화된 검증 수단**을 의미한다. 언어마다 대응 수단이
다르다(인자 검사·상태 검사 내장 함수, 프로젝트 전용 검증 유틸 등). 디버그 전용으로 비활성화되는
수단은 원칙적으로 쓰지 않는다.
---
## 1. 계약 프로그래밍 (Contract Programming)
사전조건·불변식·사후조건을 코드로 명시한다.
| 종류 | 용도 | 실패 시 |
|------|------|---------|
| 사전조건 (Precondition) | 함수 진입 전 인자 유효성 검사 — 호출자가 잘못된 값을 전달했음을 즉시 알린다 | 인자 오류 예외 / assertion 실패 |
| 불변식 (Invariant) | 메서드 호출 전 객체 상태 유효성 검사 | 상태 오류 예외 / assertion 실패 |
| 사후조건 (Postcondition) | 함수 실행 후 반환값·상태가 약속된 범위임을 검증한다 | assertion 실패 |
| 내부 가정 검증 | 개발/디버그용 중간 검증 — 필요 시 사용 | assertion 실패 |
```
// 사전조건 — 인자 검사
function setAge(age):
assert age >= 0 and age <= 150, "age must be in 0..150, was {age}"
...
// 불변식 — 상태 검사
function save():
assert isConnected, "DB connection must be established before save()"
...
// 사후조건 — 반환값 검사
function average(values):
result = sum(values) / len(values)
assert result >= min(values) and result <= max(values), "result out of range: {result}"
return result
// 잘못된 예 — 잘못된 입력을 조용히 보정
function setAge(age):
age = clamp(age, 0, 150) // 잘못된 입력을 숨김
...
```
**검증 수단은 대상 레포의 관례를 따른다.** 프로젝트가 전용 검증 유틸을 정해뒀다면 그것을 쓰고,
언어 내장 수단을 쓰기로 했다면 그것을 쓴다. 한 레포 안에서 수단이 섞이는 것 자체가 결함이다.
**비대칭이 곧 결함이다.** 같은 인터페이스의 구현체들, 같은 모듈의 동급 함수들 중 **하나만**
검증이 빠져 있다면 그것은 취향 차이가 아니라 결함이다. 나머지가 검증한다는 사실이 그 검증이
필요하다는 증거다.