May 18, 2018 - coupling_(stamp coupling)

결합도 (coupling)

스템프결합 (stamp coupling or data-structured coupling)

유사 약결합

stamp coupling은 사용되거나 사용되지 않을 수있는 필드를 포함하는 데이터 구조를 사용하여 매개 변수로 데이터가 전달 될 때 모듈간에 발생합니다.

이렇게 되면 모듈간의 인터페이스를 단순 화 시킴

단점은 인공적인 데이터 구조의 생성을 촉진합니다 (즉, 관련이없는 데이터 요소를 한 묶음으로 묶음). 이 번들링은 모듈 간의 결합을 줄이기위한 것이지만 사실 모듈 사이의 결합을 증가시킵니다. 함께 번들로 묶인 데이터가 의미 있고 관련이있는 한 데이터 구조가 적절합니다.


package com.github.sejoung.reactive.test;

public class Data {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}



package com.github.sejoung.reactive.test;

public class StampCode {

    public static void printAge(Data data){
        System.out.println(data.getAge());
    }

    public static void printName(Data data){
        System.out.println(data.getName());
    }
}


package com.github.sejoung.reactive.test;

public class StampTest {

    public static void main(String[] args) {
        Data data = new Data();
        data.setAge(1);
        data.setName("zolla");
        StampCode.printAge(data);
        StampCode.printName(data);
    }
}


위에 printAge 와 printName 은 스템프 Data 로 스템프 결합이 일어난다.

저기서 값은 age와 data만 사용하지 않으니 메소드를 아래처럼 바꿔도 된다. 그렇게 되면 더이상 스템프 결합은 일어나지 않는다.

하지만 소프트웨어는 변하지 않는것은 없기 때문에 값을 무조건 하나만 사용한다고 가정할수가 있는지에 대한 반문이 존재한다.


package com.github.sejoung.reactive.test;

public class StampCode {

    public static void printAge(int age){
        System.out.println(age);
    }

    public static void printName(String name){
        System.out.println(name);
    }
}

May 16, 2018 - coupling_(control coupling)

결합도 (coupling)

제어결합 (control coupling)

보통결합 - 편의상 사용시작

모듈의 내부 논리 (예 : 플래그 및 스위치)에 영향을주는 데이터가 전달 될 때 모듈간에 제어 결합이 발생합니다

계층 구조에 전달 된 제어 플래그는 호출 프로그램이 호출 된 프로그램의 내부에 대해 알도록 요구합니다 (호출 된 프로그램은 블랙 박스가 아닙니다).

상위 계층으로 넘어온 제어 플래그는 하위 모듈이 상위 모듈의 제어 흐름에 영향을 미치도록합니다 (하위 모듈은 제어하지 않는 모듈에 영향을줍니다).


package com.github.sejoung.reactive.test;

public class Control {

    private String run1(){
        return "A";
    }


    private String run2(){
        return "B";
    }

    private String run3(){
        return "C";
    }

    public String process(int flag) throws Exception {
        switch (flag){
            case 1: return this.run1();
            case 2: return this.run2();
            case 3: return this.run2();
            default: throw new Exception("invalid param");
        }
    }
}


package com.github.sejoung.reactive.test;

public class GoControl {

    private Control control;
    public GoControl(Control control){
        this.control = control;
    }

    public String gogo() throws Exception {
        return this.control.process(1);
    }

    public String gogosing() throws Exception {
        return this.control.process(2);
    }
}


package com.github.sejoung.reactive.test;

public class ControlTest {
    public static void main(String[] args) throws Exception {
        GoControl go = new GoControl(new Control());
        System.out.println(go.gogo());
        System.out.println(go.gogosing());
    }
}


package com.github.sejoung.reactive.test;

public class GoControl2 {
    private Control control;
    public GoControl2(Control control){
        this.control = control;
    }

    public String gogo(int i) throws Exception {
        if("A".equals(this.control.process(i))){
            return "A";
        }else if("B".equals(this.control.process(i))){
            return "B";
        }else if("C".equals(this.control.process(i))){
            return "C";
        }else{
            throw new Exception("에러닷");
        }
    }

}


May 14, 2018 - coupling_(external coupling)

결합도 (coupling)

외부결합 (external coupling)

강결합

외부 커플 링은 하나 이상의 모듈이 인터페이스 또는 통신 프로토콜을 공유 할 때 발생합니다.

이는 일반적으로 모듈이 인프라 계층 (예 : OS 기능)과 직접 통신 할 때 발생합니다

음 기본적으로 여기서 말하는 결합도를 낮춰야 되는데 요즘 의존성 삽임 프로그램에서 클라이언트에 의존성이

외부결합에 의해서 대조 되고 단일책임원칙을 위배하고

음… IOC 컨테이너들은 느슨하게 커플링하기 위한 몇가지 방법들이 존재한다. 이 부분은 토론이 필요할듯


public AService {
    
   private Adao adao;

   public void AService(Adao adao){
      this.adao = adao;
      
   }
   
   public String getData(){
       return adao.getdata();
   }
}


public BService {
    
   private Adao adao;
   
   public void BService(Adao adao){
      this.adao = adao;
   }
   
   public String getData(){
       return adao.getdata();
   }
}

AService aService = new AService(new Adao());
BService bService = new BService(new Adao());

aService.getData();
bService.getData();