강한결합/느슨한결합( Tight Coupling / Loose Coupling )
。특정클래스가인터페이스의존 시 class 간Loose Coupling이 발생했다고 간주.
。되도록 코드는의존성이 낮도록 작성하여결합도를 최소화해야한다.
Tight Coupling예시public class GameRunner { MarioGame game; public GameRunner(MarioGame game){ this.game = game; } public void run(){ System.out.printf("Running game:%s",game); game.up(); game.down(); game.left(); game.right(); } } public class MarioGame { public void up(){ System.out.println("jump"); } public void down(){ System.out.println("go into a hole"); } public void left(){ System.out.println("go back"); } public void right(){ System.out.println("go forward"); } } public class AppGamingBasicJava { public static void main(String[] args) { var marioGame = new MarioGame(); var gameRunner = new GameRunner(marioGame); gameRunner.run(); } }。
GameRunner 클래스에서 특정MarioGame 클래스에의존하여강한 결합을 하고있음
▶고수준 모듈이저수준 모듈에의존하고있으므로DIP위반
Loose Coupling예시
public interface GamingConsole { public void up(); public void down(); public void left(); public void right(); } public class MarioGame implements GamingConsole { public void up(){ System.out.println("jump"); } public void down(){ System.out.println("go into a hole"); } public void left(){ System.out.println("go back"); } public void right(){ System.out.println("go forward"); } } public class GameRunner { GamingConsole game; public GameRunner(GamingConsole game){ this.game = game; } public void run(){ System.out.printf("Running game:%s",game); game.up(); game.down(); game.left(); game.right(); } } public class AppGamingBasicJava { public static void main(String[] args) { var marioGame = new MarioGame(); var scg = new SuperContraGame(); var gameRunner1 = new GameRunner(scg); var gameRunner2 = new GameRunner(marioGame); gameRunner1.run(); gameRunner2.run(); } }。
GameRunner 클래스에서GamingConsole Interface를 의존하여MarioGame 클래스와느슨한 결합을 유지
▶저수준모듈에서고수준모듈로의존성 역전
결합(Coupling) :
。소스코드를 변경 시 추가적인소스코드변경 작업이 연관되어있는지에 대한 측도.
▶결합이 작을수록 좋다.