Re カット アンド パストは常に許容されます。
はい。セグメントがわずかに異なり、使い捨てシステム (非常に短い期間存在し、メンテナンスを必要としないシステム) を行っている場合。それ以外の場合は、通常、共通点を抽出することをお勧めします。
似ているが完全には似ていないセグメントについて:
違いがデータにある場合は、関数を抽出し、データの違いをパラメーターとして使用してリファクタリングします (パラメーターとして渡すデータが多すぎる場合は、それらをオブジェクトまたは構造にグループ化することを検討してください)。関数内の一部のプロセスに違いがある場合は、コマンド パターンまたは抽象テンプレートを使用してリファクタリングします。これらの設計パターンを使用してもリファクタリングが難しい場合は、関数が多くの責任を単独で処理しようとしている可能性があります。
たとえば、diff#1 と diff#2 の 2 つのセグメントが異なるコード セグメントがあるとします。そして、diff#1 では、diff1A または diff1B を持つことができ、diff#2 では、diff2A と diff2B を持つことができます。
diff1A と diff2A が常に一緒であり、diff1B と diff2B が常に一緒である場合、diff1A と diff2A を 1 つのコマンド クラスまたは 1 つの抽象テンプレート実装に含めることができ、diff1B と diff2B を別のクラスに含めることができます。
ただし、複数の組み合わせ (つまり diff1A & diff2A、diff1A & diff2B、diff1B & diff2A、diff1B & diff2B ) がある場合は、機能を再考する必要があるかもしれません。
Re SQL ステートメント:
ロジック (if-else、ループ) を使用して SQL を動的に構築すると、読みやすさが犠牲になります。しかし、すべての SQL バリエーションを作成するのは維持が困難です。そこで途中で出会い、SQL セグメントを使用します。共通点を SQL セグメントとして抽出し、それらの SQL セグメントを定数として使用してすべての SQL バリエーションを作成します。
例えば:
private static final String EMPLOYEE_COLUMNS = " id, fName, lName, status";
private static final String EMPLOYEE_TABLE = " employee";
private static final String EMPLOYEE_HAS_ACTIVE_STATUS = " employee";
private static final String GET_EMPLOYEE_BY_STATUS =
" select" + EMPLOYEE_COLUMNS + " from" + EMPLOYEE_TABLE + " where" + EMPLOYEE_HAS_ACTIVE_STATUS;
private static final String GET_EMPLOYEE_BY_SOMETHING_ELSE =
" select" + EMPLOYEE_COLUMNS + " from" + EMPLOYEE_TABLE + " where" + SOMETHING_ELSE;