ここで言及されていないリファクタリングについて何かを信じるようになりました。すでに多くの答えがあることは知っていますが、これは新しいことだと思います。
条件が発生する前から、私は冷酷なリファクタラーであり、DRYを強く信じてきました。ほとんどの場合、頭の中に大きなコードベースを保持するのに苦労していることと、DRYコーディングを楽しんでいて、C&Pコーディングについて何も楽しんでいないことが原因です。
大事なことは、DRYを主張することで、他の人が使用することはめったにない、いくつかのテクニックで多くの練習ができたことです。多くの人々は、JavaをDRYにすることは困難または不可能であると主張しますが、実際には彼らは試していないだけです。
昔の例は、あなたの例にいくらか似ています。人々は、Java GUIの作成は難しいと考える傾向があります。もちろん、次のようにコーディングした場合です。
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
これはおかしいと思う人は絶対に正しいが、それはJavaのせいではない。コードをこのように書くべきではない。これらのメソッド呼び出しは、他のシステムでラップすることを目的とした関数です。そのようなシステムが見つからない場合は、構築してください!
あなたは明らかにそのようなコードを書くことができないので、あなたは戻って問題を見る必要があります、実際にその繰り返しコードは何をしているのですか?いくつかの文字列とそれらの関係(ツリー)を指定し、そのツリーの葉をアクションに結合しています。だからあなたが本当に欲しいのは言うことです:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
簡潔で説明的な関係を何らかの方法で定義したら、それを処理するメソッドを記述します。この場合、渡されたクラスのメソッドを反復処理してツリーを構築し、それを使用してメニューを構築しますおよびアクション(もちろん)メニューを表示します。重複はなく、メソッドは再利用可能です...そして、おそらく多数のメニューよりも簡単に書くことができ、実際にプログラミングを楽しむなら、もっと楽しくなりました。これは難しくありません。あなたが書く必要がある方法は、メニューを手で作成するよりもおそらく行が少ないでしょう!
事は、これをうまく行うために、あなたがたくさん練習する必要があるということです。繰り返し部分に含まれる固有の情報を正確に分析し、その情報を抽出して、それをうまく表現する方法を見つけ出す必要があります。文字列の解析や注釈のようなツールを使用することを学ぶことは大いに役立ちます。エラー報告とドキュメントについて本当に明確になることを学ぶことも非常に重要です。
コーディングするだけで「無料」の練習ができます。たまに、DRYのコーディング(再利用可能なツールの作成を含む)は、コピーアンドペーストやすべてのエラー、重複したエラーよりも速いことがわかります。そして、そのタイプのコーディングが引き起こす困難な変更。
DRYテクニックとツールの構築をできるだけ練習しなければ、仕事を楽しむことができるとは思いません。プログラミングをコピーアンドペーストする必要がないために給与を削減する必要がある場合は、それを採用します。
だから私のポイントは:
- リファクタリングの方法がわからない場合を除き、コピーと貼り付けには時間がかかります。
- 最も困難で些細な場合でもDRYを主張することで、リファクタリングをうまく行うことを学びます。
- あなたはプログラマーです。コードをDRYにするための小さなツールが必要な場合は、ビルドしてください。
always
やnever
赤旗など。「コンテキスト」と呼ばれる事、ありますalways
とnever
しても、一般的に良い場合のルールは、適切なことではないかもしれないが。絶対に対処するソフトウェア開発者に注意してください。;)