hyperskill - Coupling and cohesion 영어 원문
Coupling (연결) 과 Cohesion (응집력) 이라고 불리는 두 가지 용어가 있습니다.
이러한 개념들은 당신의 코드를 더 이해하는 데 도움을 주며,
당신의 행동의 코드에 어떻게 영향을 미치는지 이해하도록 돕습니다.
이 용어들은 클래스 내부의 관계와 클래스 내부의 관계를 정의합니다.
They define relations between and within classes. - between 과 within이 클래스 단락의 설명을 의미.
이것들을 아는 것은 당신의 코드에 있어 더 나은 구조를 생성하는 데 도움을 줄 수 있으며,
더 유연하고, 목적에 맞게 만들 수 있습니다.
이제 이것들을 배우러 가 봅시다.
coupling(커플링 - 연결) 부터 시작하겠습니다.
더 나은 이해를 위해 커플링, 코헤션 으로 부르겠습니다.
Coupling - 연결
커플링 은 소프트웨어 컴포넌트가 또다른 컴포넌트에 의지하고 있는 정도를 의미합니다.
커플링 (연결) 에는 두 가지 기본 레벨이 있습니다. : 긴밀한, 느슨한
느슨한 커플링은 클래스 간의 적은 상호 의존성을 의미합니다.
반면에, 긴밀한 커플링은 그 반대입니다.
차이점은 긴밀한 커플링은 하나의 클래스가 또 다른 클래스에 강하게 의존하는 것이고,
해당되는 또다른 클래스에 대한 메서드들을 너무 많이 알고 있다는 겁니다.
하지만, 느슨한 커플링 은 하나의 클래스가 또 다른 클레스 내부의 객체 생성과 메서드에 대해서 조금만 알고 있다는 겁니다.
이러한 것이 클래스들이 각자 서로 적은 상호 의존성을 가지게 만듭니다.
느슨한 커플링 - 느슨한 연결성을 가지는 구조가 좋다고 보면 됩니다.
연결을 느슨하게 하는 가장 간단한 방식은 당신의 코드에 인터페이스를 구현하는 것입니다.
또한 다른 방식으로 연결을 느슨하게 하는 방식들이 있는데, 바로 의존성 주입입니다. (dependency injection)
Tight coupling example - 긴밀한 연결 예제
당신은 로봇을 만들고 있습니다.
이 로봇의 중심 부분은 쉽게 변경 될 수 없는 엔진입니다.
당신은 로봇을 해체하고 당신의 새로운 엔진을 사용하기 위해 비틀려고 합니다.
이 로봇에 대해 단단하게 연결된 의존성을, 당신은 이렇게 묘사 할 수 있습니다 :
class Engine is
method run() is
class Robot is
Engine eng = new Engine()
eng.run()
여기, Robot
클래스는 Engine
에 의존하고 있으며, 엔진의 인스턴스를 생성해야 합니다.
당신의 의존 클래스는 메서드들에 대한 것을 너무 많이 알고 있는데, 이 경우엔 너무 긴밀하게 연결되었습니다.
Engine
에서의 어떠한 변화도 Robot
클래스에게도 변화를 강요 할 겁니다.
그러므로, 엔진이 작동되지 않는다면, 전체 로봇이 기능을 멈출 겁니다.
Loose coupling example
느슨한 연결에 대한 예제를 봅시다.
여기, 당신은 기본적인 point scheme 를 지닌 로봇을 만들고 있습니다.
이 paint scheme 실버거나, 골드일 수 있습니다.
어느 쪽이던, 당신은 로봇을 처음부터 바꿔야 합니다.
이는 느슨하게 연결된 의존성입니다.
interface Paint is
method paint()
class Silver implements Paint is
method paint() is
print("silver")
class Gold implements Paint is
method paint() is
print("gold")
class Robot is
Paint col = new Gold()
col.paint()
paint 클래스들은 Paint
인터페이스를 통해 Robot
클래스로 노출됩니다.
이 경우, 당신은 인터페이스를 통해 paint 클래스 메서드들을 주입 할 수 있습니다.
이는 당신의 Robot
클래스가 Silver
, Gold
클래스 메서드들에 대한 것을 조금 알고있다는 의미입니다.
또한 Robot
클래스는 이들을 개별적으로 사용 할 수 있습니다.
이는 Silver
or Gold
한 쪽이 작동하지 않더라도 또다른 클래스를 사용 할 수 있다는 것을 의미합니다.
Cohesion - 응집력, 응집도
cohesion 은 클래스 함수들의 표현입니다.
클래스가 할 수 있는 것이 많아지면, 클래스의 cohesion (응집력) 이 적어집니다.
예를 들어, 당신이 로봇을 만드는 공장을 표현하는 어플리케이션을 작업하고 있을 때,
당신은 RobotFactory
라고 불리는 단일 클래스를 만들 수 있습니다.
이 클래스는 로봇 생성, 공장 물류, 스태프 관리, 등등에 대한 메서드들을 담고 있습니다.
class RobotFactory is
method createRobots() is ...
method maintainLogistics() is ...
method manage() is ...
밑의 예시는 낮은 cohesion 에 대한 예제인데,
단일 클래스가 서로 다른 목표를 많이 가지고 있을 때 입니다.
이를 재사용하기는 어려우며, 클래스를 테스트하기도 어렵습니다.
하지만, 만약 당신이 서로 다른 목적을 가진 메서드들을 서로 다른 클래스들로 분배하려고 한다면,
당신은 클래스의 응집력을 증가시킬 수 있습니다.
class BuildDepart is
method createRobots() is
...
class Logistics is
method maintainLogistics() is
...
class Management is
method manage() is
...
Working with cohesion and coupling - 응집력과 연결성 동시에 고려하기
Low Coupling | High Coupling | |
---|---|---|
Low Cohesion | Destructive decoupling | Poorly selected boundaries |
High Cohesion | Ideal | God Object |
이상적으로는, 당신의 객체들은 낮은 연결성과 높은 응집력을 가져야 합니다.
또 다른 상황에서, 당신은 아마도 단일 책임 원칙 과 같은 몇 가지 기본적인 디자인 원칙들을 게을리 할 겁니다.
또한 이상적인 상태, 즉, 낮은 연결성과 높은 응집력을 성취하려고 시도하는 동안,
또다른 원칙들에 대한 것을 완벽히 잊어먹을 수 있는 상황들이 있습니다.
이로 인해, 다음과 같은 상황이 이끌어질 수 있습니다 :
1. god object 만들기
하나의 객체가 모든 기능들을 수행하는 god object 를 만들려고 함
높은 응집도, 높은 연결성
2. 잘못 선택된 경계
코드의 파편들이 경계들을 가지고 있지만,
이러한 경계에 포함되지 않는 클래스들까지 포함시키는 경우
낮은 응집도, 높은 연결성
이 경우는 쓸데없는 객체를 자신에 포함시킨 경우를 의미하는 것 같다.
3. 파괴적인 디커플링
코드의 부분들이 가장 낮은 연결성을 가지고 있지만,
이는 코드가 관심사에 집중되지 못합니다.
당신이 낮은 커플링(연결성)을 시도할 때,
응집도를 증가시키는 것과 그 반대의 경우에 대해서도 잊지 말아야 합니다.
Conclusion - 결론
우리가 커플링과 코헤션에 대해서 배운 것들을 요약 해 봅시다.
Coupling - 연결성
당신은 느슨한 커플링을 성취하려고 시도했습니다.
느슨한 커플링(연결성)은 코드의 일부가 다른 일부와 더 적은 상호작용을 하도록 만듭니다.
이를 이룰 수 있는 가장 쉬운 방식은 인터페이스를 사용하고 의존성 주입을 사용하는 겁니다.
Cohesion - 응집력, 응집도
당신의 코드의 일부분이 높은 응집력을 가져야 하므로, 해당 코드는 관심사에 더 집중될 수 있습니다.
이는 당신의 코드를 좀 더 재사용적이고, 테스트에 용이하도록 만들어 줄 겁니다.
이상적으로, 당신은 가장 높은 응집도와 가장 낮은 연결성 수준을 유지하려고 시도해야 합니다.
이는 당신의 코드를 좀 더 가독성 좋고 접근성 좋도록 만들어 줄 겁니다.
words to remember
coupling : 연결, 연결기, 장치
cohesion : 응집력, 결합 단결
interdependence : 상호 의존
whereas : 반면, 이므로, ~에 반하여
deconstruct : 해체하다
tweak : 비틀기, 동요, 잡아당기기, 비틀다
depict : 묘사하다, 서술하다
scheme : 계획, 도식, 계획하다, 모사하다, 계획을 세우다
circumstances : 상황, 환경, 사정
neglect : 소홀히 하다, 태만, 굴리다, 게을리하다, 의무 따위를 게을리하다
fragments : 파편, 부서진 조각
boundaries : 경계, 경계선, 한계
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introduction to Docker' 카테고리의 다른 글
Processes and Threads - 프로세스와 쓰레드 (0) | 2024.07.14 |
---|---|
Synchronous, asynchronous, parallel - 동기, 비동기, 병렬 (0) | 2024.07.12 |
Code organization. Design principles - 디자인 원칙과 코드 정리 (0) | 2024.07.10 |
YAML - YAML 문법과 사용법 (0) | 2024.07.09 |
Interfaces - 인터페이스 (0) | 2024.07.03 |