Liskov 대체 원리 - Liskov substitution principle

대체 가능성이 있는 원칙 객체 지향 프로그래밍 (A)에 해당 진술 컴퓨터 프로그램 S가 있다면, 서브 타입 T의는 다음의 목적 타입 T가 될 수도 교체 형 S의 개체 (즉, 타입 T의 객체가 될 수있다 치환 하여 프로그램의 원하는 속성 (정확성, 수행 된 작업 등)을 변경하지 않고 하위 유형 S의 모든 개체). 보다 공식적으로, Liskov 대체 원칙 ( LSP )은 Barbara Liskov 가 처음 도입 한 ( 강한 ) 행동 하위 유형 이라고하는 하위 유형 관계의 특정 정의입니다.1987 년 컨퍼런스 기조 연설 에서 데이터 추상화 및 계층 구조 라는 제목의 연설을했습니다 . 그것은이다 의미 가 의미 론적 상호 운용성을 보장하고자하기 때문이 아니라 단지 통 사적 관계 유형 계층 구조에서, 특히 오브젝트 유형. Barbara LiskovJeannette Wing 은 1994 년 논문에서 원리를 다음과 같이 간결하게 설명했습니다. [1]

하위 유형 요구 사항 : Let 물건에 대해 증명할 수있는 재산 유형 T 입니다. 그때 객체에 대해 true 여야합니다. 타입 S 여기서 S는 의 하위 유형입니다 T .

같은 논문에서 Liskov와 Wing은 Hoare 논리 의 확장에서 행동 하위 유형에 대한 개념을 자세히 설명했습니다 . 이는 사전 조건 , 사후 조건불변하위 유형의 상호 작용을 고려한다는 점에서 Bertrand Meyer계약 설계 와 특정 유사성을 나타 냅니다.

원리

Liskov의 행동 하위 유형 개념은 객체에 대한 대체 가능성 개념을 정의합니다. 즉, ST 의 하위 유형 이면 프로그램에서 유형 T의 객체 는 해당 프로그램의 바람직한 속성 (예 : 정확성 ) 을 변경하지 않고 유형 S의 객체로 대체 될 수 있습니다 .

행동 하위 유형은 일반적으로보다 강력한 개념이다 기능의 하위 유형 에 정의 된 유형 이론 에만 의존, contravariance 인수 유형과의 공분산 반환 형식의. 행동 하위 유형은 결정 불가능 일반적으로 다음과 같은 경우 q는 재산 "에 대한 방법입니다 X 항상 종료가 "다음 (예 : 컴파일러)는 일부 하위 유형에 대한 진정한 보유하고 있는지 확인하기 위해 프로그램에 대한 불가능 ST 하더라도, q는 보류를 수행 대한 T . 그럼에도 불구하고이 원칙은 클래스 계층 구조의 설계를 추론하는 데 유용합니다.

Liskov의 원칙 은 새로운 객체 지향 프로그래밍 언어에서 채택 된 서명 에 몇 가지 표준 요구 사항을 부과 합니다 (일반적으로 유형이 아닌 클래스 수준 , 구별에 대해서는 명목 형 대 구조적 하위 유형 참조 ).

  • Contravariance 하위 유형의 메소드 인수.
  • 하위 유형에서 반환 유형의 공분산 .
  • 새로운 예외는 하위 유형의 메서드에 의해 throw되지 않아야합니다. 단, 해당 예외 자체가 상위 유형의 메서드에 의해 throw되는 예외의 하위 유형 인 경우를 제외하고는 예외입니다.

서명 요구 사항 외에도 하위 유형은 여러 동작 조건을 충족해야합니다. 이는 계약 방법론에 의한 설계 와 유사한 용어로 자세히 설명되어 있으므로 계약이 상속 과 상호 작용할 수있는 방법에 대한 몇 가지 제한이 있습니다 .

  • 하위 유형에서는 전제 조건 을 강화할 수 없습니다.
  • 하위 유형에서는 사후 조건 을 약화 할 수 없습니다.
  • 상위 유형의 불변 은 하위 유형에 보존되어야합니다.
  • 히스토리 제약 ( "히스토리 규칙"). 객체는 메서드 ( 캡슐화 )를 통해서만 수정 가능한 것으로 간주됩니다 . 하위 유형은 상위 유형에없는 메소드를 도입 할 수 있기 때문에 이러한 메소드의 도입은 상위 유형에서 허용되지 않는 하위 유형의 상태 변경을 허용 할 수 있습니다. 히스토리 제약은 이것을 금지합니다. Liskov와 Wing이 소개 한 참신한 요소였습니다. 이 제약의 위반은 변경 가능한 포인트불변 포인트 의 하위 유형으로 정의함으로써 예시 될 수 있습니다 . 불변 점 의 히스토리 에서 상태는 생성 후 항상 동일하므로 변경 가능 지점 의 히스토리를 포함 할 수 없기 때문에 이것은 히스토리 제약을 위반 하는 것입니다.일반적으로. 그러나 하위 유형에 추가 된 필드는 상위 유형 메소드를 통해 관찰 할 수 없기 때문에 안전하게 수정할 수 있습니다. 따라서 LSP를 위반하지 않고 불변의 점 에서 중심이 고정되어 있지만 반경변경 가능한 원을 파생시킬 수 있습니다 .

태생

사전 및 사후 조건에 대한 규칙은 Bertrand Meyer가 그의 1988 년 저서 Object-Oriented Software Construction 에서 소개 한 규칙과 동일합니다 . 용어를 사용하는 첫번째이었다 모두 마이어, 나중에 피에르 미국, 행동 하위 유형은 , 준 증명 이론 어떤 행동 하위 유형의 개념의 정의를, 그러나 그들의 정의는 계정을 고려하지 않은 앨리어싱 지원 참조 또는 포인터가 프로그래밍 언어에서 발생할 수 . 앨리어싱을 고려한 것은 Liskov와 Wing (1994)이 만든 주요 개선 사항이며 핵심 요소는 역사 제약입니다. Meyer와 America의 정의에 따라 MutablePoint는 ImmutablePoint의 행동 하위 유형이되는 반면 LSP는이를 금지합니다.

비판

While widely used, the characterization of behavioral subtyping as the ability to substitute subtype objects for supertype objects has been said to be flawed. It makes no mention of specifications, so it invites an incorrect reading where the implementation of the supertype is compared to the implementation of the subtype. This is problematic for several reasons, one being that it does not support the common case where the supertype is abstract and has no implementation. Also, more subtly, in the context of object-oriented imperative programming it is difficult to define precisely what it means to universally or existentially quantify over objects of a given type, or to substitute one object for another.[2]대체 유형을 적용 할 때 일반적으로 하위 유형 개체를 상위 유형 개체로 대체하지 않고 단순히 하위 유형 개체를 상위 유형 개체로 사용합니다. 즉, 수퍼 유형 객체이기도 한 동일한 객체, 하위 유형 객체입니다.

2016 년 인터뷰에서 Liskov는 그녀가 기조 연설에서 발표 한 내용이 "비공식적 인 규칙"이라고 설명했습니다. Jeannette Wing은 나중에 "이것이 무엇을 의미하는지 정확히 파악하려고 노력"하자 공동 출판물로 이어졌습니다 [1 ] 행동 하위 유형에 대해 설명합니다. 실제로 "기술적으로는 행동 하위 유형이라고합니다." [3] 인터뷰하는 동안, 그녀는 개념을 논의하기 위해 대체 용어를 사용하지 않습니다.

또한보십시오

참고 문헌

  1. ^ a b Liskov, Barbara; Wing, Jeannette (1994-11-01). "하위 유형의 행동 개념". 프로그래밍 언어 및 시스템에 대한 ACM 트랜잭션 . 16 (6) : 1811–1841. DOI : / 197320.197383 10.1145을 . S2CID 999172 .
  2. ^ Leavens, Gary T.; Naumann, David A. (August 2015). "Behavioral subtyping, specification inheritance, and modular reasoning". ACM Transactions on Programming Languages and Systems. 37 (4): 1–88. doi:10.1145/2766446. S2CID 1379166.
  3. ^ van Vleck, Tom (April 20, 2016). Interview with Barbara Liskov. ACM.

Bibliography

General references

  • Gary T. Leavens and Krishna K. Dhara, Concepts of Behavioral Subtyping and a Sketch of Their Extension to Component-Bases Systems in Gary T. Leavens, Murali Sitaraman, (ed.) Foundations of component-based systems, Cambridge University Press, 2000 ISBN 0-521-77164-1. This paper surveys various notions of behavioral subtyping, including Liskov and Wing's.
  • Liskov, B. H.; Wing, J. M. (November 1994). A behavioral notion of subtyping. ACM Trans. Program. Lang. Syst. 16 (6). pp. 1811–1841. doi:10.1145/197320.197383. An updated version appeared as CMU technical report: Liskov, Barbara; Wing, Jeannette (July 1999). "Behavioral Subtyping Using Invariants and Constraints" (PS). Retrieved 2006-10-05. The formalization of the principle by its authors.
  • Reinhold Plösch, Contracts, scenarios and prototypes: an integrated approach to high quality software, Springer, 2004, ISBN 3-540-43486-0. Contains a gentler introduction to behavioral subtyping in its various forms in chapter 2.
  • Robert C. Martin , The Liskov Substitution Principle , C ++ Report, 1996 년 3 월. LSP 위반의 몇 가지 예를 제공하는 객체 지향 프로그래밍 커뮤니티에서 인기있는 기사.
  • Kazimir Majorinc, Ellipse-Circle Dilemma and Inverse Inheritance, ITI 98, Proceedings of the 20th International Conference of Information Technology Interfaces, Pula, 1998, ISSN 1330-1012. 이 문서에서는 언급 된 맥락에서 LSP에 대해 설명합니다.

특정 참조

외부 링크