我是一名初級開發人員,希望更好地組織我的代碼。
現在,我正在處理表格編號。我檢索表單編號的哈希映射,并且基于表單編號,我需要呼叫不同的方法。每個方法都接受相同的引數,但做的事情不同。
例如:
var formDetails = new inferForms.buildFormsMap
for(form in formDetails){
switch(form.formNumber){
case "A1345":
getExclusionDetails(account, state, form, businessDealing)
break
case "B254":
getExclusionDetails(account, state, form, businessDealing)
break
case "B297":
getPartnershipDetails(account, state, form, businessDealing)
break
case "C397":
getBrokerageDetails(account, state, form, businessDealing)
break
case "D972":
getBrokerageDetails(account, state, form, businessDealing)
break
case "E192":
getBrokerageDetails(account, state, form, businessDealing)
break
case "E299":
getBrokerageDetails(account, state, form, businessDealing)
break
case "F254":
getLocationDetails(account, state, form, businessDealing)
break
case "F795":
getLocationDetails(account, state, form, businessDealing)
break
case "G642":
getContractDetails(period, wcmJurisdiction, newForm, wcmBusiness, frm)
break
case "G979":
getContractDetails(period, wcmJurisdiction, newForm, wcmBusiness, frm)
break
}
}
幾點注意事項:
- 這些方法是由另一個開發人員構建的。他辭職了,所以我承擔了他的作業并尋求重構以使其變得更好。
- 起點是表格編號的 HashMap。我生成 HashMap,然后回圈遍歷它以根據 HashMap 中的每個表單編號收集詳細資訊。
- 即使我要將方法轉換為物件繼承結構,我仍然需要一個 switch 陳述句來知道要實體化哪個子類,不是嗎?switch 陳述句看起來像上面的那個?
- 其中一些案例陳述句正在呼叫完全相同的方法。有沒有辦法避免重復?
感謝你的幫助。我正在努力弄清楚如何更好地重新設計它。如果我可以提供更多詳細資訊,請告訴我。
uj5u.com熱心網友回復:
至少某些情況下具有相同的主體-> 使用 switch 陳述句失敗
switch(form.formNumber){
case "A1345": // fall through
case "B254":
getExclusionDetails(account, state, form, businessDealing)
break;
case "B297":
getPartnershipDetails(account, state, form, businessDealing)
break
case "C397": // fall through
case "D972": // fall through
case "E192": // fall through
case "E299":
getBrokerageDetails(account, state, form, businessDealing)
break
case "F254": // fall through
case "F795":
getLocationDetails(account, state, form, businessDealing)
break;
case "G642": // fall through
case "G979":
getContractDetails(period, wcmJurisdiction, newForm, wcmBusiness, frm)
break;
}
uj5u.com熱心網友回復:
您可以將 switch case 替換為 if,else if,因為有多個條件具有相同的結果,它將減少重復。
var formDetails = new inferForms.buildFormsMap
for(form in formDetails){
var formNumber = form.formNumber
if(formNumber.equals("A1345") || formNumber.equals("A1345")){
getExclusionDetails(account, state, form, businessDealing)
} else if (formNumber.equals("B297") || formNumber.equals("C397")) {
getPartnershipDetails(account, state, form, businessDealing)
} else if (formNumber.equals("D972") || formNumber.equals("E192")) {
getBrokerageDetails(account, state, form, businessDealing)
} else if (formNumber.equals("F254") || formNumber.equals("F795")) {
getLocationDetails(account, state, form, businessDealing)
} else if (formNumber.equals("G642") || formNumber.equals("G979")) {
getContractDetails(period, wcmJurisdiction, newForm, wcmBusiness, frm)
}
}
uj5u.com熱心網友回復:
對我來說,您的案例似乎是工廠模式的不錯選擇。
首先定義一個抽象來收集不同的細節。
public interface DetailsManager {
void gatherDetails(String account, String state, String form, String businessDealing);
}
繼續具體的實作。
public class ExclusionDetailsManager implements DetailsManager {
@Override
public void gatherDetails(String account, String state, String form, String businessDealing) {
//do stuff
}
}
public class PartnershipDetailsManager implements DetailsManager {
@Override
public void gatherDetails(String account, String state, String form, String businessDealing) {
//do other stuff
}
}
為避免 switch 和 if-else 陳述句,您可以Map在工廠中使用。
public class DetailsManagerFactory {
private final Map<String, Supplier<DetailsManager>> map;
private final Supplier<DetailsManager> defaultSupplier;
public DetailsManagerFactory(Map<String, Supplier<DetailsManager>> map) {
this.map = map;
this.defaultSupplier = DefaultDetailsManager::new;
}
public DetailsManager getManager(String formNumber) {
return this.map.getOrDefault(formNumber, this.defaultSupplier).get();
}
private static final class DefaultDetailsManager implements DetailsManager {
@Override
public void gatherDetails(String account, String state, String form, String businessDealing) {
//default manager doing nothing, just making sure not to cause NPE
}
}
}
的創建DetailsManager被包裹在一個Supplier. 如果物件是重量級的,這將很有用——實體僅在需要時創建。如果不需要,您只需將地圖的值更改為DetailsManager.
public class CachingDetailsManagerSupplier implements Supplier<DetailsManager> {
private final Supplier<DetailsManager> managerSupplier;
private DetailsManager cache;
public CachingDetailsManagerSupplier(Supplier<DetailsManager> managerSupplier) {
this.managerSupplier = managerSupplier;
}
@Override
public DetailsManager get() {
if (this.cache == null) {
//init manager
this.cache = this.managerSupplier.get();
}
return this.cache;
}
}
該供應商會快取創建的實體,但根據您的具體用例,這可能是可取的/不需要的。
例子
//init factory where appropriate
Supplier<DetailsManager> exclusionManagerSupplier = new CachingDetailsManagerSupplier(ExclusionDetailsManager::new);
Map<String, Supplier<DetailsManager>> map = new HashMap<>();
map.put("A1345", exclusionManagerSupplier);
map.put("B254", exclusionManagerSupplier);
map.put("B297", new CachingDetailsManagerSupplier(PartnershipDetailsManager::new));
DetailsManagerFactory factory = new DetailsManagerFactory(map);
//gather details
for (Object form : formDetails) {
String formNumber = form.formNumber;
DetailsManager manager = factory.getManager(formNumber);
manager.gatherDetails(account, state, form, businessDealing);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488623.html
