パターン-やかんから水を注ぐ

 プログラマーはどのようにしてティーポットの水を沸かすのですか?
 1.やかんに水を引き込みます
 2.やかんに火をつける
 3.沸騰するまで待つ

既に水が入っている場合、プログラマはどのようにしてやかんの水を沸かしますか?
 1.ケトルから水を注ぎます。これにより、問題はすでに解決済みの問題になります。
 (古いジョーク) 




各タスクには、多くの異なるソリューションがあります。 スマート、バカ、高速、c 実生活では、決定は2つのタイプに分けられます-働くものと他のすべての人。



複雑なコード(あなた自身または他の誰かのもの)があり、その作業のロジックに真剣に影響を与える必要があると想像してください。 もちろん、あなたはより深く、依存症を探り、起こりうる結果と問題について考えることができます。 あなたのコードでさえ、これは簡単ではありません。 見知らぬ人にとっては、複雑さはワイルドです。



同様のタスクに直面している場合-「ティーポットから水を注ぐ」というパターンを思い出してください(ほとんど中国の戦略=のように聞こえます)。

そして、困難なタスクを行う代わりに、既存のソリューションのソリューションに還元します。 したがって、複雑で潜在的に危険なコードを変更するのではなく、独自の小さなコードを作成し、その正確性を簡単に確認できます。





むかしむかし、当社はロータスノーツ用のデータベースを作成しました。 しかし残念ながら、顧客がTabキーを押してテーブルの別のセルに移動するのは快適ではありませんでした。 TabキーをEnterに置き換えるための単一の標準ツールが見つからなかったため、次の解決策に頼りました。 キーのクリックがアプリケーションテーブルで発生した場合、TabのEnterキーを置き換えるキーボードフックを掛けました。



別の例はジャバートランスポートです

jabberクライアントは、他のプロトコルの存在について知る必要はありません。 xmppでのみ機能します。 jabberサーバーは翻訳に従事しています。



さて、コードからの例

 クラスint
 {
公開:
     Int(const int iv)
     :i(iv)
     {}

     Int(定数Int&コピー)
     {
         * this = copy;
     }

     //コピーおよび割り当てコンストラクタはここにマージされます。
     //したがって、新しい変数をクラスに追加すると-
     //コードの1つの場所にのみ追加する必要があり、複数の場所に追加する必要はありません
     Int&operator =(const Int&copy)
     {
         i = copy.i;
         return * this;
     }

     Int&演算子++()
     {
         i ++;
         return * this;
     }
    
     //接頭辞を介して接尾辞++を実装します
     const Int演算子++(int)
     {
         return ++(* this);
     }

     //コンストラクタを介した+ =
     Int演算子+ =(int v)
     {
         return Int(i + v);
     }

プライベート:
     int i;
 };

 //既存の+ =を使用する演算子+
 Int演算子+(const Int&i、const int iv)
 {
     Int intVal(i);
     intVal + = iv;
     return intVal;
 } 


キーポイント-1か所に持ち出せるすべての領域-を持ち出します。 したがって、すべての同種のメソッド(この例では+ =および+)の統一された動作と、クラスコンストラクターの同種の動作を保証します。 つまり、一方のコンストラクターが正しく動作し、もう一方のコンストラクターが変数の半分を初期化しないという動作はありません。



ロジックを作り直すという大きなタスクに直面するたびに、それについて考えてみてください。おそらく、ほぼ必要に応じてすべてを実行するソリューションがすでに存在している可能性があります。 ニーズにわずかに適応できるソリューション。



複雑な問題に対する簡単な解決策を聞くのは面白いでしょう。



All Articles