【问题标题】:Java: Encapsulating if-return statement in a method call for cleaner, more concise code?Java:在方法调用中封装 if-return 语句以获得更简洁、更简洁的代码?
【发布时间】:2015-09-21 06:44:49
【问题描述】:

我正在学习 Java,同时也在学习代码设计方面的书籍。

我想知道,在 Java 中是否有可能将 if 语句封装在方法调用中,如果 boolean 为假,则允许以某种方式退出父方法?

我想知道的是,如果我可以进一步提炼以下代码

public void addStock (String stock) {

boolean stockNameIsValid = testStringForValidStockName(stock);
    if (stockNameIsValid == false){
        JOptionPane.showMessageDialog(getParent(), "Invalid text entered. Stock ticker names may only include upper-case alphabetical letters.", "Invalid Text Entry Error", JOptionPane.ERROR_MESSAGE);
        return;
    }

boolean stockAlreadyExistsInPanel = testForStockExistenceInListingPanel(stock); 
    if(stockAlreadyExistsInPanel == true){
        JOptionPane.showMessageDialog(getParent(), "The same stock cannot be entered twice into the list of stocks being watched.", "Redundant Stock Error", JOptionPane.ERROR_MESSAGE);
        return;
    }

    controller.addStockToDb(stock);

}

变成类似

public void addStock(String stock){
    giveErrorAndReturnIfStockNameInvalid(stock);
    giveErrorAndReturnIfStockCannotBeFound(stock);
    controller.addStockToDb(stock);
}

我想知道这样做是否可行,因为我的 IDE 无法进一步提取上面的代码,并且我认为按照上面的第二种方式塑造我的代码会更好地传达意图,并且比最初的例子。

我有这个想法是因为我目前正在阅读 Bob 叔叔的“清洁代码”一书,里面说方法最终应该尽可能短。如果我在方法调用中封装较低级别的逻辑,那么它会使代码反映较高级别的逻辑。这使得代码更容易理解,因为它需要更少的开发人员的脑力资源来获得代码各部分功能的一般概念。

我的目标是让读者不必实际分析此处代码的实现细节,除非绝对必要。因此,读者不必通读整个方法来理解它,而是可以获得我的代码逻辑的更抽象的表示。

【问题讨论】:

  • 你可以抛出异常
  • 永远不要将booleantruefalse 进行比较if(x == true) 应该总是写成if(x)。显式比较不仅丑陋而且容易出错 - if(x = true) 也会编译(如果你能告诉我它的作用,5 分)。
  • @BoristheSpider 另一方面,也应该不鼓励使用if(!x)。因为它不太可读,有时您的大脑会在复杂的应用程序中错过这一行中的point。如果我错了,请纠正我。
  • 问自己以下问题:addStock 方法是否也应该负责显示错误消息? (请记住,您已经在尝试清理代码
  • @TAsk 你会建议什么作为替代方案? if(x == false) 与 true 相比具有相同的问题,if(x != true) 可能与 if(!x) 具有相同的问题,但相当丑陋。我想说,如果有人无法在 if 语句中发现 !,那么他们可能不应该编程。

标签: java oop coding-style code-cleanup


【解决方案1】:

我们必须使用异常,下面的伪代码解释相同:

public void addStock(String stock){
    try {
        isStockNameValid(stock);
        isStockExists(stock);
        controller.addStockToDb(stock);
   } catch(IllegalArgumentException exe) {

   }
}

public boolean isStockNameValid(stock) throws IllegalArgumentException {
      //check stock name is valid, if not
      throw new IllegalArgumentException("Stock Name already exists");
}

public boolean isStockExists(stock) throws IllegalArgumentException {
      //check stock exists, if not
      throw new IllegalArgumentException("Stock Name already exists");
}

【讨论】:

    【解决方案2】:

    如果 addStock 方法的参数不合法,这些方法可能会抛出一个非法参数异常,例如:

    public void giveErrorAndReturnIfStockNameInvalid(String stock)
    {
        // TODO: Check stock name
        if(stock...)
        {
            throw new IllegalArgumentException("Stock has no valid name:"+stock);
        }
    }
    

    注意这个 (IllegalArgumentException) 是一个未经检查的异常,因此如果未在调用方法中处理,您可能会获得未捕获的运行时异常,另一种选择可能是创建一个新的特定于域的异常,如“InvalidStockException”并使其检查,所以任何人使用此方法将被强制添加一个 try-catch 块,以防万一出现问题并显示错误消息。

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2018-06-05
      相关资源
      最近更新 更多