본문 바로가기

BackEnd

[SW공학] 통신 응집도와 해결방안

반응형

Communicational cohesion occurs when parts of a module are grouped together because they use the same set of inputs and outputs. If a module has different elements that have been grouped together because they access and modify the same data structure, it would demonstrate communicational cohesion. For example, a data structure that represents the contents of a customer’s shopping basket might be used by a variety of elements in a single module. The elements might calculate discounts, shipping, and taxes based on the same data structure. This level of cohesion is moderate and usually considered acceptable 1.

To remove communicational cohesion, you can follow these steps:

  1. Separate functionality into modules: If a module has multiple functionalities, it can be difficult to modify and maintain. By separating functionalities into different modules, you can reduce the scope of changes required for each modification.
  2. Use a common data format: If multiple modules need to access the same data, it is important to use a common data format. This can help reduce the complexity of data exchange between modules.
  3. Use a messaging system: A messaging system can be used to decouple modules that need to communicate with each other. This can help reduce the dependency between modules and improve the overall flexibility of the system.

Here is an example of how to remove communicational cohesion:

 
 
모듈(클래스)의 여러 메서드가 동일한 입력 및 출력 데이터(주로 필드)를 사용할 때 발생한다.
즉, 하나의 필드를 여러 메서드가 공유하며 수정하기 때문이다.
그렇기에 하나의 필드에 대해 수정하고 삭제하는 로직을 여기저기에 놓게 된다.
예를 들어 장바구니를 장바구니 객체 배열로 만들면, 삽입수정삭제에서 해당 배열을 조작하게 된다.
 
해당 문제를 해결하는 방법은 다음과 같다.
 
  1. 기능을 모듈로 분리: 모듈에 여러 기능이 있는 경우 유지보수성이 떨어진다. 기능을 여러 모듈로 분리한다.
  2. 공통 데이터 포맷 사용: 모듈 간 데이터 공유 복잡성을 줄인다.
  3. 메시징 시스템을 사용 : 모듈 간의 종속성을 줄이고 시스템의 전반적인 유연성을 향상시키는 데 도움이 될 수 있다.

통신적 결합도 제거 코드

장바구니 배열 자체를 객체로 변경하면 된다.

위 문단에서 설명한 방법 중 1, 2를 적용한다.

public class ShoppingCart {
    private List<Item> items;

    public ShoppingCart() {
        items = new ArrayList<>();
    }

    public void addItem(Item item) {
        items.add(item);
    }

    public void removeItem(Item item) {
        items.remove(item);
    }

    public List<Item> getItems() {
        return items;
    }
}

public class DiscountCalculator {
    public double calculateDiscount(ShoppingCart cart) {
        // Calculate discount based on cart items
    }
}

public class ShippingCalculator {
    public double calculateShipping(ShoppingCart cart) {
        // Calculate shipping cost based on cart items
    }
}

public class TaxCalculator {
    public double calculateTax(ShoppingCart cart) {
        // Calculate tax based on cart items
    }
}
ShoppingCart는 고객의 장바구니 내용을 나타내는 모듈이다.
할인 계산기, 배송 계산기, 세금 계산기는 장바구니 내용을 기준으로 할인, 배송비, 세금을 계산하는 모듈이다.
이처럼, 공통 데이터 포맷(예: ShoppingCart)을 사용하면 이러한 모듈이 긴밀하게 결합되지 않고도 서로 통신할 수 있다.
반응형