달력

5

« 2024/5 »

  • 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

suite.tistory.com 2011.11

OOP는 알고있는데 OOD는 이번에 처음 들어봤다!!  ^^;

Object-Oriented Design 에 5대 원칙

S.O.L.I.D

1.SRP 2.OCP 3.LSP  4.ISP 5.DIP

그중에 2가지만 study~ 

1. Liskov Substitution Principle  리스코프 교체 원칙

정의 : 서브타입은 언제나 자신이 기반타입 (base type)으로 교체할 수 있어야 한다
    (부모클래스가 사용되는곳에 자식클래스로 치환 해도 무방해야함)


아래 코드를 보면 modify 와 printList 모두 타입을 LinkedList 받았다가  속도나 기타 구현방식에 따라 LinkedList 부모클래스를 상속받은 ArrayList 나 HashSet를 사용할려면 그대로 대체해서 쓸수없고 기반 소스를 다고쳐야함
~~~~~~~~~~~~~~~~~~~~~~~~~~ LinkedList  종속적 ~~~~~~~~~~~~~~~~~~~~~~~~~~
import java.util.LinkedList;

public class ExampleLSP2 {

 void modify(LinkedList<String> list) {
  list.add("1");
  // list.add(…);
  //doSomethingWith(list);
  list.add("2");
  printList(list);
 }

 void printList(LinkedList<String> list) {
  for (int i = 0; i < list.size(); i++) {
   System.out.println(list.get(i));
  }
 }

 public static void main(String[] args) {
  LinkedList<String> list = new LinkedList<String>();
  ExampleLSP2 ex2 = new ExampleLSP2();

  ex2.modify(list);
 }
}

기반 소스를 안고치고 생성하는 객체만 생성해서 사용할수 있게 만든다면 아래 처럼 코딩을 할수 있다!
* 단 자식 클랙스 고유의 기능을 사용하지 않을경우

~~~~~~~~~ Collection 부모클래스가 사용되는곳에 자식클래스로 치환 해도 무방 ~~~~~~~~~~~~~~~~~

import java.util.*;

public class ExampleLSP3 {

 void modify(Collection<String> list) {
  list.add("1");
  // list.add(…);
  //doSomethingWith(list);
  list.add("2");
  printList(list);
 }

 void printList(Collection<String> list) {
  System.out.println(list.toString());
 }

 public static void main(String[] args) {
  //Collection<String> list = new HashSet<String>();
  Collection<String> list = new ArrayList<String>();
  ExampleLSP3 ex2 = new ExampleLSP3();

  ex2.modify(list);
  Collection<String> list2 = new HashSet<String>();
  ex2.modify(list2);
 }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.   Interface Segregation Principle 인터페이스 격리 원칙

정의 클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.

ISP_EX.zip

소스를 보면

BadCarOperation.java 에는 전체가 기능이 모여 있고 
BasicCarOperation.java 공통적인 기능 인터페이스
GearboxCarOperation.java , ConditioningCarOperation.java 클라이언트 특성에 따른 별도 구현 

ex) SM3.java : CartType2 클래스를 사용해 에어콘 조정 기능이 있지만
ex) BMW.java : CartType1 클래스를 사용해 에어콘 조정  기능이 없다

OOD 5대원칙 SRP , OCP , ISP , LSP , DIP  수많은 글 읽다 보면  그게 그거 같고 어렵다!  ㅋ 

근데 이거 모른다고 개발못하는건 아니다! 
이미 우리가 경험하면서 쓰고 있는것들 같다~ MVC , IoC, JDBC , 공통적인 기능은 한클래스에 모아 쓰기등 ....




 

:
Posted by mastar