私たちのほとんどは、MVCやstrategyなどのカジュアルなパターンをすでに使用しています。
しかし、異常な問題には異常な解決策がいくつかあるに違いないので、それについて聞きたいと思います。
クラッシュのみのソフトウェア: http ://www.usenix.org/events/hotos03/tech/full_papers/candea/candea_html/ 要約
クラッシュのみのプログラムは安全にクラッシュし、迅速に回復します。そのようなソフトウェアを停止する方法は1つだけであり、クラッシュすることによって、そして回復を開始することによって起動する方法は1つだけです。クラッシュのみのシステムはクラッシュのみのコンポーネントから構築されており、透過的なコンポーネントレベルの再試行を使用すると、システム内のコンポーネントのクラッシュがエンドユーザーから隠されます。このホワイトペーパーでは、インターネットシステムのクラッシュのみの設計を提唱し、より信頼性が高く、予測可能なコードと、より高速で効果的なリカバリにつながる可能性があることを示しています。このようなクラッシュのみのインターネットサービスを構築する方法についてのアイデアを提示し、成功した技術を論理的に極限まで高めます。
これはどちらかというとアンチパターンですが、私は「すべてを 1 か所にまとめる」パターンと呼んでいるものを見てきました。それは大規模なアプリケーションであり、すべてのクラス、すべてのクラスのローカルではないすべての変数が、P (パラメーター用) という単一のクラスに格納されていました。余談ですが、すべての静的変数は、...待って... S.
とにかく、どういうわけか、このプロジェクトは非常に大きくなり、突然、何も機能しなくなりました。(私はこの頃採用されました)。驚くべきことに、プログラムはクラッシュしませんでした。ただ、アプリケーションをおかしくする大量の副作用があっただけです。ご想像のとおり、すべて P にアクセスし、変数を変更する複数のスレッドがあり、ロックも同期も行われていません。
私はあなたに言います、それは本当に目を見張るものでした。
その会社は新しいオフィスを開設し、スタッフとして 3 人を採用しました。私もその 1 人です。私たちはプログラムを与えられ、それを修正するように言われました。私たちは額を平手打ちするだけで何日も座って過ごしました。私は今、私の顔に恒久的な掌紋を持っています。
その他のおかしな...「fudgeFactor」という名前の変数。それが何をしたのかはまだわかりません。
次のASCII文字を取得する方法...
char getNextChar(char previous) {
switch (previous)
case 'a': return b;
case 'b': return c;
...
case 'z': return a;
}
とにかく、それは私の面白いパターンです...いくつかの余分な面白い側面が投げ込まれています.
昨年、私は LANSA で書かれた Windows アプリケーションのメンテナンスを行ってきました。ここでは、2 つの非表示ボタン (PrevFocus と NextFocus) を除いて、すべてのコントロールを tabStop = false に設定することでフォーカスを管理しています。フォームが読み込まれると、フォーカスがフィールドに設定され、そのフィールドの名前が追跡変数 (適切な名前は「FocusField」) に格納されます。ユーザーがタブ (またはシフトタブ) でフォーカスを変更すると、適切なボタンの GotFocus イベントが実行されます。その関数内には case ステートメントがあります (select case FocusField)。現在フォーカスされているフィールドに基づいて検証ロジックが実行され、場合によってはフォーカスが別のフィールドに変更されます。
ほとんどのコントロールの GotFocus イベントは、FocusField の現在の値を調べてから、LostFocus 関数を呼び出します。この関数は、FocusField に対して同じ case ステートメントを実行して、以前にフォーカスされたフィールドが検証されるようにします。
おそらくご想像のとおり、これにより UI をロジックから分離することが不可能になり、維持するのが信じられないほど面倒になります。これらのフォームを書き直して、すべての入力を検証する単純な Validate メソッドを使用し、通常のタブ プロパティ (TabOrder、TabStop など) を魔法のように機能させると、コードが 50% 削減され、フォームの信頼性が大幅に向上します。
このパターンがどこから生まれたのかはわかりませんが、アプリケーションを作成した RPG/グリーン スクリーン プログラマーが WinForms 開発者に転向したことによって考え出された可能性があります。
ビジターは、複雑な構造の操作を行うための非常にエレガントな方法として、グラフを多用するプログラムに取り組んでいるときに初めて私を悩ませました。
mvc (それ自体はパターンではありません) に加えて、これはその複雑さと問題を解決する可能性に関して「パターンの王様」です。
FowlerによるFluent Interfaceは、非常に興味深いパターンです。私は常に、Abstract Factory、Strategies、および State Pattern も気に入っています。
よろしければ、私は最近、フレンド クラス パターンと呼ぶ「パターン」を体系化しました。これは、C++ スタイルのフレンド クラスを持たない言語でプライベート フィールド アクセサーの可視性を制限するのに興味深い、または役立つと思われるものです。
GOFのフライ級パターンについて初めて読んだときのことを覚えています。彼らが使用する例はワープロです。彼らは、独立したオブジェクトを使用して各キャラクターを表すことの欠点を指摘しています。Flyweight パターンは、共有可能で本質的で不変の状態と、共有不可能で外部的な可変状態との分離を促進します。当時の私にとっては「あはは!」のひとつでした。私の視野を本当に広げ、今日まで私のデザインに影響を与えてきた瞬間.
私の友人は、ストラテジー パターンは本質的に先祖パターンであると示唆しました。他のパターン (ブリッジ、デコレータ、プロキシ、状態など) の多くは、戦略のより洗練されたアプリケーションです。戦略と国家には実際に違いがあると、かなり長い間彼と議論したことを覚えています。
パターンというほどではないが、依存性注入と制御の反転
いいえ、それは DP の本に関するもので、このスレッドは特定のパターンに関するものです。
インタープリターとフライ級はギャング オブ 4 の本から思い浮かびます。
SW 開発者のツールボックスでは、Bridge と Mediator の強力で深いパターンを考慮しています。
これまでに出会う中で最も興味深いデザインパターンは、明らかな理由から、自分で作成したものです。
それが最高のデザインパターンになると言っているのではなく、最も興味深いものです。