数日前に他のインターンが書いたコードを見ました。if/ elseがたくさんあります。if/ elseはフロー制御コードを書くのにとても便利ですが、読みやすいですが、時々あります。多くのif / elseは本当に不快に見えますが、あまり言わないで、最初にコードを投稿してください。
public BaseData updateBaseData(List<DataParams> params) {
BaseData data = new BaseData();
for (DataParams dataParams : params) {
if (dataParams.type == 1) {
data.setCode1(dataParams.code);
} else if (dataParams.type == 2) {
data.setCode2(dataParams.code);
} else if (dataParams.type == 3) {
data.setCode3(dataParams.code);
} else if (dataParams.type == 4) {
data.setCode4(dataParams.code);
} else if (dataParams.type == 5) {
data.setCode5(dataParams.code);
} else if (dataParams.type == 6) {
data.setCode6(dataParams.code);
} else if (dataParams.type == 7) {
data.setCode7(dataParams.code);
} else if (dataParams.type == 8) {
data.setCode8(dataParams.code);
}
}
return data;
}
ここを見ると、コードが臭くて長いと感じますか?あまり言わないで、最適化してみてください。最初に頭に浮かぶのはスイッチです。効果は次のとおりです。
public BaseData updateBaseData2(List<DataParams> params) {
BaseData data = new BaseData();
params.stream().forEach(param -> {
switch (param.type) {
case 1:
data.setCode1(param.code);
break;
case 2:
data.setCode2(param.code);
break;
case 3:
data.setCode3(param.code);
break;
case 4:
data.setCode4(param.code);
break;
case 5:
data.setCode5(param.code);
break;
case 6:
data.setCode6(param.code);
break;
case 7:
data.setCode7(param.code);
break;
default:
break;
}
});
return data;
}
なんてこった、それはまだ同じ臭い、長く、資格がないので、私は強迫神経症で、炉に戻ってリファクタリングすることを考えています。ここでは主に反射とファクトリーモードについて話します
最初に反射を使用して再構築します。コードは次のように表示されます。
/**
* 利用反射重构代码
*
* @param params
* @return
*/
public BaseData updateBaseData3(List<DataParams> params) {
return RefactorCode.getReflect(params);
}
RefactorCodeコードは次のとおりです。
package com.example.demo.com.example.utils;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.demo.com.example.wxPay.entity.BaseData;
import com.example.demo.com.example.wxPay.entity.DataParams;
public class RefactorCode {
private static Map<Integer, String> map = new HashMap<>();
static {
map.put(1, "setCode1");
map.put(2, "setCode2");
map.put(3, "setCode3");
map.put(4, "setCode4");
map.put(5, "setCode5");
map.put(6, "setCode6");
map.put(7, "setCode7");
}
public static BaseData getReflect(List<DataParams> params) {
BaseData data = new BaseData();
params.stream().forEach(param -> commom(data, param));
return data;
}
private static void commom(BaseData data, DataParams param) {
String codeName = map.get(param.getType());
try {
Method method = BaseData.class.getMethod(codeName, Integer.class);
method.invoke(data, param.getType());
} catch (Exception e) {
System.out.println(e);
}
}
}
リフレクションを使用してif / elseを削除する原則は非常に単純です。HashMapを使用して、呼び出す必要のあるメソッドのタイプとメソッド名の間のマッピング関係を確立しますが、リフレクションを知っている人なら誰でも、リフレクションの効率がそうではないことを知っています。同時実行性が高い条件下では非常に高い。楽観的であるため、ファクトリーモデルをもう一度考えました。
工場モデルのリファクタリング
工場モデルがわからない場合は、Baiduを使用できます。
ファクトリメソッドパターンは、通常のファクトリを単純ファクトリの具象ファクトリクラスに分割し、抽象ファクトリレイヤ+コンクリートファクトリサブクラスレイヤの2つの層に分割します。
単純なファクトリの問題を解決するために、プログラマーはファクトリのインターフェイスを設計するという新しい方法を考え出しました。必要に応じて、このファクトリから継承するクラスを作成して、変更する必要がないようにします。何でも、直接追加するだけです。私の工場で靴を製造しているのと同じで、各ワークショップには特定のブランドの靴が割り当てられています。新しいブランドの靴がある場合は、新しいワークショップを追加するだけです。
- 抽象製品の役割:通常、抽象メソッドを定義する抽象クラスまたはインターフェース
- 特定の製品の役割:特定の製品の実装クラス。通常、1つ以上のコンポーネントクラスで構成される抽象戦略クラスを継承または実装します。
- 工場の役割:抽象的な製品クラスへの参照を保持し、動的ランタイム製品の選択と構築を担当します
ファクトリーモデルの紹介に従ってください。まず、抽象製品インターフェースAbstractServiceを定義する必要があります。コードは次のとおりです。
package com.example.demo.com.example.wxPay.service;
import com.example.demo.com.example.wxPay.entity.BaseData;
public interface AbstractService {
void refactoringCode(BaseData data, String code);
}
次に、これら7つのサービスタイプの製品を個別に実装し、各製品に異なるサービスアルゴリズムをカプセル化する必要があります。具体的なコードは次のとおりです。
public class Code1Service implements AbstractService {
@Override
public void refactoringCode(BaseData data, String code) {
data.setCode1(code);
}
}
public class Code2Service implements AbstractService {
@Override
public void refactoringCode(BaseData data, String code) {
data.setCode2(code);
}
}
public class Code3Service implements AbstractService {
@Override
public void refactoringCode(BaseData data, String code) {
data.setCode3(code);
}
}
public class Code4Service implements AbstractService {
@Override
public void refactoringCode(BaseData data, String code) {
data.setCode4(code);
}
}
public class Code5Service implements AbstractService {
@Override
public void refactoringCode(BaseData data, String code) {
data.setCode5(code);
}
}
public class Code6Service implements AbstractService {
@Override
public void refactoringCode(BaseData data, String code) {
data.setCode6(code);
}
}
public class Code7Service implements AbstractService {
@Override
public void refactoringCode(BaseData data, String code) {
data.setCode7(code);
}
}
工場の役割と、工場で製品を実現する方法を実現する必要があります。HashMapを使用して、特定の製品のタイプとオブジェクトの間のマッピング関係を維持します。
package com.example.demo.com.example.wxPay.service;
import java.util.HashMap;
import java.util.Map;
public class ServieFactory {
private static Map<Integer, AbstractService> map = new HashMap<>();
static {
map.put(1, new Code1Service());
map.put(2, new Code2Service());
map.put(3, new Code3Service());
map.put(4, new Code4Service());
map.put(5, new Code5Service());
map.put(6, new Code6Service());
map.put(7, new Code7Service());
}
public static AbstractService getCodeService(Integer type) {
return map.get(type);
}
}
最後に、ビジネス層は製品のメソッド呼び出しを実装します。
/**
* 工厂模式
*
* @param params
* @return
*/
public BaseData updateBaseData4(List<DataParams> params) {
BaseData data = new BaseData();
params.stream().forEach(
param -> ServieFactory.getCodeServicre(param.getType()).refactoringCode(data, param.getCode()));
return data;
}
注:多くのことを書いてきたので、if / elseが十分ではないというわけではありませんが、コードのリファクタリングを学ぶことの重要性を説明するだけです。上記の例を見てください。if/ elseまたはスイッチコードは簡単だと思います、プログラマー難しすぎて、学習は無限大です。私は毎日自分自身を超えたいと思っています。悪い文章をスプレーしないでください。技術は限られています。より多くのガイダンスを提供したいと思います。ありがとう