問題タブ [builder-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 投票する
1 に答える
3688 参照

c# - Builder パターンでの Builder の作成

ビルダー パターンの使用方法、特にビルダーのタイプがどのように作成されるかを明確にしたいと思います。例では、ビルダーのタイプを想定して作成します。ただし、CreateBuilder「ChartBuilderFactory」クラスに、渡されたオブジェクトに基づいてビルダーのタイプを返すメソッドを作成しました。これはこれを行う最良の方法ですか?サンプル コードを投稿しました。より良い設計のための代替案や提案をいただければ幸いです。

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

java - JoshuaBlochのBuilderパターンとPMD警告

Joshua BlochのBuilderパターンを使用してクラスを作成しました。これは、このピザの例に似ています。

しかし、PMDは2つの警告を報告しました:

  1. (メソッドBuilder.build()を指す)コンストラクターのクラスの外部からのプライベートコンストラクターによるインスタンス化を避けます。コンストラクターのクラスの外部からプライベートコンストラクターを介してインスタンス化すると、多くの場合、アクセサーが生成されます。ファクトリメソッド、またはコンストラクタの非プライベート化により、この状況を解消できます。生成されたクラスファイルは実際にはインターフェイスです。これにより、アクセスクラスは、インターフェイスを補足パラメーターとして受け取る新しい隠しパッケージスコープコンストラクターを呼び出すことができます。これにより、プライベートコンストラクターが効果的にパッケージスコープを持つコンストラクターに変わり、識別が困難になります。
  2. クラスはインスタンス化できず、静的メソッドまたはフィールドを提供しません。プライベートコンストラクターがあり、静的メソッドまたはフィールドがないクラスは使用できません。

これらの警告を無視する必要がありますか?

別の質問:クラス内のプライベートフィールドPizzaBuilderが重複しています。プライベートフィールドの数が増えると、これは厄介になります。それを回避する方法はありますか?

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

asp.net-mvc - Moqを使用したビルダーパターンの単体テスト

ビルダーパターンを使用してコントローラーのビューモデルを生成していますが、コントローラーを単体テストしようとしたときに、それができないことに気付きました。Moqは文句を言います。

それがMoqの制限なのか、それとも私自身の制限と無知なのかわからない。

これは私のコントローラーがどのように見えるかです:

IOutletViewModelBuilderオブジェクトをモックしようとしていますが、次のようになります。

(1)次のエラー強調表示(mockBuilder.Object)が表示されます

メソッド'Returns(ViewModelBuilders.Builders.IOutletViewModelBuilder)'を解決できません。候補は次のとおりです。

(2)次のエラーをスローします。

メソッド'Returns(Moq.Mock)'を解決できません。候補は次のとおりです。

(3)コンパイル時エラーではなく、実行時エラーをスローします。

どんな助けでも大歓迎です。この方法を単体テストするのはそれほど難しいことではありませんか?

実装を確認する必要がある場合に備えて、以下にBuilderオブジェクトを示します。

最後に、IOutletViewModelBuilderインターフェース

0 投票する
7 に答える
4172 参照

java - ビルダー パターンが完成していることを確認するにはどうすればよいですか?

編集:これは複数のインターフェイスを使用して強制されるため、間違った順序で呼び出されることを心配していません.ターミナルメソッドがまったく呼び出されることを心配しています.


ビルダー パターンを使用して、システムでアクセス許可を作成しています。ビルダー パターンを選択したのは、私たちの製品ではセキュリティが非常に重要であるため (これには未成年者が関与するため、COPPAなど)、パーミッションが読みやすいことが不可欠であると感じ、読みやすさが最も重要であると感じた (つまり、流暢なスタイルを使用する) 6 つの値を持つ単一の関数ではなくビルダー パターン)。

コードは次のようになります。

これらのメソッドは、ターミナル メソッド (つまり asOf ) がデータベースへのアクセス許可をコミットする際に、プライベート バッキング Bean を設定します。そのメソッドが呼び出されない場合、何も起こりません。時折、開発者は端末メソッドを呼び出すのを忘れることがありますが、これはコンパイラ エラーの原因にはならず、コードのすばやい読み取り/スキミングで見落としがちです。

この問題を防ぐにはどうすればよいですか? 保存する必要がある Permission オブジェクトを返したくありません。これは、ノイズが増え、パーミッション コードの読み取り、追跡、追跡、理解が難しくなるためです。

端末コマンドによってマークされるバッキングにフラグを置くことを考えました。次に、finalizeメソッドのフラグを確認し、オブジェクトが永続化せずに作成された場合はログに書き込みます。(finalize実行が保証されていないことはわかっていますが、私が考えることができる最高のものです。)

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

c++ - C++ でビルダー パターンを使用する場合、セッターがビルダー オブジェクトへの参照を返すことをお勧めしますか?

テスト対象コードの入力データの作成を合理化するために、C++ 単体テストでビルダー パターンを使用することを考えています。

Java では、ビルダー クラスのセッターがビルダー オブジェクト自体 (への参照) を返して、複数のセッターを 1 行で連鎖できるようにするのが一般的なイディオムのようです。例)ビルダー クラスは次のように定義できます。

そして、このように使用されます:

セッターがビルダー オブジェクトへの参照を返すようにすることで、C++ でも同じ効果を得ることができます。ただし、ウェブ上でその例を見つけることができませんでした。この種の「チェーン」は C++ の一般的な方法ですか? いいえの場合、なぜですか?

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

java - ファイルからデータをロードするクラスを初期化します。それはビルダーですか?

私はデザインパターンの初心者です。
ClassAなどのクラスのインスタンスを作成し、そのフィールドの一部を構成ファイルから読み取った値に設定したいと思います。
クラスのコードと値を使用してファイルを管理するコードを区別すると、ClassAは純粋な「ビジネスロジック」クラスになります。

ビルダーは「インスタンス化」だけでなく初期化も処理しているように見えるので、これはビルダーパターンだと思います。
しかし、そうでなければ、ビルダーは作成プロセスを段階的に分割することに焦点を当てているようですが、私の場合は1つの(まだ複合的な)ステップしかありません。

ビルダーパターンと見なすことができますか?それとも何か違うのですか?

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

c# - ビルダーパターンを効率的に作成して使用する方法

前回のプロジェクトでは、ユニット テスト用の共有テスト フィクスチャが発生し、多くの問題が発生しました。そのため、現在のプロジェクトではビルダー パターンを調べました。単体テストは、開発マシンのメモリ内で実行し、ビルド サーバーのデータベースに対して実行します。

現在、たとえば学生用に次のビルダーを生成する T4 テンプレートがあります。

基本クラスを通じて、これを次のように使用できます。

ビルド サーバーで統合テストを実行して、すべてがデータベースに対して機能することを確認します。これは、すべての参照制約が満たされていることを確認する必要があることを意味します。しかし、問題が始まります。

たとえば、学生にはメンターが必要であり、メンターは学校に所属し、学校は都市に、都市は ....

これにより、次のようなコードが生成されます。

これをどのように最適化すればよいですか?各 Builder の Construct メソッドで「デフォルトの建物」を作成することを考えましたが、10 人の生徒を作成すると、10 都市の 10 の学校に 10 人のメンターが 10 人いることになります。

または、WithAllCity(..)、WithAll(School) などのメソッドを作成することもできます。

何か案は?Builder パターンを実際に正しい方法で使用していますか? ディレクタークラスは役に立ちますか? または、これらのさまざまなケースを解決する StudentBuilder からクラスを継承する必要がありますか?

または別のアイデアとして、データをデータベースに送信する前に、サービス層にさらに検証を追加する必要がありますか? 次に、メモリ内データベースに対する単体テストでより多くのエラーを検出します。

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

scala - Scalaでビルダーパターンを実装するためのより良い代替手段はありますか?

BenchmarkOptionコマンドライン引数に基づいてクラスのインスタンスを作成する必要があります。私は確かにpojoスタイルを使用していますが、これは不変ではありません。そこで、Javaスタイルのビルダーパターンを使用します。これが私が実装するクラスです:

ご覧のとおり、コードは長く、読みにくいものです。書き直す代わりの方法があると思います。なにか提案を ?

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

java - ビルダー パターンを使用して、さまざまな同様のオブジェクト タイプを構築するにはどうすればよいですか?

現在、ここで定義されているビルダー パターンを使用しています。

ビルダーパターンの使用を示す前の質問

私が今遭遇した問題は、次の構造を作成するための要件です。

また:

ZipHolderとは両方ともFileビルダー パターンを使用して構築され、それぞれの内部静的クラスとして実装されます。Aは、必須のコンストラクタ パラメータとして をZipHolder取り、必要に応じてオーバーライドできる の一部の情報を事前に入力します。には、そのファイルに関連するファイル コンテンツと関連するメタデータが含まれます。との両方の検証は、それぞれのクラスのメソッドを呼び出すときに実行されます。次に、オブジェクトが取得され、必要に応じて同じオブジェクト構造に読み込まれる必要がある ZIP ファイル階層に出力されます。mainFileZipHolderFileZipHolderFilebuild()Builder

これはうまく機能し、不変性を確保しながらオブジェクト作成にある程度の柔軟性をもたらします。しかし、問題が発生しました。Fileオブジェクトがメタデータファイル コンテンツを持つことも、ファイルコンテンツ のみを持つこともできるという、新しい要件が提示されました。ZipHolder通常のメタデータ検証をスキップできるようにするために、オブジェクトのビルダーにブール値のフラグ値を渡すだけでよいと考えました。これは問題ないように思えますが、File mainFileを構築する必要があります。つまり、鶏が先か卵が先かという状況です。次に考えたのは、フラグをFileクラスに移動することでした。複数を作成できる可能性があることに気付くまで、これは問題ないように思えましたFileオブジェクトには、メタデータが必要なものもあれば、ファイル コンテンツのみを含むものもあり、全面的に制約を適用する手段はありません。

そのため、どのように進めればよいのか、私はやや困惑しています。エレガントな方法でaのmainFileの要件を切り離す明確な手段がわかりませんZipHolder。抽象クラス、インターフェース、基本クラスなどの概念が頭に浮かびますが、この特定の状況で何らかの方向性が必要です。

だから私の質問は:

上記のリンクの理由に従ってビルダー パターンを保持しながら、両方のシナリオを許可できますか?

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

java - 静的内部クラス Builder を使用して構築されたクラスの継承

私はClass Aかなりの数のメンバー変数を持っています。これを不変にし、構築中にメンバー変数を検証するために、コンストラクターをプライベートにし、内部の public static ビルダー クラス ( ClassABuilder) を使用して構築しました。(Joshua Bloch 有効な Java、項目 2)。

今私が理解していないのは、他のプログラマーがどのようにサブクラス化Class Aして独自の動作を実装するかということです。本から Builder パターンの欠点を読みましたが、サブクラス化が 1 つとして言及されているのを見ませんでした。何か不足していますか?これを回避するエレガントな方法はありますか?

コンストラクターを作成することprotectedは私の考えの 1 つでしたが、それでも public staticClassABuilderを使用するので、サブクラスに新しいメンバー変数を追加するにはどうすればよいでしょうか?