Java:在方法调用中封装 if-return 语句以获得更简洁、更简洁的代码?
Java: Encapsulating if-return statement in a method call for cleaner, more concise code?
我正在学习 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 无法进一步提取上面的代码,并且我认为我的代码按照上面的第二种方式进行调整会更好地传达意图并且有一个比初始示例更高的抽象级别。
我有这个想法是因为我目前正在阅读 Uncle Bob 的 "Clean Code" 书,里面说方法最终应该尽可能短。如果我在方法调用中封装较低级别的逻辑,那么它会留下反映较高级别逻辑的代码。这使得代码更容易理解,因为它需要更少的开发人员的脑力资源来获得代码每个部分的作用的一般概念。
我的目标是消除 reader 除非绝对必要,否则实际上必须分析此处代码的实现细节。因此,不必通读整个方法来理解它,reader 可以获得代码逻辑的更抽象表示。
如果 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 块,以防万一出现问题并显示错误消息。
我们必须使用异常,下面的伪代码解释相同:
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");
}
我正在学习 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 无法进一步提取上面的代码,并且我认为我的代码按照上面的第二种方式进行调整会更好地传达意图并且有一个比初始示例更高的抽象级别。
我有这个想法是因为我目前正在阅读 Uncle Bob 的 "Clean Code" 书,里面说方法最终应该尽可能短。如果我在方法调用中封装较低级别的逻辑,那么它会留下反映较高级别逻辑的代码。这使得代码更容易理解,因为它需要更少的开发人员的脑力资源来获得代码每个部分的作用的一般概念。
我的目标是消除 reader 除非绝对必要,否则实际上必须分析此处代码的实现细节。因此,不必通读整个方法来理解它,reader 可以获得代码逻辑的更抽象表示。
如果 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 块,以防万一出现问题并显示错误消息。
我们必须使用异常,下面的伪代码解释相同:
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");
}