티스토리 뷰
728x90
결합도
코드를 구현할 때 고려해야 할 또 다른 중요한 특성으로 결합도가 있다.
응집도는 클래스, 패키지, 메서드 등의 동작이 얼마나 관련되어 있는가인 반면
결합도는 한 기능이 다른 클래스에 얼마나 의존하고 있는지를 가늠한다. 결합도는 클래스를 구현하는데 얼마나 다른 클래스를 참조했는가로 말할 수 있다. 많은 클래스를 참조하고 있다면 기능을 변경할 때 그만큼 유연성이 떨어진다.
결합도는 코드가 서로 어떻게 의존하는지와 관련이 있는 척도다.
예제에서 BankStatementAnalyzer는 BankStatementCSVParser 클래스에 의존한다.
그럼 어떻게 결합도를 낮출 수 있을까?
인터페이스를 이용하면된다. 인터페이스를 이용하면 요구사항이 바뀌더라도 유연성을 유지할 수 있다.
입출금 내역을 파싱하는 인터페이스 정의
public interface BankStatementParser {
BankTransaction parseFrom(String line);
List<BankTransaction> parseLinesFrom(List<String> lines);
}
BankStatementCSVParser는 인터페이스를 구현
public class BankStatementCSVParser implements BankStatementParser {
...
}
여기서 이제 중요한데 BankStatementAnalyzer에서 특정 구현체로 받는것이 아니라 인터페이스로 받는 것이다.
public class BankStatementAnalyzer {
private static final String RESOURCES = "src/main/resources/";
public void analyze(final String fileName, final BankStatementParser bankStatementParser) throws IOException {
final Path path = Paths.get(RESOURCES + fileName);
final List<String> lines = Files.readAllLines(path);
final List<BankTransaction> bankTransactions = bankStatementParser.parseLinesFrom(lines);
final BankStatementProcessor bankStatementProcessor = new BankStatementProcessor(bankTransactions);
collectSummary(bankStatementProcessor);
}
private static void collectSummary(final BankStatementProcessor bankStatementProcessor) {
System.out.println("The total for all transactions is "
+ bankStatementProcessor.calculateTotalAmount());
System.out.println("The total for transactions in January is "
+ bankStatementProcessor.calculateTotalInMonth(Month.JANUARY));
System.out.println("The total for transactions in February is "
+ bankStatementProcessor.calculateTotalInMonth(Month.FEBRUARY));
System.out.println("The total salary received is "
+ bankStatementProcessor.calculateTotalForCategory("Salary"));
}
}
특정 구현체에 종속되지 않도록 개선된걸 확인하는게 엄청 중요하다.
메인 응용 프로그램에서 지금까지 구현한 코드를 사용
public class MainApplication {
public static void main(String[] args) throws Exception {
final BankStatementAnalyzer bankStatementAnalyzer
= new BankStatementAnalyzer();
final BankStatementParser bankStatementParser
= new BankStatementCSVParser();
bankStatementAnalyzer.analyze("bank-data-simple.csv", bankStatementParser);
}
}
보통 코드를 구현할 때는 결합도를 낮추고 응집도를 높이라고 한다. 이는 코드의 다양한 컴포넌트가 내부와 세부 구현에 의존하지 않아야 함을 의미한다. 높은 결합도는 무조건 피해야 한다.
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Linux
- Kotlin
- Spring
- svn
- elasticsearch
- LocalDate
- config-location
- Bash tab
- input
- 북리뷰
- docker
- maven
- Mac
- oracle
- mybatis
- Spring Security
- LocalDateTime
- 베리 심플
- localtime
- intellij
- mybatis config
- Github Status
- jQuery
- k8s
- JavaScript
- rocky
- springboot
- window
- 오라클
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함