null
用途はアプリケーション/言語に依存します
最終的に、null
有効なアプリケーション値として使用するかどうかの選択は、主にアプリケーションとプログラミング言語/インターフェース/エッジによって決まります。
基本的なレベルでは、値のクラスが異なる場合、特殊タイプを使用することをお勧めします。null
インターフェイスで許可されていて、表現しようとしているプロパティのクラスが2つしかない場合は、オプションになる可能性があります。インターフェイスまたは形式で許可されている場合、プロパティを省略することもできます。新しい集約タイプ(クラス、オブジェクト、メッセージタイプ)は別のオプションです。
文字列の例として、これがプログラミング言語の場合、いくつか質問をします。
- 将来のタイプの値を追加する予定はありますか?もしそうなら、
Option
おそらくあなたのインターフェース設計にとってより良いでしょう。
- 消費者の呼び出しを検証する必要があるのはいつですか?静的に?動的に?前?後?まったく?プログラミング言語でサポートされている場合は、検証のために作成する必要のあるコードの量を避けるため、静的型付けの利点を活用してください。
Option
おそらく、文字列がnull不可である場合、このケースが最もよく満たされます。ただし、null
とにかく文字列値のユーザー入力をチェックする必要があるので、質問の最初の行:表現する値のタイプの数/表示を遅らせることになります。
- ある
null
私のプログラミング言語で、プログラマー誤差を示しますか?残念ながら、null
一部の言語では、初期化されていない(または明示的に初期化されていない)ポインターまたは参照のデフォルト値であることがよくあります。あるnull
デフォルト値として許容値として?それは安全なデフォルト値として?null
割り当て解除された値を示すこともあります。インターフェイスの消費者に、これらの潜在的なメモリ管理または初期化の問題をプログラムで示す必要がありますか?このような問題に直面した場合、このようなコールの失敗モードは何ですか?呼び出し元は私のプロセスと同じプロセスまたはスレッドにいるので、このようなエラーはアプリケーションにとって高いリスクになりますか?
これらの質問への回答に応じて、おそらくnull
インターフェイスに適しているかどうかに注目することができます。
例1
- アプリケーションは安全性が重要です
- 起動時に何らかのタイプのヒープ初期化を使用しており
null
、文字列にスペースを割り当てることができない場合に返される可能性のある文字列値です。
- このような文字列がインターフェイスにヒットする可能性があります
回答:null
おそらく適切ではない
理由:null
この場合、実際には2つの異なるタイプの値を示すために使用されます。最初の値は、インターフェイスのユーザーが設定するデフォルト値です。残念ながら、2番目の値は、システムが正しく機能していないことを示すフラグです。そのような場合、おそらくシステムで可能な限り安全に障害を起こしたいでしょう。
例2
char *
メンバーを持つC構造体を使用しています。
- システムはヒープ割り当てを使用せず、MISRAチェックを使用しています。
- インターフェースはこの構造体をポインタとして受け入れ、構造体がポイントしていないことを確認します
NULL
char *
API のメンバーのデフォルトの安全な値は、次の単一の値で示すことができますNULL
- ユーザーの構造体の初期化時に、
char *
メンバーを明示的に初期化しない可能性をユーザーに提供します。
回答:NULL
適切かもしれません
理由:構造体がNULL
チェックに合格するが、初期化されていない可能性が少しあります。ただし、構造体の値のチェックサムや構造体のアドレスの範囲チェックのいずれかまたは両方がない限り、APIはこれを考慮できない場合があります。MISRA-Cリンターは、初期化の前に構造体の使用にフラグを立てることにより、APIのユーザーを支援します。ただし、char *
メンバーについては、構造体へのポインターが初期化された構造体を指す場合、NULL
構造体初期化子の未指定メンバーのデフォルト値です。したがって、アプリケーションのstructメンバーのNULL
安全なデフォルト値として機能する場合がありchar *
ます。
シリアル化インターフェイス上にある場合、文字列にnullを使用するかどうかについて次の質問を自問します。
- ある
null
潜在的なクライアント側のエラーを示しますか?JavaScriptのJSONの場合null
、割り当ての失敗を示すものとして必ずしも使用されるとは限らないため、おそらくno です。JavaScriptでは、参照からオブジェクトが存在しないことを明示的に示すために、問題のある設定として使用されます。ただし、JSON null
をネイティブnull
タイプにマッピングする非JavaScriptパーサーおよびシリアライザーがあります。この場合、null
特定の言語、パーサー、シリアライザーの組み合わせでネイティブに使用してもよいかどうかの議論が必要です。
- プロパティ値の明示的な欠如は、単一のプロパティ値以上に影響しますか?時々、
null
実際に新しいメッセージタイプがあることを示しています。シリアル化形式を使用するユーザーにとっては、まったく異なるメッセージタイプを指定する方が簡単です。これにより、検証とアプリケーションロジックが、Webインターフェースが提供する2つのメッセージを明確に分離できるようになります。
一般的なアドバイス
null
それをサポートしていないエッジまたはインターフェイスの値にすることはできません。プロパティ(JSON)の値の入力に本質的に非常に緩いものを使用している場合は、可能であれば、コンシューマエッジソフトウェア(JSON Schemaなど)で何らかの形式のスキーマまたは検証をプッシュしてみてください。プログラミング言語APIの場合は、可能な場合は静的に(入力を介して)ユーザーの入力を検証するか、実行時に適切な大きさで検証します(別名、消費者向けのインターフェイスで防御プログラミングを実践します)。重要なこととして、エッジを文書化または定義して、以下に関する質問がないようにします。
- 特定のプロパティが受け入れる値のタイプ
- 特定のプロパティに対して有効な値の範囲。
- 集約タイプの構造化方法。集約タイプにはどのプロパティが存在する必要がありますか?
- コンテナのタイプである場合、コンテナが保持できるアイテムまたは保持するアイテムの数、およびコンテナが保持する値のタイプは何ですか?
- コンテナまたは集計タイプのプロパティまたはインスタンスが返される場合、どのような順序ですか?
- 特定の値を設定するとどのような副作用があり、それらの値を読み取ることの副作用は何ですか?