使用数组来最小化变量的使用

Using array to minimize variable usage

为了不创建不必要的变量并在方法的范围内混乱,否则我已经非常苗条了,相反,我创建了一个临时文件来保存我正在处理的所有文件将在整个方法的其余部分进行引用。

我不喜欢这个解决方案,因为它会在每次 运行 不需要创建数组对象时创建一个数组对象。

我也不能使用数组或变量墙,而是直接引用 get 方法,但这会造成很多冗余,因为我重复执行相同的方法,我更不喜欢这样。

public void savePrices() {
    MFilePrices file[] = {AutoEcon.files().getPrices(), AutoEcon.files().getIntangibles(), AutoEcon.files().getGroups()};
    for (String price : sellPrices.keySet()) {
        if (EconItem.fromString(price) != null) {
            file[0].setPrice(price, sellPrices.get(price).getExpression());
            file[0].setBuyRate(price, sellPrices.get(price).getBuyRate());
        } else if (file[1].getLabels().contains(price)) {
            file[1].setPrice(price, sellPrices.get(price).getExpression());
            file[1].setBuyRate(price, sellPrices.get(price).getBuyRate());
        } else if (file[2].getLabels().contains(price)) {
            file[2].setPrice(price, sellPrices.get(price).getExpression());
            file[2].setBuyRate(price, sellPrices.get(price).getBuyRate());
        }
    }
}

public Double setExpression(String id, String expr) {
    savePrices();
    MFilePrices file[] = {AutoEcon.files().getPrices(), AutoEcon.files().getIntangibles(), AutoEcon.files().getGroups()};
    if (EconItem.fromString(id) != null)
        file[0].setPrice(id, expr);
    else if (file[1].getLabels().contains(id))
        file[1].setPrice(id, expr);
    else if (file[2].getLabels().contains(id))
        file[2].setPrice(id, expr);
    else return null;
    sellPrices.clear();
    total=0;
    loadPrices(AutoEcon.plugin());
    return sellPrices.get(id).getPrice();
}

另一种解决方案可能是在我从中获取文件的文件池 class 中创建一个数组,其中包含这三个配置文件,或者将它们放入一个数组并通过大批。然而,后者只是将问题转移到另一个 class,而前者仍在创建一个并非完全必要的数组。 这两种解决方案都只是将问题从一个 class 转移到另一个

public class FilePool {

    private Config config;
    private Prices prices;
    private Intangibles i;
    private Groups groups;
    private Logs econLogs;
    private ItemAliases a;

    public FilePool(AutoEcon pl) {
        config = new Config(pl);
        prices = new Prices(pl);
        i = new Intangibles(pl);
        econLogs = new Logs(pl);
        a = new ItemAliases(pl);
        new ReadMe(pl);
    }

    public Config getConfig() {
        return config;
    }

    public Prices getPrices() {
        return prices;
    }

    public Groups getGroups() {
        return groups;
    }

    public Intangibles getIntangibles() {
        return i;
    }

    public Logs getLogs() {
        return econLogs;
    }

    public ItemAliases getAliases() {
        return a;
    }

}    

(忽略 FilePool class 中的愚蠢变量名称,我只是喜欢它们排列得如此完美这一事实。将在发布前适当命名) 我知道我对这个根本不会影响 运行ning 程序的小东西有点过分了,但是在过去我的同事不断骚扰我的代码的每个小细节之后,我已经成长为一个有点完美主义者。

感谢所有花时间阅读本文的人。 <3

数组的创建没有问题。创建数组的资源是没有意义的。更严重的问题是,任何阅读您的代码的人都将很难在不返回数组的情况下理解魔法索引代表什么。这意味着您应该将它们变成命名常量,这会使您的代码更加复杂。

更好的方法是使用明确的变量名称来表示每个元素所代表的内容。遍历地图也是一个好主意,这样您就可以避免获取每个项目的值:

FilePool files = AutoEcon.files();
final MFilePrices prices = files.getPrices();
final MFilePrices intangibles = files.getIntangibles();
final MFilePrices groups = files.getGroups();
sellPrices.forEach((price, value) -> {
    if (EconItem.fromString(price) != null) {
        setPriceAndBuyRate(prices, price, value);
    } else if (intangibles.getLabels().contains(price)) {
        setPriceAndBuyRate(intangibles, price, value);
    } else if (groups.getLabels().contains(price)) {
        setPriceAndBuyRate(groups, price, value);
    }
});

private void setPriceAndBuyRate(MFilePrices filePrices, Price price, Value value) {
    filePrices.setPrice(price, value.getExpression());
    filePrices.setBuyRate(price, value.getBuyRate());
}

如果您担心变量的数量使方法难以阅读,那么将比较价格与标签并将价格和购买率设置到单独的逻辑中 class。在任何情况下,这都是一个很好的做法,因为它为 class 提供了一个更改的单一理由。