要約すると:
オブジェクト A には、例外をスローするメソッド { m1、m2、... } があります。検証後、これらのメソッドのいくつかはもはや知られなくなりthrow
ます。OO でこの検証段階の進行をモデル化します。チェックが実行され、肯定的な結果が返されると、オブジェクトはそのメソッドの信頼性についてより高いレベルの信頼に「昇格」され、例外チェックはクライアントに強制されなくなります。
フルバージョン:
このデザインの選択を建設的に批判していただけませんか。
インターフェイスは、オブジェクトの「クラス」の機能を記述します。そのようなオブジェクトの 1 つに「なる」には、インスタンスがインターフェイス プロトコルをサポートしていれば十分です。インターフェイス プロトコルは、特定の数のことを「試す」機能を確立するだけです (例外をスローするメソッドを実装する)。
上記の例の単純化された存在形態は、すべての操作を試すことができる段階ですが、それらのかなりの数で失敗が予想される段階です (教育を受けていない野蛮人は人間であり、すべてのタスクに手を出す可能性があります)。 、しかし、誰もそれらの成功にあまり賭けません)
基本インターフェースのサブタイプは同じ機能を保持しますが、高度な検証の完了を示すため、その操作の一部が常に成功することが保証されます。この「プロモーション」とキャストは、オブジェクトの順序を「アップレベル」するための内部状態と契約の前提条件の検査に従います。
対応するパターンまたは実際にアンチパターン(アイデアを採用するのを思いとどまらせたい場合) を教えてください。これは、検証の段階を経て進行するオブジェクトの同じ概念をキャプチャし、基本操作の信頼性に関する情報は、プログレッシブチェック?
操作はすべてベース インターフェイスにあり、関連するチェック済みの例外がありますが、メソッド シグネチャから例外が消えるサブタイプ (サブインターフェイス) が存在するインターフェイス階層を介してこれをモデル化しようとしています。
ここに投稿する前に Decorator パターンを検討しましたが、多くのレベルで、オブジェクトに「特定のポイントまで検証済み」として耳にタグを付けるという原則をモデル化できません。switch
また、検証ステージに関するメタデータ (Enum?) がオブジェクトに合成されて編集される「継承よりも合成」についても検討しました。
主な目標は次のとおりです。
オブジェクトの特定の「標本」について何も知られていない場合に、クライアントに例外をチェックさせる
オブジェクトが検証レイヤーに送信され、「チェック済みで動作中」として返されたときに、例外をチェックする責任からクライアントを解放します。高次インターフェースを使用するということは、「これは高速で安全に使用できる」ことを意味します。
オブジェクトをすぐに使用しようとするが、発生する可能性のある奇妙なケースを処理するか、オブジェクトのメソッドを呼び出そうとする前に検証の遅いデリゲートに転送するかをクライアントが選択できるようにします。もちろん、デリゲートはオブジェクトの高次インターフェイス キャストを返し、信頼性を示します。
デザインのジレンマが実際に私にとって最も重要であるにもかかわらず、ユーモラスな表現が続きます。
interface CivilisedMan extends Man {
@Override
void act();
}
interface Man {
void act() throws UnreasonableBehaviourException;
}
class UnreasonableBehaviourException extends Exception {
public UnreasonableBehaviourException(String embarrassingCircumstance) {
super(embarrassingCircumstance);
}
}
public class StackOverflow {
public static void main(String[] args) {
Man williamConnollyJr = new Man() {
@Override
public void act() throws UnreasonableBehaviourException {
throw new UnreasonableBehaviourException("F*rt!");
}
};
CivilisedMan harryPotter = new CivilisedMan() {
@Override
public void act() {
System.out.println("Swish and flick.");
}
};
try {
williamConnollyJr.act();
} catch (UnreasonableBehaviourException unreasonableBehaviourException) {
System.out.println(unreasonableBehaviourException.getMessage());
}
harryPotter.act();
}
}
このデザインを破棄して、必要に応じて最初からやり直すことは問題ありませんが、そのためには参照をバックアップする必要があります...
注: この行動パターンは、生活の中で頻繁に発生します。あなたは新しい物を手に取り、それについて何も知らず、それをどのように投げたり、渦を巻かせたり、変形させたりできるかについてほとんど期待していません。想定される各アクションに対してオブジェクトがどの程度適しているかについて...