그러나 Liskov의 대체 원칙을 따를 것이라고 신뢰하는 한 왜이를 대체하지 않겠습니까?
예를 들어 알고리즘의 골격 구현을 고정하고 하위 클래스로 특정 부분 만 (재) 정의 할 수 있기를 원하기 때문입니다. 이것은 템플릿 방법 패턴 (아래에서 강조) 으로 널리 알려져 있습니다 .
따라서 템플릿 방법은 작업 의미론의 더 큰 그림과 방법 선택 및 순서에 대한보다 정교한 구현 세부 정보를 관리합니다. 이 큰 그림은 당면 과제에 대한 추상적이고 비 추상적 인 방법을 호출합니다. 비추 상 메소드는 템플릿 메소드에 의해 완전히 제어되지만 서브 클래스로 구현 된 추상 메소드는 패턴의 표현력과 자유도를 제공합니다. 추상 메소드의 일부 또는 전부는 서브 클래스에 특화되어 서브 클래스의 작성자가 더 큰 의미에 대한 최소한의 수정으로 특정 동작을 제공 할 수 있습니다. 템플릿 패턴 (추상적이지 않은)은이 패턴에서 변경되지 않은 상태로 유지되어 하위 비 추상적 메서드와 추상 메서드가 원래 의도 된 순서로 호출되도록합니다.
최신 정보
내가 작업 한 프로젝트의 구체적인 예 :
- 다양한 "화면"을 통해 레거시 메인 프레임 시스템과 통신 각 화면에는 특정 데이터 비트를 포함하는 고정 된 이름, 위치 및 길이의 여러 필드가 있습니다. 요청은 특정 필드로 특정 데이터를 채 웁니다. 응답은 하나 이상의 다른 필드에서 데이터를 반환합니다. 각 트랜잭션은 동일한 기본 논리를 따르지만 세부 정보는 화면마다 다릅니다. 우리는 여러 가지 프로젝트에서 템플릿 메소드를 사용하여 화면 처리 논리의 고정 된 골격을 구현하면서 서브 클래스가 화면 특정 세부 사항을 정의 할 수 있도록했습니다.
- DB 테이블의 구성 데이터를 Excel 파일로 내보내거나 가져 오기 다시 한 번, Excel 파일을 처리하고 DB 레코드를 삽입 / 업데이트하거나 레코드를 Excel에 덤프하는 기본 스키마는 각 테이블마다 동일하지만 각 테이블의 세부 사항은 다릅니다. 따라서 템플릿 방법은 코드 중복을 제거하고 코드를 이해하고 유지하기 쉽게 만드는 매우 확실한 선택입니다.
- PDF 문서 생성 각 문서는 동일한 구조를 갖지만 많은 요소에 따라 매번 내용이 다릅니다. 다시, 템플릿 방법을 사용하면 생성 알고리즘의 고정 된 스켈레톤을 사례 별 변경 가능한 세부 정보와 쉽게 분리 할 수 있습니다. 사실로. 문서가 여러 섹션 으로 구성되어 있으며 각 섹션 은 0 개 이상의 필드 로 구성 되어 있으므로 여기에서는 여러 수준에 적용됩니다 . 템플릿 방법은 여기에 3 가지 레벨로 적용됩니다.
처음 두 사례에서 원래의 레거시 구현은 Strategy를 사용 하여 코드가 많이 복제되었습니다. 물론 몇 년 동안 여기저기서 미묘한 차이가 생겨나 고 복제되거나 약간 다른 버그가 많이 있었고 유지하기가 매우 어려웠습니다. 템플릿 방법으로 리팩토링 (및 Java 주석 사용과 같은 일부 다른 기능 향상)으로 코드 크기를 약 40-70 % 줄였습니다.
이것들은 내 생각에 가장 최근의 예일뿐입니다. 지금까지 작업 한 거의 모든 프로젝트에서 더 많은 사례를 인용 할 수있었습니다.