这是一个很常见的问题,但我需要说的是,您提出的这个问题与包含适合我们情况的解决方案并不重复。
在工作中,我们在一个8岁的代码库上使用xmlbeans,并巧妙地说它没有得到很好的处理。当然,真正的解决方案是我们不应该使用null作为信息(并且可能根本不使用xmlbeans),但我正在研究处理以下问题的最不可靠的方法:
如果我们有一个Person的实体,它可以选择性地拥有Wallet的子实体,它可以选择包含WalletItems的子实体,可以选择具有可以拥有CardNumber的Card的子实体,这是什么最实用的方法。检查一个人是否至少有一个CardNumber?
我们有三个有效的解决方案,以及团队应该坚持的论点:
isCardHolder(Person person){
if (person != null && person.getWallet != null &&
person.getWallet.getWalletItems != null &&
person.getWallet.getWalletItems.get(0) != null && // Just a dirty example, don't worry here
person.getWallet.getWalletItems.get(0).getCard != null &&
person.getWallet.getWalletItems.get(0).getCard.getCardNumber != null){
return true;
} else {
return false;
}
或者:
isCardHolder(Person person){
Wallet wallet = (Person != null ? person.getWallet : null);
WalletItems[] walletItems = (wallet != null ? wallet.getWalletItems : null);
// etc etc
if (card.getCardNumber != null) {
return true;
} else {
return false;
}
}
甚至:
isCardHolder(Person person){
try {
if (person.getWallet.getWalletItems.get(0).getCard.getCardNumber != null){
return true;
}
} finally {
return false;
}
}
我个人的偏好是将其烧掉并重新开始,或至少放弃xmlbeans,以便我们可以使用Null Object模式或标准问题中的任何其他内容on this topic但我们会卡住现在用它来取决于它。
答案 0 :(得分:1)
Robert C. Martin的一些引言"清洁代码"关于功能。
功能的第一条规则是它们应该很小。
函数应该做某事,或回答某些事情,但不能同时回答。
恕我直言,这样做的最佳方式可能是:
package com.example.sampl;
public class MainSampl {
public static void main(String[] args) {
Person p = new Person();
boolean correct = isCorrect(p);
System.out.println(correct);
}
private static boolean isCorrect(Person person){
return isNotNull(person) &&
isNotNull(person.getWallet()) &&
isNotNull(person.getWallet().getWalletItems()) &&
isNotNull(person.getWallet().getWalletItems().getItems().get(0));
//etc
}
private static boolean isNotNull(Object data) {
return data != null;
}
}
所以我认为我的isNotNull
函数正在回答参数是否正常然后isCorrect
函数回答所有优先检查对象是否正常。你的职能:
关于使用逻辑运算符。我认为如果你的代码中的逻辑运算符较少,那么对于将来的重构更好,并且通常更好地阅读它,因为
如果你想要快速,如果你想快速完成,如果你想 您的代码易于编写,易于阅读