내식 교체 원칙

17591 단어 설계 원칙
이식 교체 원칙
정의
  • 만약에 모든 유형이 T1의 대상 o1이면 T2의 대상 o2가 있고 T1로 정의된 모든 프로그램 P가 모든 대상 o1을 o2로 바꿀 때 프로그램 p의 행위는 아무런 변화가 없다. 그러면 유형 T2는 유형 T1의 하위 유형
  • 이다.
  • 한 소프트웨어 실체가 부류에 적용되면 반드시 부류에 적용된다. 모든 부류를 인용하는 곳은 부류의 대상을 투명하게 사용할 수 있어야 한다. 부류의 대상은 부류의 대상을 교체할 수 있고 프로그램 논리는 변하지 않는다
  • 자류는 부류의 기능을 확장할 수 있으나 부류의 원래 기능을 바꿀 수 없다
  • 자류는 부류의 추상적인 방법을 실현할 수 있으나 부류의 비추상적인 방법을 덮어쓸 수 없다
  • 자류 중 자신만의 특유의 방법을 추가할 수 있다
  • 자류의 방법이 부류를 다시 불러올 때 방법의 선행 조건(즉 방법의 인삼)은 부류의 입력 매개 변수보다 느슨하다
  • 하위 클래스의 방법이 하위 클래스의 방법을 실현할 때(재부팅, 재작성 또는 추상적인 방법을 실현할 때) 방법의 백업 조건(즉 반환값)은 하위 클래스의 방법보다 더 엄격하거나 같다
  • 장점
  • 구속 상속 범람도 개폐 원칙의 일종이다
  • 프로그램의 건장성을 강화하는 동시에 변경할 때도 호환성을 높여 프로그램의 유지보수성과 확장성을 높일 수 있다.수요 변경 도입의 위험 감소
  • 코드 인스턴스
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     *       
     */
    public class LiskovSubstitution {
        private static void resize(Rectangle rectangle) {
            while (rectangle.getWidth() <= rectangle.getLength()) {
                rectangle.setWidth(rectangle.getWidth() + 1);
                System.out.println(rectangle);
            }
            System.out.println("resize    :" + rectangle);
        }
    
        public static void main(String[] args) {
    //        Rectangle rectangle = new Rectangle();
    //        rectangle.setWidth(10);
    //        rectangle.setLength(20);
    //        resize(rectangle);
    
    //        Square square = new Square();
    //        square.setSideLength(10);
    //        resize(square);
    
    //        Base child = new Child();
    //        child.method(new HashMap());
    
            Child1 child1 = new Child1();
            System.out.println(child1.method());
        }
    }
    
    interface Quadrangle {
        long getWidth();
    
        long getLength();
    }
    
    /**
     *    
     */
    class Rectangle implements Quadrangle {
        private long length;
        private long width;
    
        @Override
        public long getWidth() {
            return this.width;
        }
    
        @Override
        public long getLength() {
            return this.length;
        }
    
        public void setLength(long length) {
            this.length = length;
        }
    
        public void setWidth(long width) {
            this.width = width;
        }
    
        @Override
        public String toString() {
            return "Rectangle{" +
                    "length=" + length +
                    ", width=" + width +
                    '}';
        }
    }
    
    /**
     *    
     */
    class Square implements Quadrangle {
        private long sideLength;
    
        public long getSideLength() {
            return sideLength;
        }
    
        public void setSideLength(long sideLength) {
            this.sideLength = sideLength;
        }
    
        @Override
        public long getLength() {
            return this.getSideLength();
        }
    
        @Override
        public long getWidth() {
            return this.getSideLength();
        }
    
        @Override
        public String toString() {
            return "Square{" +
                    "length=" + this.getLength() +
                    ", width=" + this.getWidth() +
                    '}';
        }
    }
    
    /**
     *              ,       (      )              
     */
    class Base {
        public void method(HashMap map) {
            System.out.println("     ");
        }
    }
    
    class Child extends Base {
    //    @Override
    //    public void method(HashMap map) {
    //        System.out.println("  HahsMap       ");
    //    }
    
        public void method(Map map) {
            System.out.println("  Map       ");
        }
    }
    
    /**
     *               (  ,         ),       (    )           
     */
    abstract class Base1 {
        public abstract Map method();
    }
    
    class Child1 extends Base1 {
    
        @Override
        public HashMap method() {
            HashMap hashMap = new HashMap();
            System.out.println("  method   ");
            hashMap.put("message", "  method   ");
            return hashMap;
        }
    }
    

    좋은 웹페이지 즐겨찾기