与えられていない/ null /空の問題の名前はありますか?[閉まっている]


8

次のように、データがHashtable / Dictionary / Associative-Arrayのような構造で格納/交換されるコードを使用します

{
   'alpha': None,
   'bravo': '',
   # 'charlie' is not given
}

どのフィールドが「指定」されているか、およびNone / Null / Nilまたは空の文字列として指定できる場合は、標準化はあまりありません。その結果、コードにはlike likeチェックif hasattr(obj, 'alpha')やデフォルトのフォールバックが散らばっています。

この種類の(imho)アンチパターンに名前や俗語はありますか?

更新:

まだ名前がないようですので、是非教えてください。現在、私たちはこれらを持っています:

  • Incorporeal Horde(psrへのクレジット)

5
私はそれをアンチパターンとは呼びません。現実の世界では、何かが欠けている場合と欠けていない場合があります。デフォルト値が理にかなっている場合は問題ありませんが、それが本当にnull /存在しない場合はどうでしょうか?たとえば、ミドルネームを持たない人もいます。それをどのように表現しますか?これが、この種のシナリオのためのより良いプログラミングモデルを探すためのものであると私が思う理由です。nullオブジェクトパターンのように、多分モナド、またはそこに存在する他のもの。
Ionuț G. Stan 2011

空の文字列は、すべての文字列のセットの完全に有効なメンバーであり、文字列がない場合とはまったく異なることに注意してください。「私は0ドル持っている」という2つの文の違いに似ています。そして、「私がいくら持っているかをあなたに言うつもりはありません。」
インゴ

Pythonには、これらのチェックを回避できるデフォルトの辞書があります。Haskellには、人類のすべての問題を解決するモナドがあります。
ジョブ

@Ionut:はい、「不足しているもの」でも問題ない状況がありますが、私の場合、1つまたは2つの送信者を従うよりも、可能なすべてのでたらめに対して100人の受信者を許容する方が好ましいと思います。フォーマット。ミドルネーム(または一般にアドレスのすべての部分)は、 ''が完全に問題ない古典的なケースです。
ケプラ2011

@Ingo:はい、しかし問題は私のコードベースではこれらの「意味」が無視されることです。アプリケーションのさまざまな部分がすべて同じOrder:{'positions':None}、{'positions':[]}、または単に{}に対して応答する場合があります。
ケプラ2011

回答:


6

そのような名前はないと思います(見ましたが、もちろん名前の欠如をどうやって見つけることができますか)?

「Incorporeal Horde」という名前をお勧めしますが、nullまたは縮退オブジェクトの完全なコレクションに適用します-ゼロサイズコレクション、null、未定義、なし、なし、NAN(おそらく別の種類のエッジケースです)、DBNull、 void、空の文字列(おそらく空のコレクションの特殊なケース)、欠落している辞書エントリなど

そしてそれ自体をアンチパターンとは呼びませんが、ソフトウェア開発の問題として、特に、プログラミング環境でそれらの多くのケースで個別のコードを記述する必要がある場合はそうです。

かなり有益ではない答えをお詫びしますが、それができる最善の方法だと思います。さらに、あなたの質問のために世界が名前を採用した場合、それは正解になる可能性があります。


「Incorporeal Horde」が大好きです。
Sean McMillan

「Magic the Gathering」のように聞こえます。私はそれが好きです。+1。
ケプラ2011

0

F#では、これはオプションタイプを通じて提供されます(同じファミリーの以前の言語と同様)。関数からnullを返さないようにするルールがあるC#プロジェクトで同じコンセプトを使用しましたがOption<T>、そのタイプのを返しますが、None値の可能性があります。これにより、呼び出しコードは、戻り値のその可能性に対処する必要があることを認識します。

null値の値の型ができたのと同じように、null不可の参照型が欲しいですが、それは別の話です。


0

JavaScriptでは、これはと呼ばれundefined、とは異なる一意のセンチネル値nullです。

定義されていないundefinedグローバル変数undefinedまたはオブジェクトのプロパティを評価するか、関数の呼び出しなど、値を返さないステートメント、または何も返さないステートメント、またはブロックを評価することによって取得しますまたは変数宣言(これら2つは有効な式ではないため、JavaScript REPLでのみ発生します)。

ときにundefined値があることを強制されるObjectことになるnullが、そうではありませんnull

ここに小さなイラストがあります:

var a = [1, 2, 3];//undefined
a[0];//1
a[4];//undefined

var o = { foo: "123" };//undefined
o.foo;//"123";
o.bar;//undefined

function bar() { return null; };//undefined
bar();//null
function foo() { /*just an empty block*/};//undefined
foo();//undefined

typeof undefined;//"undefined"
typeof null;//"object"
null == undefined;//true - that is because undefined is converted to an object for comparison and thus yields null
null === undefined;//false - because they are not the same

nullそれがあなたの質問であるなら、私は未定義の値を(として定義された値とは対照的に)未定義と呼ぶことは理にかなっていると思います。一意のセンチネル値を使用して定義された値がないことを伝えることは、動的言語では実行可能なソリューションですが、よく理解されていないことがよくあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.