簡體   English   中英

如何避免那么多的if語句

[英]How to avoid so many if else statements

我正在實現一個類,該類掃描數據庫中的數據,並根據數據庫中的內容在表中顯示數據。 但是,為了滿足數據庫中所有可能的返回值並受JTable顯示信息的方式的限制,我發現自己編寫了很多if else語句,這些語句很容易出錯。

package googo.pmms.project2.financialStatement;

import googo.pmms.project2.frameHelper.ReportsModelData;
import java.util.List;
import java.util.Map;
import javax.swing.JTable;
import javax.swing.table.TableRowSorter;

public class TheBalanceSheet implements BalanceSheet {
    ReportsModelData model1;
    String title;
    List<String> tableHeaders;
    List<Object> dataBody;

    Map<Integer, List<Object>> data;

    BalanceSheetUtility bUtility = new BalanceSheetUtility();

    public TheBalanceSheet() {
    }

    public boolean createBalanceSheet(JTable table, String materialDate) {    
        boolean bs = true;    
        AssetAccount asset = new AssetAccount(materialDate);

        LiabilityEquityAccounts liabEqui = new LiabilityEquityAccounts(materialDate);

        if (!asset.isAssetsEmpty()) {    
            this.setBodyMap(0, asset.mainAssetTitle());
            if (!asset.isCurrentAssetsEmpty()) {
                this.setBodyMap(1, asset.currentAssetTitle());
                this.setBodyMap(2, asset.currentAssets());
                this.setBodyMap(3, asset.totalCurrentAssets());

                if (!asset.isNonCurrentAssetsEmpty()) {
                    this.setBodyMap(4, asset.nonCurrentAssetTitle());
                    this.setBodyMap(5, asset.nonCurrentAssets());
                    this.setBodyMap(6, asset.totalNonCurrentAssets());
                    this.setBodyMap(7, this.totalAssets());

                    if (!liabEqui.isLiabilitiesEmpty()) {

                        this.setBodyMap(8, liabEqui.mainLiabilitiesEquityTitle());

                        if (!liabEqui.isCurrentLiabilityEmpty()) {

                            this.setBodyMap(9, liabEqui.currentLiabilitiesTitle());
                            this.setBodyMap(10, liabEqui.currentLiabilities());
                            this.setBodyMap(11, liabEqui.totalCurrentLiabilities());

                            if (!liabEqui.isNonCurrentLiabilityEmpty()) {
                                this.setBodyMap(12, liabEqui.nonCurrentLiabilitiesTitle());
                                this.setBodyMap(13, liabEqui.nonCurrentLiabilities());
                                this.setBodyMap(14, liabEqui.totalNonCurrentLiabilities());
                                this.setBodyMap(15, this.totalLiabilities());

                                if (!liabEqui.isEquityEmpty()) {
                                    this.setBodyMap(16, liabEqui.equityTitle());
                                    this.setBodyMap(17, liabEqui.equity());
                                    this.setBodyMap(18, liabEqui.totalEquity());
                                    this.setBodyMap(19, this.totalLiabilitiesEquity());
                                }

                            } else if (!liabEqui.isEquityEmpty()) {
                                this.setBodyMap(12, liabEqui.equityTitle());
                                this.setBodyMap(13, liabEqui.equity());
                                this.setBodyMap(14, liabEqui.totalEquity());
                                this.setBodyMap(15, this.totalLiabilitiesEquity());
                            }    
                        } else if (!liabEqui.isNonCurrentLiabilityEmpty()) {

                            this.setBodyMap(9, liabEqui.nonCurrentLiabilitiesTitle());
                            this.setBodyMap(10, liabEqui.nonCurrentLiabilities());
                            this.setBodyMap(11, liabEqui.totalNonCurrentLiabilities());
                            this.setBodyMap(12, this.totalLiabilities());

                            if (!liabEqui.isEquityEmpty()) {
                                this.setBodyMap(13, liabEqui.equityTitle());
                                this.setBodyMap(14, liabEqui.equity());
                                this.setBodyMap(15, liabEqui.totalEquity());
                                this.setBodyMap(16, this.totalLiabilitiesEquity());
                            }
                        } else {
                      }
                    }
                } else { 
                    this.setBodyMap(4, this.totalAssets());

                    if (!liabEqui.isLiabilitiesEmpty()) {
                      this.setBodyMap(5, liabEqui.mainLiabilitiesEquityTitle());
                    if (!liabEqui.isCurrentLiabilityEmpty()) {
                        this.setBodyMap(6, liabEqui.currentLiabilitiesTitle());
                        this.setBodyMap(7, liabEqui.currentLiabilities());

                            this.setBodyMap(8, liabEqui.totalCurrentLiabilities());

                            if (!liabEqui.isNonCurrentLiabilityEmpty()) {

                                this.setBodyMap(9, liabEqui.nonCurrentLiabilitiesTitle());

                                this.setBodyMap(10, liabEqui.nonCurrentLiabilities());

                                this.setBodyMap(11, liabEqui.totalNonCurrentLiabilities());

                                this.setBodyMap(12, this.totalLiabilities());

                                if (!liabEqui.isEquityEmpty()) {

                                    this.setBodyMap(13, liabEqui.equityTitle());
                                    this.setBodyMap(14, liabEqui.equity());
                                    this.setBodyMap(15, liabEqui.totalEquity());
                                    this.setBodyMap(16, this.totalLiabilitiesEquity());
                                }

                            } else if (!liabEqui.isEquityEmpty()) {
                                this.setBodyMap(9, liabEqui.equityTitle());
                                this.setBodyMap(10, liabEqui.equity());
                                this.setBodyMap(11, liabEqui.totalEquity());
                                this.setBodyMap(12, this.totalLiabilitiesEquity());
                            }

                        } else if (!liabEqui.isNonCurrentLiabilityEmpty()) {

                            this.setBodyMap(6, liabEqui.nonCurrentLiabilitiesTitle());
                            this.setBodyMap(7, liabEqui.nonCurrentLiabilities());
                            this.setBodyMap(8, liabEqui.totalNonCurrentLiabilities());
                            this.setBodyMap(9, this.totalLiabilities());

                            if (!liabEqui.isEquityEmpty()) {
                                this.setBodyMap(10, liabEqui.equityTitle());
                                this.setBodyMap(11, liabEqui.equity());
                                this.setBodyMap(12, liabEqui.totalEquity());
                                this.setBodyMap(13, this.totalLiabilitiesEquity());
                            }
                        } else if (!liabEqui.isEquityEmpty()) {
                            this.setBodyMap(6, liabEqui.equityTitle());
                            this.setBodyMap(7, liabEqui.equity());
                            this.setBodyMap(8, liabEqui.totalEquity());
                            this.setBodyMap(9, this.totalLiabilitiesEquity());
                        }

                    }
                }

            } else if (!asset.isNonCurrentAssetsEmpty()) {

                this.setBodyMap(1, asset.nonCurrentAssetTitle());
                this.setBodyMap(2, asset.nonCurrentAssets());
                this.setBodyMap(3, asset.totalNonCurrentAssets());
                this.setBodyMap(4, this.totalAssets());

                if (!liabEqui.isLiabilitiesEmpty()) {

                    this.setBodyMap(5, liabEqui.mainLiabilitiesEquityTitle());

                    if (!liabEqui.isCurrentLiabilityEmpty()) {

                        this.setBodyMap(6, liabEqui.currentLiabilitiesTitle());
                        this.setBodyMap(7, liabEqui.currentLiabilities());
                        this.setBodyMap(8, liabEqui.totalCurrentLiabilities());
                        if (!liabEqui.isNonCurrentLiabilityEmpty()) {

                            this.setBodyMap(9, liabEqui.nonCurrentLiabilitiesTitle());
                            this.setBodyMap(10, liabEqui.nonCurrentLiabilities());
                            this.setBodyMap(11, liabEqui.totalNonCurrentLiabilities());
                            this.setBodyMap(12, this.totalLiabilities());

                            if (!liabEqui.isEquityEmpty()) {
                                this.setBodyMap(13, liabEqui.equityTitle());
                                this.setBodyMap(14, liabEqui.equity());
                                this.setBodyMap(15, liabEqui.totalEquity());
                                this.setBodyMap(16, this.totalLiabilitiesEquity());
                            }
                        } else if (!liabEqui.isEquityEmpty()) {
                            this.setBodyMap(9, liabEqui.equityTitle());
                            this.setBodyMap(10, liabEqui.equity());
                            this.setBodyMap(11, liabEqui.totalEquity());
                            this.setBodyMap(12, this.totalLiabilitiesEquity());
                        }

                    } else if (!liabEqui.isNonCurrentLiabilityEmpty()) {

                        this.setBodyMap(6, liabEqui.nonCurrentLiabilitiesTitle());
                        this.setBodyMap(7, liabEqui.nonCurrentLiabilities());
                        this.setBodyMap(8, liabEqui.totalNonCurrentLiabilities());
                        this.setBodyMap(9, this.totalLiabilities());

                        if (!liabEqui.isEquityEmpty()) {
                            this.setBodyMap(10, liabEqui.equityTitle());
                            this.setBodyMap(11, liabEqui.equity());
                            this.setBodyMap(12, liabEqui.totalEquity());
                            this.setBodyMap(13, this.totalLiabilitiesEquity());
                        }

                    } else if (!liabEqui.isEquityEmpty()) {

                        this.setBodyMap(6, liabEqui.equityTitle());
                        this.setBodyMap(7, liabEqui.equity());
                        this.setBodyMap(8, liabEqui.totalEquity());
                        this.setBodyMap(9, this.totalLiabilitiesEquity());

                    }
                }
            }

        } else if (!liabEqui.isLiabilitiesEmpty()) {

            this.setBodyMap(0, liabEqui.mainLiabilitiesEquityTitle());

            if (!liabEqui.isCurrentLiabilityEmpty()) {
                this.setBodyMap(1, liabEqui.currentLiabilitiesTitle());
                this.setBodyMap(2, liabEqui.currentLiabilities());
                this.setBodyMap(3, liabEqui.totalCurrentLiabilities());

                if (!liabEqui.isNonCurrentLiabilityEmpty()) {

                    this.setBodyMap(4, liabEqui.nonCurrentLiabilitiesTitle());
                    this.setBodyMap(5, liabEqui.nonCurrentLiabilities());
                    this.setBodyMap(6, liabEqui.totalNonCurrentLiabilities());

                    this.setBodyMap(7, this.totalLiabilities());

                    if (!liabEqui.isEquityEmpty()) {

                        this.setBodyMap(8, liabEqui.equityTitle());
                        this.setBodyMap(9, liabEqui.equity());
                        this.setBodyMap(10, liabEqui.totalEquity());
                        this.setBodyMap(11, this.totalLiabilitiesEquity());
                    }

                } else if (!liabEqui.isEquityEmpty()) {

                    this.setBodyMap(4, liabEqui.equityTitle());
                    this.setBodyMap(5, liabEqui.equity());
                    this.setBodyMap(6, liabEqui.totalEquity());
                    this.setBodyMap(7, this.totalLiabilitiesEquity());
                }
            } else if (!liabEqui.isNonCurrentLiabilityEmpty()) {

                this.setBodyMap(1, liabEqui.nonCurrentLiabilitiesTitle());
                this.setBodyMap(2, liabEqui.nonCurrentLiabilities());
                this.setBodyMap(3, liabEqui.totalNonCurrentLiabilities());

                this.setBodyMap(4, this.totalLiabilities());

                if (!liabEqui.isEquityEmpty()) {

                    this.setBodyMap(5, liabEqui.equityTitle());
                    this.setBodyMap(6, liabEqui.equity());
                    this.setBodyMap(7, liabEqui.totalEquity());
                    this.setBodyMap(8, this.totalLiabilitiesEquity());
                }

            } else if (!liabEqui.isEquityEmpty()) {
            }
            this.setBodyMap(1, liabEqui.equityTitle());
            this.setBodyMap(2, liabEqui.equity());
            this.setBodyMap(3, liabEqui.totalEquity());
            this.setBodyMap(4, this.totalLiabilitiesEquity());

        } else {

            bs = false;
        }

        model1 = new ReportsModelData(getBodyMap(), getTableHeaders());
        table.setModel(model1);

        TableRowSorter<ReportsModelData> sorter = new TableRowSorter<>(model1);
        table.setRowSorter(sorter);

        return bs;
    }

    private List totalAssets() {

    }

    private List totalLiabilities() {

    }

    private List totalEquity() {

    }

    private List totalLiabilitiesEquity() {

    }

    @Override
    public String getTitle(String date) {
        return title;
    }

    @Override
    public List<String> getTableHeaders() {
        return tableHeaders;
    }

    @Override
    public List<Object> getBodyList() {
        return dataBody;
    }

    @Override
    public Map<Integer, List<Object>> getBodyMap() {
        return data;
    }

    @Override
    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public void setTableHeader(String header) {
        tableHeaders.add(header);
    }

    @Override
    public void setBodyList(String body) {
        dataBody.add(body);
    }

    @Override
    public void setBodyMap(Integer index, List<Object> body) {
        data.put(index, body);
    }

}

我怎樣才能更好地實施這一節課?

由於冗余索引鍵會不斷更改位置,因此您不得不使用所有這些嵌套語句。 使用列表而不是地圖應該可以解決大多數問題:

private List<List<Object>> data = new ArrayList<>();

public boolean createBalanceSheet(JTable table, String materialDate) {
    //...
    if (!asset.isAssetsEmpty()) {
        data.add(asset.mainAssetTitle());
    }

    if (!asset.isCurrentAssetsEmpty()) {
        data.add(asset.currentAssetTitle());
        data.add(asset.currentAssets());
        data.add(asset.totalCurrentAssets());
    }

    if (!asset.isNonCurrentAssetsEmpty()) {
        data.add(asset.nonCurrentAssetTitle());
        data.add(asset.nonCurrentAssets());
        data.add(asset.totalNonCurrentAssets());
        data.add(this.totalAssets());
    }

    // and so on...
}

如果絕對必須返回Map<Integer, List<Object>> ,則可以輕松轉換列表以產生相同的結果:

@Override
public Map<Integer, List<Object>> getBodyMap() {
    Map<Integer, List<Object>> result = new HashMap<>();
    for (int i = 0; i < data.size(); i++) {
        result.put(i, data.get(i));
    }
    return result;
}

典型的答案是:查看“ 單一責任原則”和多態性。 在這里起作用的另一條規則: 告訴不要問

含義:您的代碼正在要求其他對象提供一些內部狀態信息。 基於這些信息,該代碼可以做出決策。 “更多面向對象”方法是: 告訴其他對象自己做某事。 它最了解其內部狀態。

除此之外; 您的問題無法輕易解決。 您必須邁出一步,看看“整個”事情。 基本上,您有一些“輸入數據”和一組“規則”來確定如何從該輸入構建“輸出”。 真正的解決方案將對這些元素(輸入,輸出, 規則 )進行建模 ,並允許您以“表格”形式表達所需的關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM