코딩관계론

코드 추상화 본문

Clean code

코드 추상화

개발자_티모 2023. 5. 15. 02:17
반응형

[추상화를 하는 이유]

추상화는 코드 품질의 핵심 4요소를 달성하는 데 도움을 줍니다.

  1. 가독성: 추상화는 코드베이스에 있는 모든 세부 사항을 이해하는 것을 불가능하게 만들지만, 몇 가지 높은 수준의 추상화를 이해하고 사용하는 것은 비교적 쉽습니다. 따라서 코드의 가독성이 크게 향상됩니다.
  2. 모듈화: 추상화 계층을 사용하면 하위 문제에 대한 해결책을 깔끔하게 분리하고 구현 세부 사항을 외부로 노출하지 않도록 할 수 있습니다. 이를 통해 다른 계층이나 코드의 일부에 영향을 미치지 않고도 계층 내에서만 구현을 변경하는 것이 매우 쉬워집니다.
  3. 재사용성 및 일반화성: 추상화 계층을 통해 하위 문제에 대한 해결책이 간결하게 제시되면 해당 해결책을 재사용하기 쉬워집니다. 또한, 문제를 적절하게 추상화하여 하위 문제로 세분화하면 해결책은 여러 다른 상황에서 유용하게 일반화될 수 있습니다.
  4. 테스트 용이성: 코드가 추상화 계층으로 깔끔하게 분할되면 각 하위 문제에 대한 해결책을 테스트하는 것이 훨씬 쉬워집니다. 추상화 계층을 통해 코드를 작은 단위로 분리하고 이를 독립적으로 테스트할 수 있으므로 테스트 용이성이 크게 향상됩니다.

[추상화 하는 방법]

추상화는 복잡한 시스템을 단순화하고 관리 가능한 수준으로 분할하는 과정입니다. 이를 위해 추상화 계층을 생성하는 방법은 코드를 서로 다른 단위로 분할하여 단위 간의 의존 관계를 보여주는 의존성 그래프를 생성하는 것입니다. 이를 통해 시스템의 기능과 구성 요소를 분리하고, 각각의 역할과 책임을 명확히 할 수 있습니다.
 
대부분의 언어에서는 다른 단위로 나누기 위해 몇 가지 언어 요소를 자유롭게 사용할 수 있습니다. 예를 들면 함수와 클래스를 활용하여 추상화 계층을 구성할 수 있습니다.
 

함수

함수는 특정 작업을 수행하는 코드의 논리적인 단위이다. 함수를 작성할 때는 주로 다음과 같은 원칙을 따르는 것이 좋습니다.

  1. 하나의 함수는 하나의 기능 또는 작업을 수행하도록 제한한다. 이렇게 하면 코드를 이해하기 쉽고 유지보수하기 쉬워집니다.
  2. 함수의 이름은 해당 함수가 수행하는 작업을 명확하게 나타내도록 지어야 합니다.
  3. 함수 내부의 코드는 최대한 간결하고 읽기 쉽게 작성해야 합니다.

함수를 작성한 후에는 작성된 코드를 문장으로 표현해 볼 수 있다. 예를 들면 "차량 소유자의 주소를 찾아보고, 만약 발견됐다면 그 주소로 편지를 보내라"와 같은 문장으로 함수의 역할과 동작을 명확히 이해할 수 있습니다.
 
클래스
클래스는 관련된 데이터와 함수의 집합으로, 객체 지향 프로그래밍에서 주요한 추상화 단위입니다. 클래스를 사용하여 비슷한 특징과 동작을 가진 객체들을 묶을 수 있습니다.

클래스를 설계할 때는 다음과 같은 원칙을 고려하는 것이 좋습니다.

  1. 클래스는 단일 책임 원칙을 따라야 한다. 즉, 클래스는 하나의 주요 기능을 가지고 있어야 하며, 여러 가지 역할을 동시에 수행하지 않도록 해야 합니다.
  2. 클래스의 이름은 해당 클래스가 나타내는 개념을 명확하게 표현해야 합니다.
  3. 클래스 내부의 속성과 메서드는 클래스의 책임과 관련이 있어야 합니다

인터페이스
인터페이스는 클래스나 모듈이 외부와 상호 작용하기 위해 제공하는 계약입니다. 인터페이스는 클래스가 어떤 메서드를 제공하고 어떤 매개변수와 반환 값을 가지는지를 정의합니다. 클래스가 특정 인터페이스를 구현한다는 것은 해당 클래스가 인터페이스에서 정의한 메서드를 모두 구현하고 제공한다는 의미입니다.

  1. 코드의 재사용성을 높인다: 인터페이스를 구현하는 클래스들은 동일한 인터페이스 메서드를 사용하므로, 다른 클래스로 교체하더라도 호환성을 유지할 수 있습니다.
  2. 다형성을 구현한다: 인터페이스를 사용하면 여러 클래스를 하나의 인터페이스 타입으로 다룰 수 있다. 이를 통해 동일한 인터페이스를 구현하는 다양한 객체들을 일관성 있게 처리할 수 있습니다.
  3. 결합도를 낮춘다: 인터페이스를 통해 클래스 간의 의존성을 최소화하고, 클래스 간의 결합도를 낮출 수 있다. 이는 유지보수성과 테스트 용이성을 향상시킵니다.

인터페이스는 일종의 계약으로서, 클래스가 특정 인터페이스를 구현한다면 해당 인터페이스에서 정의한 메서드를 반드시 구현해야 한다. 이를 통해 인터페이스를 통해 정의된 기능을 일관성 있게 사용할 수 있습니다.
 

 
[얇은 계층 vs 비대한 계층]

얇은 계층과 비대한 계층은 코드의 구성 방식에 대한 두 가지 접근법을 나타냅니다.
 
얇은 계층은 코드를 여러 얇은 계층으로 분할하는 방법을 말합니다. 각 계층은 특정 기능이나 책임을 수행하며, 계층 간의 의존성은 최소화됩니다. 이렇게 구성된 얇은 계층은 코드의 응집력을 높이고, 각 계층이 명확한 역할을 가지도록 한다. 이는 코드의 가독성과 유지보수성을 향상시킵니다. 또한, 특정 계층의 변경이 다른 계층에 미치는 영향을 제한할 수 있어 시스템의 유연성을 높일 수 있습니다.
 
반면, 비대한 계층은 코드를 하나의 큰 계층으로 구성하는 방식을 의미합니다. 모든 기능과 책임이 한 곳에 모이기 때문에 코드가 복잡해질 수 있습니다. 이는 코드의 가독성을 떨어뜨리고, 유지보수를 어렵게 만든다. 또한, 변경이 필요한 부분을 식별하고 수정하기 위해 전체 코드를 이해해야 할 수도 있습니다.
 
얇은 계층은 기능을 더 작은 단위로 분할하여 코드를 구성하는 반면, 비대한 계층은 모든 기능을 하나의 단위로 유지하는 경향이 있습니다. 얇은 계층은 코드의 추상화 수준을 높이고, 코드를 더 이해하기 쉽게 만듭니다. 반면, 비대한 계층은 코드의 복잡성을 증가시킬 수 있으며, 코드를 이해하기 어렵게 만듭니다.
 
따라서, 코드를 잘 구성하기 위해서는 갈결한 추상화 계층을 만드는 것이 중요합니다. 적절한 수준의 추상화를 통해 코드를 얇은 계층으로 분할하고, 각 계층이 명확한 역할과 책임을 가지도록 설계해야 합니다. 이는 코드의 가독성, 유지보수성, 확장성을 향상시키며, 전체 시스템의 품질을 향상시킬 수 있습니다.
 

반응형

'Clean code' 카테고리의 다른 글

오류  (0) 2023.05.20
코드 계약  (0) 2023.05.18
파이썬 데코레이터(Decorator)  (0) 2023.02.26
[Clean code] 클래스  (0) 2023.01.11
[Clean code] 형식 맞추기  (0) 2023.01.09