マシューGAISER:
私はこのようなメソッドを持っていると言います。
public AbstractContractApplication acceptOffer(AcceptedOfferDto dto)
{
// various application stuff
Contract contract; // deeply integrated into the above code
return processedApplication; // also deeply integrated into the above code
}
私は時々返すように私のメソッドをリファクタリングしたいcontract
の代わりをprocessedApplication
提供引数に基づきますAcceptedOfferDto
。理想的には、このような何か:
if (AcceptedOfferDto.getReturnConfig() == 1){
return contract;
}
else {
return processedApplication;
}
コピー機能では、コードの大部分を貼り付けたり、非常に重要なビジネス・ロジックの大きなブロックをリファクタリングを伴わないこれを行うにはクリーンな方法はありますか?
思考の現在の行は、両方のオブジェクトのインスタンスを含むクラスを作成し、ちょうどそれから正しい値を選択することです。他にどのようなオプションが利用可能であるかもしれませんか?
ビクターStafusa:
仮にContract
およびAbstractContractApplication
polimorphismに依存することは一般に有用何もない、あなたはあまりにも多くのものをリファクタリングすることはできません、あなたがこれを使用することもできます。
public interface EitherOne<A, B> {
public default boolean isA() { return false; }
public default boolean isB() { return false; }
public default A getA() { throw new IllegalStateException(); }
public default B getB() { throw new IllegalStateException(); }
public static <A, B> EitherOne<A, B> a(A a) {
return new EitherOne<>() {
@Override public boolean isA() { return true; }
@Override public boolean getA() { return a; }
};
}
public static <A, B> EitherOne<A, B> b(B b) {
return new EitherOne<>() {
@Override public boolean isB() { return true; }
@Override public boolean getB() { return b; }
};
}
}
私は実際にこれを使用して誰にもお勧めしません。それだけで複雑な状況のための迅速かつ汚いエスケープハッチハックとして使用する必要があります。
その後、あなたはこれを試すことができます。
public EitherOne<Contract, AbstractContractApplication> acceptOffer(AcceptedOfferDto dto) {
// various application stuff
AbstractContractApplication processedApplication = ...;
Contract contract = ...; // deeply integrated into the above code
if (AcceptedOfferDto.getReturnConfig() == 1) return EitherOne.a(contract);
return EitherOne.b(processedApplication); // also deeply integrated into the above code
}