클린 코드(Clean Code)는 구조와 일관성을 통해 읽기, 유지 관리(maintain), 이해 및 변경이 쉽지만 성능 요구 사항을 견딜 수 있을 만큼 강력하고 안전하게 유지되는 코드입니다. 이를 통해 소프트웨어의 가치를 극대화할 수 있습니다.
클린 코드 원리와 베스트 프렉티스
고품질(high quailty), 신뢰성(reliable), 유지 관리(maintainable) 및 보안(secure)을 갖춘 소프트웨어를 제공하려면 기본 코드가 강력해야 합니다. 코딩의 베스트 프렉티스에 따르면 조직은 비즈니스 목표에 필요한 민첩성, 속도 및 개발 규모를 달성할 수 있습니다.
일관성(Consistent)
코드는 일관성을 유지하고 공통 스타일을 따라야 합니다. 이는 시간이 지나도록 다른 사람들이 작업한 모든 코드가 비슷한 모습을 가져야 하며, 확립된 패턴을 준수해야 한다는 것을 의미합니다. 이 일관성은 특정 코드베이스 내에서만 적용되는 것이 아니라 이상적으로는 전체 프로그래밍 언어 생태계에 걸쳐 적용되어야 합니다.
코드 일관성은 서로 다른 시간에 여러명의 개발자가 개발을 하더라도 유사해 보이고, 규칙적인 패턴을 따르는 것을 말합니다. 일관된 코드는 형식화(formatted)되고 규칙적(conventional)이며 식별가능(identifiable)합니다.
예를 들면 코드의 형식이 잘 지정되어 있으면, 체계적이고, 규칙적이므로 개발자가의 코딩 스타일 차이가 줄어들고, Pull Request 시, 동료의 코드 검토가 빨라집니다.
- 형식화(Formatted) :
- 코드는 잘 구성, 체계적, 표준화되어야 합니다. 간격(Spacing), 들여쓰기, 문자 배치 등 일관되게 유지되어 작성자 간의 통일성을 유지해야 합니다.
잘못된 코드Non-compliant code:class Foo { public int a; public int b; public void doSomething() { if(something) { doSomethingElse(); } } }
잘된 코드Compliant code:class Foo { public int a; public int b; public void doSomething() { if(something) { doSomethingElse(); } } }
참조 - https://sonarsource.github.io/rspec/#/rspec/S1120/java
- 코드는 잘 구성, 체계적, 표준화되어야 합니다. 간격(Spacing), 들여쓰기, 문자 배치 등 일관되게 유지되어 작성자 간의 통일성을 유지해야 합니다.
- 규칙화(Conventional) :
- 코드는 관용적이며 문법 컨벤션에 따라 작성되어야 합니다. 예를 들어 현대의 C++에서 typedef 보다는 using을 사용하는 것을 선호합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S5416/cfamily
- 코드는 관용적이며 문법 컨벤션에 따라 작성되어야 합니다. 예를 들어 현대의 C++에서 typedef 보다는 using을 사용하는 것을 선호합니다.
- 식별가능(Identifiable) :
- 이름은 언어적인 컨벤션 기반의 구조화되어야 합니다. 식별자에는 대/소문자 구분, 접미사, 접두사 등 차이점 없이 사용되어야 합니다.
잘못된 코드Non-compliant code:class my_class {...} class SOMEName {...}
잘된 코드Compliant code:class MyClass {...} class SomeName {...}
참조 - https://sonarsource.github.io/rspec/#/rspec/S101/csharp
- 이름은 언어적인 컨벤션 기반의 구조화되어야 합니다. 식별자에는 대/소문자 구분, 접미사, 접두사 등 차이점 없이 사용되어야 합니다.
의도성(Intentional)
코드는 명확(clear)하고 정밀(precise), 목적(purposeful)을 가지고 있습니다. 의도된 코드는 목적을 전달하기 위해 작성되고 의미가 있고 적절히 구성되어 심플하게 동작을 전달합니다.
예를 들어, 명확한 코드는 설명이 필요 없으며 해당 기능을 투명하게 전달하므로 프로그램을 더 쉽게 이해할 수 있고 버그 발생 가능성이 줄어듭니다.
- 명확함(Clear):
- 코드는 모호함 없이 자신의 기능을 잘 설명할 수 있게 직관적으로 작성되어야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S1481/python
- 코드는 모호함 없이 자신의 기능을 잘 설명할 수 있게 직관적으로 작성되어야 합니다.
- 논리적(Logical):
- 코드는 잘 구성되어 명시적인 오류, 모순, 예견할 수 없는 명령이 없어야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S2688/javascript
- 코드는 잘 구성되어 명시적인 오류, 모순, 예견할 수 없는 명령이 없어야 합니다.
- 완성(Complete):
- 코드는 이해하기 쉽게 구축되어 암시된 목표를 달성할 수 있어야 합니다. 불완전하거나 부족한 솔루션은 배제되어야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S2092/php
- 코드는 이해하기 쉽게 구축되어 암시된 목표를 달성할 수 있어야 합니다. 불완전하거나 부족한 솔루션은 배제되어야 합니다.
- 효율적(Efficient):
- 코드는 리소스 낭비가 없어야 합니다. 메모리, 프로세서, 디스크, 네트워크 리소스의 불필요한 소비를 방지해야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S6587/docker
- 코드는 리소스 낭비가 없어야 합니다. 메모리, 프로세서, 디스크, 네트워크 리소스의 불필요한 소비를 방지해야 합니다.
적응성(Adaptable)
코드는 췹고 신뢰할 수 있게 구조화되어 확장하거나 용도를 변경할 수 있으며, 변경 시, 부작용(Side Effects)이 없어야 합니다. 적응형 코드는 집중적(focused)이고 규율적(distinct)이며 모듈화(modular)되고 테스트(test)되어야 합니다.
예를 들어, 코드가 모듈화되어 있으면, 코드가 구성 및 분산되어 관리가 더 쉽고 내부 관계를 명확하게 정의할 수 있습니다 .
- 집중형(Focused):
- 코드는 단일, 좁은, 특정 범위를 가져야 합니다. 각 유닛은 복잡하지 않고 하나의 간결한 목적을 가져야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S1192/ruby
- 코드는 단일, 좁은, 특정 범위를 가져야 합니다. 각 유닛은 복잡하지 않고 하나의 간결한 목적을 가져야 합니다.
- 구별성(Distinct):
- 코드 절차(prucedures)와 데이터(data)는 중복없이 고유해야 합니다. 코드베이스는 반복없이 공유가능한 세그멘트로 분해되어야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S1996/swift
- 코드 절차(prucedures)와 데이터(data)는 중복없이 고유해야 합니다. 코드베이스는 반복없이 공유가능한 세그멘트로 분해되어야 합니다.
- 모듈형(Modular):
- 코드는 부분간의 분리를 강조하기 위해 구성되고 배포되어야 합니다. 코드 간의 관계는 관리되고 최소화하여 명확한 정의를 확인할 수 있어야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S2357/vbnet
- 코드는 부분간의 분리를 강조하기 위해 구성되고 배포되어야 합니다. 코드 간의 관계는 관리되고 최소화하여 명확한 정의를 확인할 수 있어야 합니다.
- 테스트(Tested):
- 코드는 기능 신뢰성을 제공하기 위해 자동화된 품질 테스트를 가집니다. 구현이 변경되면 충분한 테스트 커버리지를 가져야 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S2187/
- 코드는 기능 신뢰성을 제공하기 위해 자동화된 품질 테스트를 가집니다. 구현이 변경되면 충분한 테스트 커버리지를 가져야 합니다.
책임감(Responsible)
코드는 데이터에 대한 윤리적 의무와 사회적 규범의 잠재적 영향을 고려합니다. 책임감 있는 코드는 합법적이며, 신뢰할 수 있고, 존중받아야 합니다.
예를 들어, 우리가 코드를 합법적이라고 분류할 때, 이는 코드가 라이선싱 및 저작권 규정을 존중하며, 창작자가 자신의 코드를 라이선스 할 수 있게 하고, 다른 사람의 라이선싱 권리를 존중한다는 것을 의미합니다. 마찬가지로 중요한 것은, 코드는 신뢰할 수 있어야 하며, 비밀을 포함하고 있지 않아야 합니다.
- 합법적(Lawful):
- 코드는 라이선싱 및 저작권 규정을 존중합니다. 이는 창작자의 권리를 행사하고 다른 사람이 자신의 코드에 라이센스를 부여할 권리를 존중합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S2068/go
- 코드는 라이선싱 및 저작권 규정을 존중합니다. 이는 창작자의 권리를 행사하고 다른 사람이 자신의 코드에 라이센스를 부여할 권리를 존중합니다.
- 신뢰적(Trustworthy):
- 코드는 개인 정보를 공개하거나 하드 코딩하는 것을 지양합니다. 이는 자격 증명 및 개인 식별 정보와 같은 민감한 개인 정보를 보존합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/S1451/
- 코드는 개인 정보를 공개하거나 하드 코딩하는 것을 지양합니다. 이는 자격 증명 및 개인 식별 정보와 같은 민감한 개인 정보를 보존합니다.
- 존중하는(Respectful):
- 코드는 차별적이고 모욕적인 언어를 사용하는 것을 삼가합니다. 동일한 의미를 전달하는 대안이 존재할 때마다 포괄적인 용어를 우선 시 합니다.
참조 - https://sonarsource.github.io/rspec/#/rspec/?query=naming%20convention
- 코드는 차별적이고 모욕적인 언어를 사용하는 것을 삼가합니다. 동일한 의미를 전달하는 대안이 존재할 때마다 포괄적인 용어를 우선 시 합니다.