先举个例子
public Result doSomething(String balabala);
public class Result{
private Long productId;
....
}
上面接口是其他部门的程序员提供给你的。没有文档,接口没有注释。
首先,我调用这个接口,
Result result= doSomething("fuck");
调用之后,我要返回的productId再去请求其他接口,做其他一些事情。
问题来了:
对这个返回的result,你是直接result.getProductId(); 还是先判断一下,result!= null 然后再result.getProductId();那productId又是Result里的引用类型,你拿到productId要不要再productId != null
,Result还有其他的引用类型,是不是我每用一个非得判空?
可能每个人的习惯不一样,比如写那个接口,有的人是哪怕什么信息都没有返回,也返回一个空的result。有的人是如果没有信息返回就返回null。如果只要是引用类型,我都判断是否为空,是不是显得“过于谨慎”了。文档,注释也不可能规定的那么细,程序员之间的约定吧,那一个几百人的团队,难免会有不遵循约定的。你们是如何处理的?
又比如一条记录,业务上规定,productId不可能为空的,但是这条记录的插入涉及到两条sql语句,一个程序员的失误没有保证原子性,导致productId为空的记录被插入进去了。这时候,我一旦涉及到处理productId,没有判空,则很有可能导致异常
巴扎黑2017-04-18 09:56:07
信じられません。問題がある場合、例外は xx インターフェイス xx の呼び出しによって発生することを示します。このように、問題がある場合は実行できません。あなたを見つけるために。 。 。
黄舟2017-04-18 09:56:07
実際には、あなたはすでに答えを知っていますが、このようなコードを書くのはあまりにも面倒なので、誰かに「必要ありません」と言われたいと思っています。
しかし、あなたも事実を知っています。
この問題と似ているのは、フロントエンドから送信されたデータを決して信頼しないことです。
同様に、社内に規範がなく、全員のスキルレベルが異なる場合、この不信感はさらに大きくなります。書かれた最終コードは、一連のビジネス コードを記述するために、複数の防御コード層で囲まれる場合があります。このプロジェクトの維持費はますます高くなるだろう。
この問題が頻繁に発生する場合は、上位レベルのリーダーシップに任せて、上位レベルから問題を解決する必要があります。
個人的な意見: Result
にerrorCode
フィールドを追加すると、データを取得する人はこの値に基づいて返された結果が正当であるかどうかを判断します。
前提条件:
1. errorCode=0
は合法ですが、残りは違法です。
の前提: 1. 返された
は Result
です。個人的には、この状況は null
レベルに属すると思います (しかし、ほとんどのプログラマーは warning
を無視すると聞きました。 )、この状況に遭遇した場合は、インターフェースプロバイダーに質問し、相手に戻り値を標準化するよう提案することをお勧めします。warning
2. 返された
は Result
ではなく、null
です。 errorCode=0
はまだ無効です: この状況は productId
レベルに達しており、現時点では相手との真剣な交渉が必要です: error
a) 相手と口論する自信があるなら、そのままやってください。
b) a が機能しない場合は、上司に問題を報告し、問題の解決を手伝ってもらいます。
c) b) が機能しない場合は、可能であれば続けてください。できません。
怪我咯2017-04-18 09:56:07
私が運転を習っていたとき、コーチは「他人の運転スキルを決して信用してはいけない。」と言いました。同じように、お互いに同意してメールで確認しない限り、他の豚のチームメイトが厳密なコードを書くことを決して信用してはいけません。さまざまな状況。
大家讲道理2017-04-18 09:56:07
は、インターフェースの意味が「skuId
を通じて製品の詳細を取得する」である場合、このビジネス シナリオでは、サービス プロバイダーに対して skuId
を渡すときに決定されます。システム 🎜> に存在しないため、インターフェースが null
を返すのは合理的です。そのため、ここでは Result
Result
の productId
を空にする必要があるかどうかは、インターフェイス サービス プロバイダーに問い合わせる必要があります (productId
が空かどうか)、個人的にはインターフェイスを外部とフィールドに公開することをお勧めします。返されたエンティティに表示される値が意味があることを確認する必要があります (たとえば、ビジネス用語では productId
を空にすることはできません。インターフェイスによって返されるエンティティにこのフィールドが含まれる場合、このフィールドは空であってはなりません)。空)
投稿者は、プログラマーのトランザクションがアトミック性を保証しない場合、問題が発生した場合に迅速に修復するために、前提条件 productId
を 2 つの部分に分けて解決する必要があると述べました。オンラインBUG
では、最後の緊急バージョンが null 判定のために処理されるようにします。通常の状況では、null を判定する必要がないため、エラーができるだけ早く公開されます
このサービスが依存度の低いサービスである場合は、サービス プロバイダーのインターフェイスが標準化された方法で記述されていない場合でも影響を受けないよう、必要に応じてこの不安定なインターフェイスをダウングレードすることをお勧めします。プロセス自体
PHP中文网2017-04-18 09:56:07
多くの人はルールを破ったり、ルールに従っていないことをしたりするため、インターフェースは信頼されていないと考えています。
しかし、インターフェースを定義する目的は、実装されたクラスがそのルールに従って動作するようにすることです。したがって、最初に信頼する姿勢をとるべきです。
もちろん、誰でも、どんなプログラムでも間違いを犯す可能性はあります。インターフェイスの実装に実際にエラーがある場合は、相手が修正するのを待つ前に、バグ レポートを送信する必要があります。エラーを避けるための独自のコード。ただし、これは一時的な解決策であり、一時コードのこの部分はインターフェイス実装者がバグを修正した後に削除されることをコメントで指摘する必要があります (削除されない可能性は排除されませんが、コメントで説明されます)。その理由を後世に伝えます)。
一般的には、ルールに従い、信頼を重視してください。ただし、一部のインターフェイス実装エラーが発生し、それらを処理するために一時的なコードが必要になる可能性も排除されません。
追加: 文書化されたインターフェイスはありません。つまり、ルールが不明瞭です。ルールが不明確であれば、あらゆる状況を考慮することしかできず、不信感につながります。
迷茫2017-04-18 09:56:07
プログラムにはコンテキストがあり、インターフェースは標準化されています。特定の機能を実装する前に誰もが関連する合意を行っているため、NullPointerException
を防ぐために盲目的にコードを記述するのではなく、仕様に従って実装する必要があります。