Five Lines of Code - 10. 코드 추가에 대한 두려움 떨쳐내기
주제: 코드 추가에 대한 두려움 극복하기
🔖 10.5 복사 및 붙여넣기가 속도에 미치는 영향
책의 내용
코드 복제에는 고려해야 할 두 가지 중요한 특성이 있습니다. 첫째, 코드를 공유하면 코드가 사용되는 모든 위치에 영향을 미치기 쉽습니다. 이것은 동작에 대한 전역적인 변경을 신속하게 할 수 있음을 의미합니다. 하지만 호출 측의 한 부분에 대해서만 동작을 변경하는 것은 간단하지 않습니다. 반면 코드를 복사해서 동작을 공유하면 각 호출이 분리되어 호출하는 측에 따라 변경하기 쉽습니다.
코드를 공유하면 전역적인 동작 변경 속도가 증가하고, 코드를 복사하면 지역적인 동작 변경 속도가 증가합니다.
나의 생각: 코드 공유와 코드 복제의 차이가 뭐지?
코드 공유의 예시
코드 공유는 하나의 코드 블록을 여러 위치에서 사용하는 것을 의미한다. 이는 DRY(Don't Repeat Yourself) 원칙을 따르는 것으로, 코드의 재사용을 극대화하여 유지보수를 용이하게 한다. 하지만, 공유된 코드를 변경할 때는 그 코드를 사용하는 모든 곳에 영향을 미치기 마련이다.
function updateInventory(item) {
// 재고 업데이트 로직
console.log(`Updating inventory for ${item}`);
}
// 다양한 장소에서 해당 함수 호출
updateInventory("Apples"); // Updating inventory for Apples
updateInventory("Oranges"); // Updating inventory for Oranges
이 예에서 updateInventory
함수는 "Apples"와 "Oranges" 두 상품의 재고를 업데이트하는 데 사용된다. 함수를 수정하면, 모든 상품의 재고 업데이트 방식이 변경된다.
코드 복제의 예시
코드 복제는 특정 코드 블록을 복사하여 서로 다른 맥락에서 사용하는 것이다. 이는 각 사본을 독립적으로 수정할 수 있게 해주어, 특정 사용 사례에 맞게 쉽게 변경할 수 있다. 하지만, 이 방법은 코드의 중복을 증가시켜 유지보수를 어렵게 만든다.
function updateInventoryApples() {
// "Apples"에 대한 재고 업데이트 로직
console.log("Updating inventory for Apples");
}
function updateInventoryOranges() {
// "Oranges"에 대한 재고 업데이트 로직
console.log("Updating inventory for Oranges");
}
// 각각의 함수는 독립적으로 호출됨
updateInventoryApples(); // Updating inventory for Apples
updateInventoryOranges(); // Updating inventory for Oranges
이 경우, "Apples"와 "Oranges" 각각을 위한 재고 업데이트 함수가 별도로 존재하므로, 하나를 변경해도 다른 하나에는 영향을 미치지 않는다. 그러나 코드가 중복되기 때문에, 비슷한 변경을 여러 함수에 반복적으로 적용해야 할 수도 있겠다.
결론
코드 공유는 유지보수를 간소화하지만, 전역적인 변경이 필요할 때 모든 관련 부분에 영향을 준다. 반면, 코드 복제는 지역적인 변경을 용이하게 하지만 유지보수를 복잡하게 만든다. 따라서, 설계할 때 어떤 방법을 선택할지는 프로젝트의 요구 사항과 유지보수의 용이성 사이에서 균형을 잘 고려해야 할 것 같다.
🔖 10.6 확장성을 통한 추가에 의한 변경
책의 내용
코드를 추가하는 또 다른 방법은 확장성을 이용하는 것입니다. 일부 코드가 변경에 수용적이어야 한다는 것을 안다면 확장 가능하게 만들 수 있습니다.
변형이 발생하는 지점은 코드를 더 복잡하게 만듭니다. 코드 흐름을 이해하는 것이 더 어렵기 때문에 나중에 수정하기가 더 어려울 수 있습니다. 따라서 모든 것을 확장 가능하게 만드는 것은 코들르 불필요하게 복잡하게 만들어 낭비입니다.
도메인에 관련되지 않은 복잡성을 '우발적 복잡성(accidental complexity)' 이라고 합니다. 코드는 실제 세계를 나타내므로 도메인으로부터 일부 복잡성이 상속됩니다. 이것을 '본질적 복잡성(essential complexity)'라고 합니다.
나의 생각
우발적 복잡성(Accidental Complexity)에 대한 이해
우발적 복잡성은 소프트웨어 개발 과정에서 발생하는, 필요하지 않은 추가적인 복잡성이다. 부수적 복잡성이라고도 한다. 이는 설계 결정이나 기술 선택, 개발 프로세스의 비효율성에서 기인할 수 있으며, 본질적으로 필요하지 않은 복잡성이다. 이를 제거하거나 최소화하는 것이 좋다.
예를 들어, 소프트웨어가 다양한 데이터베이스와의 호환을 위해 각각 다른 데이터베이스 호출 코드를 작성하는 경우, 이는 우발적 복잡성을 늘리는 일일 수 있다. 이를 인터페이스나 패턴을 사용하여 추상화함으로써 줄일 수 있다.
본질적 복잡성(Essential Complexity)에 대한 이해
본질적 복잡성은 문제 자체의 복잡성을 의미한다. 이는 해당 도메인(분야)의 기본적인 복잡성으로, 소프트웨어가 해결하고자 하는 실제 세계의 문제들이 자연스럽게 가지고 있는 복잡성이다. 이 복잡성은 피할 수 없으며, 필연적으로 소프트웨어에 반영되어야 한다.
예를 들어, 은행 시스템에서 거래를 처리하는 코드는 여러 가지 검증과 예외 처리를 포함해야 한다. 이는 금융 거래의 법적 요구사항과 안전성을 보장하기 위한 것으로, 본질적인 복잡성을 잘 보여준다.
📚 참고 자료
Last updated