티스토리 뷰

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
«   2024/05   »
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
글 보관함