おそらく、ロジックがやや逆向きであり、問題を引き起こしていると思います。メソッドが次のようになったらどうなるでしょうか。
updateTo1002()
{
if (version != 1001) {
updateTo1001();
}
// do the job
}
updateTo1003()
{
if (version != 1002) {
updateTo1002();
}
// do the job
}
正確なユースケースはわかりませんが、ほとんどの場合、最新バージョンに更新したいが、途中で必要に応じて増分更新をインストールするように思えます。このようにすると、そのロジックをよりよく捉えることができると思います。
編集:@ user470379のコメントから
この場合、ほとんどの場合、コピー/貼り付けパターンがあり、それを編集しているという事実を特定しています。
この場合、カップリングの問題はほとんど問題ではありませんが、問題になる可能性があります。この方法で行うとコーディングが難しいシナリオで発生する可能性のあるいくつかのことを紹介します。
- すべての更新で追加のクリーンアップ手順が必要になるため、 updateTo1001() の後に cleanup() などを呼び出します。
- 古いバージョンをテストするには、前に戻る必要があります
- 1001 と 1002 の間に更新を挿入する必要があります
あなたのパターンに従って行われたこれら2つの組み合わせを見てみましょう. まず、「undoUpgradeXXXX()」を追加して、各アップグレードを元に戻し、前に戻ることができるようにします。次に、取り消しを行うための 2 つ目の並列の if ステートメントのセットが必要です。
では、その「insert 1002.5」に追加してみましょう。突然、長い可能性のある 2 つの if ステートメントのチェーンを書き直しています。
この種の問題が発生することを示す重要な兆候は、パターンでコーディングしているということです。このようなパターンに注意してください。実際、私の最初の兆候の 1 つは、通常、誰かの肩越しにコードを見ているときに、次のように書かれたものを読むことさえできなくてもパターンを見つけることができる場合です。
********
***
*****
********
***
*****
...
それから私は彼らのコードに問題があることを知っています.
最も簡単な解決策は、一般に、各「グループ」から違いを取り除き、それらをデータ (多くの場合、配列であり、必ずしも外部ファイルである必要はありません) に入れ、グループをループにまとめて、その配列を反復処理することです。
あなたの場合、簡単な解決策は、単一のアップグレード方法で各アップグレード オブジェクトを作成することです。これらのオブジェクトの配列を作成し、アップグレードするときにそれらを反復します。それらを順序付けする方法も必要になる場合があります-現在、機能する可能性のある番号を使用しています-または日付の方が適切かもしれません-その方法で、特定の日付に簡単に「移動」できます。
いくつかの違いがあります:
- 各反復 (cleanup()) に新しい動作を追加すると、ループに 1 行の変更が加えられます。
- 並べ替えは、オブジェクトの変更にローカライズされます。おそらくさらに簡単です。
- アップグレードを順番に呼び出す必要がある複数のステップに分割するのは簡単です。
その最後の例を挙げましょう。すべてのアップグレードが実行された後、それぞれの初期化手順を実行する必要があるとします (ケースごとに異なります)。各オブジェクトに初期化メソッドを追加すると、最初のループへの変更は簡単です (単純にループに 2 回目の反復を追加するだけです)。元のデザインでは、if チェーン全体をコピー、貼り付け、編集する必要があります。
JUST undo & initialize を組み合わせると、4 つの if チェーンがあります。開始する前に問題を特定することをお勧めします。
また、このようなコードを排除するのは難しい場合があるとも言えます (言語によっては非常に困難です)。Ruby では実際には非常に簡単ですが、Java ではある程度の練習が必要な場合があり、多くの人がそれを行うことができないように見えるため、Java は柔軟性がなく難しいと呼ばれています。
あちこちで 1 時間かけて、このようなコードを削減する方法を熟考することは、これまでに読んだ本やトレーニングしたどの本よりも、私のプログラミング能力に多くの効果をもたらしました。
また、8898 を 8899 に変更するのを忘れたコピー/貼り付けエラーを探して巨大な if チェーンを編集する代わりに、何かをすることができます。 )