在现有 xmlbeans Java 代码库中处理嵌套空检查的实用方法?

Pragmatic way of handling nested null checks in existing xmlbeans Java codebase?

这是一个很常见的问题,但我需要说的是,您建议这是一个重复的问题不包含适合我们情况的解决方案。

在工作中,我们在一个已有 8 年历史的代码库上使用 xmlbeans,委婉地说,它没有得到很好的处理。当然,真正的解决方案是我们不应该使用 null 作为信息(并且可能根本不使用 xmlbeans),但我正在寻找处理以下问题的最不可怕的方法:

如果我们有一个 Person 实体,它可以选择性地具有 Wallet 的子实体,它可以选择性地具有 WalletItems 的子实体,它可以选择性地具有 Card 的子实体,而 Card 可以具有 CardNumber,检查是否最实用的方法是什么一个人至少有一个 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 但我们被卡住了暂时用它,太依赖它了。

Robert C. Martin 在“整洁代码”中关于函数的一些引用。

The first rule of functions is that they should be small.

Functions should do something, or answer something, but not both.

恕我直言,最好的方法可能是这样的:

    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 函数正在回答所有可取的检查对象是否正常。你的职能:

  1. 检查对象是否为空并回答是否可以。所以做这两件事
  2. 第二个和第一个一样,在我看来是 对我来说很难读。所以不可读,同时做两件事。
  3. 第三个一样。它在做两件事 回答并做点什么,太长了。

以及我关于使用逻辑运算符的内容。我认为,如果您的代码中的逻辑运算符较少,那么对于未来的重构和一般阅读来说会更好,因为

if you want to go fast, if you want to get done quickly, if you want your code to be easy to write, make it easy to read