問題タブ [null-object-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
1756 参照

ruby-on-rails-3 - Rails での関連付けの Null オブジェクト パターン

ここでレールの Null オブジェクトに関するいくつかの回答を見たにもかかわらず、それらを機能させることができないようです。

私の問題は、ユーザーの作成時に、プロファイルに適切なネストされた属性 (profile_attributes) を渡すと、新しいユーザーに NullProfile が作成されることです。

これは、作成時にカスタム プロファイル メソッドが呼び出され、NullProfile が返されることを意味していると推測しています。この NullObject を適切に実行して、オブジェクトの最初の作成時ではなく読み取り時にのみ発生するようにするにはどうすればよいですか。

0 投票する
1 に答える
152 参照

ruby - モンゴイド関連とnullオブジェクトパターン?

Mongoid リレーションで null オブジェクト パターンをどのように実装しますか?

ほとんどの所有者はプリファレンスを持たないため、Ben Orenstein の優れた講演で説明されているように、代わりに NullPreference を使用してもらいたいと考えています。

私が欲しいのは次のようなものです:

ActiveRecord で同じことに関する関連する質問を見つけましたが、回答はありません。

編集:私はMongoid 2.6を使用しています。それ以外の場合は、実数autobuild: trueを使用して取得し、代わりにデフォルトを使用できます。 Preference

0 投票する
2 に答える
1164 参照

ruby-on-rails - オプションの belongs_to 関連付けの処理方法

使用事例:

次の例を考えてみましょう。

ログインしたユーザーが Foo を作成すると、そのユーザー レコードに関連付けられます。ログインしていないユーザーが作成した Foo は、どのユーザーにも関連付けられません。これは単なる例であり、私のアプリケーションには多くの同様の使用例があります。

問題:

問題は、私のビュー コードが多数の if 条件や次のような三項演算で乱雑になることです。

現在の解決策:

これを克服するために、null オブジェクト デザイン パターンを使用しています。User クラスは NullUser オブジェクトを定義します (その名前は「未設定」に設定されます)。foo オブジェクトにユーザー オブジェクトがない場合、NullUser オブジェクトが返されます。nil チェックを行う Foo クラスのユーザー メソッドをオーバーライドしました。

質問:

  1. これに対するより良い解決策はありますか?
  2. Rails アクティブ レコード モデルの null オブジェクト パターンを容易にする gem はありますか。
0 投票する
1 に答える
996 参照

c# - c# - これらのプロパティの親が null にできる場合とできない場合に、null プロパティのデフォルト値を返す

そのため、グーグルでもスタックオーバーフローでも、これに対するエレガントな解決策は見つかりませんでした。私は非常に特定の状況を手にしていると思いますが、とにかくここに行きます:

外部 WS からこの構造を受け取るため、制御できないオブジェクト構造があります。これは非常に巨大なオブジェクトで、さまざまなレベルのフィールドとプロパティがあり、このフィールドとプロパティはどのレベルでも null にすることも、null にすることもできません。このオブジェクトは貧血モデルと考えることができます。これには動作がなく、状態だけがあります。

この質問のために、私の状況をシミュレートする簡単なサンプルを提供します。

そのため、コード全体で、必要なものを計算するためにいくつかの計算を行うために、さまざまなレベルでこれらの多くのプロパティにアクセスする必要があります。基本的に、実行する必要がある計算の種類ごとに、必要なプロパティの各レベルをテストして、null でないかどうかを確認する必要があります。null でない場合は、(10 進数) 0 を返すか、状況に応じて他の既定値を返します。ビジネスロジック。

私がそれをしなければならない数学のサンプル:

念のために言うと、この構造体のリーフ プロパティは常にプリミティブ、または null 許容プリミティブであり、その場合は適切に処理します。これは、必要な各プロパティに対して実行する必要がある「ロジック」であり、場合によってはそれらのかなりの数を使用する必要があります。また、実際の構造は非常に大きいため、必要なプロパティごとに必要な検証の数も多くなります。

さて、私はいくつかのアイデアを思いつきましたが、どれも理想的ではないと思います。

  1. プロパティを収集するメソッドを作成して、必要な検証を抽象化するか、デフォルト値を取得するロジックを作成します。欠点は、いくつかのフィールドのグループで検証とデフォルト値が似ているため、私の意見では、コードがかなり重複していることです。
  2. オブジェクトを受け取る単一のジェネリック メソッドと、必要なフィールドにアクセスするラムバ関数を作成します。このメソッドは、関数を実行してその結果を返そうとします。NullReferenceException の場合は、デフォルト値を返します。これの明るい面は、それが本当に汎用的であることです。プロパティにアクセスするためにラムダを渡すだけで、メソッドは問題を処理します。その欠点は、私が try -> catch を使用してロジックを制御していることです。これは目的ではありません。コードは、最終的にメンテナンスを行う他のプログラマにとって混乱を招く可能性があります。
  3. Null Object パターン、これが最もエレガントなソリューションだと思います。通常のケースであれば、すべての良い点があります。しかし問題は、この構造に Null オブジェクトを提供することの影響です。もう少し文脈を説明すると、私が取り組んでいるソフトウェアは政府のサービスと統合されており、政府の仕様にある私が取り組んでいる構造には、null が何らかの意味を持つフィールドがいくつかあります。 「0」のようなデフォルト値。また、この仕様は時々変更され、クラスが再生成され、Null オブジェクトを作成するために必要な後処理もメンテナンスが必要になり、少し危険に思えます。

私は自分自身を十分に明確にしたことを願っています。

前もって感謝します。

解決

これは、受け入れられた回答に基づいて、問題をどのように解決したかについての回答です。

私は C# にまったく慣れていません。リンクされたこの種の議論は、多くの面でエレガントなソリューションを思いつくのに本当に役立ちました。コードが実行される場所によっては.NET 2.0を使用するという問題がまだありますが、拡張メソッドをある程度定義できるこの問題の解決策も見つけました: https://stackoverflow.com/a/707160/649790

そして、ソリューション自体については、これが最高であることがわかりました: http://www.codeproject.com/Articles/109026/Chained-null-checks-and-the-Maybe-monad

基本的に、この方法でプロパティにアクセスし、計算を行うだけです。

必要なプロパティごとに。それはまだただではありません:

もちろん、これまでに見つけた解決策よりもはるかに優れています。私は拡張メソッドに慣れていなかったので、本当に多くのことを学びました.

再度、感謝します。

0 投票する
2 に答える
1235 参照

ruby-on-rails - Rails で NullObject パターンを実装する

Post belongs_to :user削除したユーザーの投稿を保持したいアプリケーションです。これにより、作成者が削除された投稿を表示すると、ビューでエラーが発生する可能性があります。私はこれをやろうとしました:

これにより、'stack level to deep' エラーが発生します。なんで?私はこれを行うことができます:

しかし、このように私の連想を台無しにするのは正しくないようです。これについて最善の方法は何ですか?

0 投票する
1 に答える
241 参照

c++ - タイプ boost::function の null 実装

私はこのようなものを持っています:

これはnullStylerを定義する正しい方法ですか:

代わりにこの方法でできると思っていましたが、空の関数がスローします:

スタイラー関数を使用するコードは、「Null オブジェクト パターン」を使用する代わりに空をチェックできます。どちらが良いですか?私の Detail 名前空間に奇妙な何も機能がないか、空をチェックしていますか?

0 投票する
1 に答える
133 参照

c# - ジェネリックの空のオーバーロード コンストラクターとジェネリックを使用しない場合

私は現在、ジェネリック ステート マシンを構築してStateMachineおり、ジェネリック パラメーターを使用してのコンストラクターを使用して、マシンに何もすることがない場合に備えて、作成時にフォールバック状態を設定しています。

新しい状態オブジェクトを作成する必要があるときに状態マシン自体で使用されるコンストラクターと、状態マシンを初めて初期化するときに使用されるコンストラクターの 2 つを使用するのは悪い習慣ではないかと考えていました (デフォルトのフォールバック状態を設定します)。 .

私の最大の質問:ジェネリックを乱用していませんか? ジェネリックを使用してはいけない場合はありますか?

ステート マシンの作成:

ステート マシン コンストラクター:

NodeStateMachineクラスで状態がどのように変更されるかを次に示します。

問題のコンストラクターは、状態自体に直接存在します。

0 投票する
3 に答える
101 参照

java - NullObjectPattern と Comparable インターフェイス

私が抱えている問題は、すでに以前に尋ねられています:インターフェイスが Comparable を拡張する列挙型を使用してインターフェイスを実装する方法は?

ただし、どのソリューションも私の正確な問題を解決するものではありません。これは次のとおりです。

に似た値オブジェクトがありますBigDecimal。この値は、実際のオブジェクトでは設定されないことがあります。これは、その値がまだわかっていないためです。したがって、 Null オブジェクト パターンを使用して、このオブジェクトが定義されていない時間を表現したいと考えています。ComparableNull オブジェクトにインターフェイスを実装させようとするまでは、これは問題ではありません。説明する SSCCE を次に示します。

その他の懸念事項:

  • 実際の例では、Fooここで呼び出しているサブクラスが複数あります。
  • NullFooではないことでおそらくこれを回避できenumますが、それのインスタンスが1つだけであることを保証することはできません。つまり、Effective Java Item 3、pg。17-18