しかし、リスコフの代替原則に従うことを信頼している限り、オーバーライドすることを許可しないのはなぜですか?
たとえば、アルゴリズムのスケルトン実装を修正し、特定の部分のみをサブクラスによって(再)定義できるようにするためです。これは、テンプレートメソッドパターンとして広く知られています(以下で強調します)。
したがって、テンプレートメソッドは、タスクセマンティクスの全体像と、メソッドの選択とシーケンスのより洗練された実装の詳細を管理します。この大きな画像は、手元のタスクの抽象メソッドと非抽象メソッドを呼び出します。非抽象メソッドはテンプレートメソッドによって完全に制御されますが、サブクラスに実装された抽象メソッドは、パターンの表現力と自由度を提供します。一部またはすべての抽象メソッドはサブクラスに特化することができ、サブクラスの作成者は、より大きなセマンティクスへの最小限の変更で特定の動作を提供できます。テンプレートメソッド(非抽象)はこのパターンでは変更されず、下位の非抽象メソッドと抽象メソッドが元々意図された順序で呼び出されるようにします。
更新
私が取り組んでいるプロジェクトの具体例:
- さまざまな「画面」を介してレガシーメインフレームシステムと通信します。各画面には、特定のデータビットを含む固定名、位置、長さのフィールドがあります。要求は特定のフィールドを特定のデータで満たします。応答は、1つ以上の他のフィールドにデータを返します。各トランザクションは同じ基本ロジックに従いますが、詳細は画面ごとに異なります。サブクラスで画面固有の詳細を定義できるようにしながら、いくつかの異なるプロジェクトでテンプレートメソッドを使用して、画面処理ロジックの固定スケルトンを実装しました。
- DBテーブルの構成データをExcelファイルとの間でエクスポート/インポートします。繰り返しますが、Excelファイルの処理とDBレコードの挿入/更新、またはExcelへのレコードのダンプの基本スキーマは各テーブルで同じですが、各テーブルの詳細は異なります。そのため、テンプレートメソッドは、コードの重複を排除し、コードの理解と保守を容易にする非常に明白な選択肢です。
- PDFドキュメントの生成。各ドキュメントの構造は同じですが、多くの要因に応じて、その内容は毎回異なります。繰り返しますが、テンプレートメソッドを使用すると、生成アルゴリズムの固定スケルトンを、ケース固有の変更可能な詳細から簡単に分離できます。実際には。文書は複数のセクションで構成されており、各セクションは0個以上のフィールドで構成されているため、ここでは複数のレベルにも適用されます。ここでは、テンプレートメソッドが3つの異なるレベルに適用されます。
最初の2つのケースでは、元のレガシー実装はStrategyを使用していましたが、結果として多くの重複したコードが発生しましたが、もちろん長年にわたって微妙な違いが生じ、多くの重複したまたはわずかに異なるバグが含まれていて、保守が非常に困難でした。テンプレートメソッドへのリファクタリング(およびJavaアノテーションの使用など、その他の機能強化)により、コードサイズが約40〜70%削減されました。
これらは、私の頭に浮かぶ最新の例にすぎません。これまで取り組んできたほぼすべてのプロジェクトから、より多くの事例を引用することができました。