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

python - Pythonで同等のビルダーパターン

Javaでは、ビルダーパターンを使用して、多くのパラメーターを使用してクラスをインスタンス化するためのより読みやすい手段を提供できます。ビルダーパターンでは、名前付き属性を設定するメソッドを使用して構成オブジェクトを作成し、それを使用して別のオブジェクトを作成します。

Pythonで同等のものは何ですか?同じ実装を模倣する最良の方法はありますか?

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

java - ビルダーから匿名クラスを取得できますか?

次のようにインスタンスを手動で作成するときに、匿名クラスを作成できることはわかっています。

ただし、一部のクラスはビルダー パターンを使用して新しいインスタンスを作成します。私の質問は、スーパークラスによって提供されるビルダーを使用して匿名クラスを作成できるようにするトリックがあるかどうかです。

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

java - すべてのサブクラス (ジェネリック?) に対する 1 つのビルダー メソッドの実装

私のジレンマは、変数を設定してそれ自体を返すビルダー パターンに従う 1 つのメソッドを作成することですが、他のビジター実装によってVisitor実装されBasicVisitor、拡張されるインターフェイスがあります。

さらに、私は、によって実装され、訪問したすべての訪問者の履歴を保持するメソッドを持つVisitableインターフェースを持っています。SampleVisitable


したがって、問題は、訪問者が訪問する前にホストが呼び出し、最後の訪問からのすべてのデータを消去するため、SampleVisitableその訪問者が「重要」である場合にのみ、訪問者の完全な参照を履歴に保持したいということですが、私はしたいですVisitor.clean()「重要な」訪問者のデータが履歴に残ります。

これは私がこれまで実装のために持っていたものです:

これはSampleVisitableクラスからのスニペットです:

次に、メソッドBasicVisitorを実装するものがありimportant()ます。important()毎回メソッドをオーバーライドする必要はありませんが、他の訪問者がimportant()メソッドを使用すると、「BasicVisitor から [OtherVisitor] に変換できません」という形式のエラーが発生するため、私の実装ではオーバーライドする必要があります。オーバーライドせずに:

これを行う最善の方法は何ですか?この機能を一度実装して、他のすべてのサブクラスでオーバーライドすることなく使用できるようにする必要があります。ありがとうございました!

編集:

うわー、抽象クラスはまさに私が探していたものです! さらに調査を行ったところ、インターフェイスと抽象クラスの違いに関するこの投稿を見つけました。答えを探している他の人に役立つことを願っています。

この回答を投稿した後、この状況ではビルダーパターンを使用する必要がないことに気付きました。作成するだけで、setImportant( boolean isImportant )基本的に必要なものを手に入れることができましたが、とにかく尋ねてよかったです。別の設計上の問題に必要です。

編集2:

抽象クラスを試した後も、私の主な問題はまだ残っています..のimportant()各サブクラスのメソッドをオーバーライドする必要がありますVisitor.

イリヤ

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

java - 内部クラスを使用して Builder パターンでオブジェクトを拡張する

私がやろうとしているのは、ビルダー パターンを使用するクラス ( ) を作成し、このクラスを必要なオブジェクト内のSquare内部クラス ( ) として拡張することです ( )。MyCubeDrawMyCube

理解するのが少し複雑な理由から、これらを内部クラス (ローカル変数への参照) として拡張することをお勧めします。

実際の使用例は複雑すぎてここで使用できないため、例をできるだけ単純にしようとしました。

ここで、これを拡張して使用する必要があります。

ただし、問題は内部クラスの静的ビルダーです。

メンバー型 Builder は static と宣言できません。静的型は、静的型または最上位型でのみ宣言できます。

別の方法として、内部クラスMyCubeを通常のクラスとして作成することもできますが、その場合、クラス内の何も参照できないという問題が生じますDrawMyCube(実際の使用例では、これらのさまざまなものへの参照が多数あります)。

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

python - Python、長いビルダー パスとコメントを組み合わせる

重複の可能性:
Python でチェーンされたメソッドの行を分割する方法は?

次の質問は python コードスタイルに関するもので、再利用可能なライブラリの設計である可能性があります。したがって、次のように、グラフの作成を単一の大きな行にチェーンするビルダーがあります。

4 行目で、間違った記号 (#) に関するエラーが表示されます。したがって、長いビルダー パスに対して適切にコメントされたコードを生成する方法についての一般的な質問です。また、良い答えとして、コードを明確にするためのコメントを許可するビルダーの変更に関する提案をいただければ幸いです。

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

java - 文字列を使用せずに、データベース テーブルの選択を可能な限り静的にする

まず第一に、この質問は少し長くなりますが、私の問題を完全に説明するために、私のプロジェクトについて多くの情報を提供する必要があると感じていますので、ご容赦ください!

私はチャートを頻繁に使用する会社で働いているので、常に scats からチャートを作成しなければならないという問題を回避するために、新しい Java プロジェクトを作成し、私と同僚がこれらを作成するために使用できる「パッケージ」を作成することにしました。チャート。それらをジェネリックと呼ぶことができます。

したがって、このプロジェクトではビルダー パターンと多くのインターフェイスと抽象クラスを使用します。クライアント (開発者) がこれらのインターフェイス、パターン、およびクラスを使用し、フローに合わせてメソッドをオーバーライドするという考え方です。クライアント (開発者) に残された唯一のことは、これらのメソッドを埋めて、自分で UI を作成し、プログラムを公開することです。

プログラムは順調に進んでおり、非常に誇りに思う機能をたくさん作成しました (私は学生なので)。プロセス全体をうまく計画したと思っていましたが、いくつかの問題に遭遇しました!

まず最初に、クラスを示してデータフローを説明します (できるだけ短くします)。

最初は GUI です (これは、ユーザーが常に自分で作成する必要があるクラスですが、組み込みパッケージを使用して、次のコードを使用してチャートを作成できます)。

これで、ディレクターはチャートを作成する準備が整いました。

このPeroidSelection.Hour場合、標準時間を設定する列挙型であり、チャートのカテゴリ軸を開始時間に設定するため、収集されるデータは、1 時間ごとにデータを取得する必要があることを認識します (この場合は 8.00 から 19.00 まで)。これが Enum である理由は、これらのタイプの期間が最終的なものであり、変更できるのは営業日と営業時間のみであり、非常に簡単に変更できるからです! のプレビューは次のPeriodSelection enumとおりです。

Director に入ると、director はチャートを作成する準備が整いましたが、最初にデータベースからデータを収集する必要があります。

ご覧のとおり、ビルダーは特定の方法で構築されています。これは、チャートがテーブルとチャートの両方で構成されており、これら 2 つをリンクする必要があるためです。チャートについてはあまり詳しく説明しません。質問。

メソッド extendsの最初の行に示されている stat クラスと、buildTypeOne呼び出された抽象クラスはstatisticPattern次のようになります。

前述のように、このクラスの目的は、ディレクタがこれらのメソッドを見つけて使用できるように、開発者がクラスを拡張してメソッドをオーバーライドすることです。これにより、メソッドの実装方法と入力方法はプログラムごとに異なります。

このプログラムでは、統計クラスは次のようになります。

ご覧のとおり、メソッドの独自の実装を作成しました。getDataこのメソッドは、obtainNewDatap (プロバイダー クラス - データベースへの接続とも呼ばれます) からデータを取得するメソッドを呼び出します。

obtainDataご想像のとおり、プロバイダー クラスは、メソッド内にメソッドが 1 つしかない実装とインターフェイスも備えています。

}

ここでも、開発者はこのメソッドを実装する必要がありますが、好きなように埋めることができます。ここで最も重要なことは、戻り値の型が ObjectInterface 型の ArrayList であることです。

}

基本的に、チャートに入力する必要があるすべてのデータを含むハッシュマップを実装する必要があります。このデータは、オブジェクトの作成時に追加され、プロバイダのリストに追加されます。このリストが返され、Director はそれを chartbuilders のデータ リストに設定し、チャートを埋めます。

この場合、チャートを埋めなければならない最終的なオブジェクトは次のようになります。

では質問へ!

収集するデータが 1 種類しかない場合、これらはすべて完全に機能します。しかし、私が現在取り組んでいるプログラムは、5 つの異なるテーブルからデータを取得する必要があり、そのすべてを各チャートに追加する必要があります。データベース テーブルを選択するように設計するにはどうすればよいですか? その特定のテーブルのリストを返しますか?

私はすでに次のコードで試しました:

ただし、控えめに言っても、それはちょっと冗長で醜いようです。

クライアント(開発者)が新しいプログラムを作成するたびに変更しなければならない Enum を再度作成することを考えましたが、これが正しい方法であるかどうかはわかりません。

また、プロジェクト全体についてどう思いますか?私はそれを釘付けにしましたか、それとも失敗しましたか?

読んでくれてありがとう、私はあなたの返事を読むのを楽しみにしています

0 投票する
5 に答える
3136 参照

java - Java インターフェイスの不変クラスと一致するビルダー クラスの自動生成

interfaceアクセサメソッド定義のみを受け取り、不変オブジェクトクラスと、新しいインスタンスを段階的に構築したり、新しいインスタンスを作成して既存のインスタンスを変更したりするための「ビルダー」クラスを自動的に生成するJava 用のツールまたはライブラリは何ですか?

入力例:

出力例:

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

scala - オブジェクトのフィールド検証を処理するための最良の方法=>どちらか/試行(scala 2.10)/ ValidationNEL(scalaz)

ビルダーパターンを使用して構築されたオブジェクトを想定しましょう。

このビルダーパターンには、buildフィールドの検証とターゲットタイプへの変換に焦点を当てたメソッドが含まれます。

この検証は、以下を使用して実装できます。

  • Either[FailureObject, TargetObject]タイプ
  • Try[TargetObject](Scala 2.10の新機能)
  • Validation[FailureObject, TargetObject]またはValidationNEL[FailureObject, TargetObject]scalazライブラリから

ValidationオーバーEitherタイプの主な利点の1つは、Validation「箱から出して」障害を蓄積できることです。

しかし、「新しい」Try方法はどうでしょうか。Try箱から出してすぐに使える「モナディック」メソッドもあることに気づきました。たとえばmap、 。flatMapの助けを借りずにどちらのタイプでも本当に欠けていたものですProjection

Try[FieldType]したがって、各フィールド検証メソッドがaを返し、より正確には、障害が発生した場合にTry[SpecificFieldExceptionType];を返すことを想像します。このネストされたものStringには、メソッド全体で蓄積できるメッセージフィールドとrootCauseフィールドが含まれていますbuild

Scala 2.10を使用して、Tryビルダーパターンのような単純な検証のためにscalaz検証ライブラリを置き換える練習をすることができますか?

**編集****

Tryソースコードを読み取ることにより、Tryいくつかの例外を蓄積できないように聞こえ、したがってフェイルファストに向けられます。Try.flatMap潜在的な以前の失敗を返すことさえあるので、蓄積の概念がありません:

それどころか、ValidationNEL蓄積機能を処理します。

確認はありますか?

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

oop - Builder パターン : Director がオブジェクトを構築するのはなぜですか?

ビルダーパターンを学んでいます

上記のリンク (Java の例) で、Builder が複数のコンポーネントを構築するためのインターフェースを提供していることに気付きました。それらを呼び出すとともに、getProduct() も呼び出します。

私が理解できない点は、Director がこれらのすべてのコンポーネント構成メソッドを 1 つずつ呼び出して、最終的に結果を取得する必要があるのはなぜかということです。

}

コンポーネント 1、2、3 を構築するためのコードを、Director ではなく ConcreteBuilder クラス自体に含めて、実際に Director レイヤーを削除してみませんか。

上記のアプローチがビルダーのパターンを別のものに変える可能性があることは理解していますが、ディレクターが段階的に仕事をしている理由がわかりません。メリットは何ですか?取締役が複数いるとコードが重複しますよね?Builder パターンの実行の背後にある動機を理解していない可能性があります...

UPDATE : Builder パターンは、より大きな複雑なオブジェクトを作成しながら、カスタマイズ可能なコンポーネントの選択を提供することに重点を置いていますか? そうでなければ、のところ、追加のレイヤーであるディレクターを導入する意味がわかりません。

その場合でも、Decorator パターンは、コンポーネントを動的にカスタマイズすることで同じことを達成するためのより良いアイデアかもしれません。どこかでビルダーの背後にあるポイントが欠けています.. :(

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

java - ビルダーパターン:どのバリアントが優先されますか?

私はEffectiveJavaの本を読み、将来の参考のためにメモを作成していましたが、BuilderPatternに出くわしました。

私はそれが何であるか、そしてそれがどのように使用されると想定されているかをよく理解しました。その過程で私はビルダーパターンの2つの例のバリエーションを作成しました。

それぞれの違いと利点をリストアップするのに助けが必要ですか?確かに私は、Example 1公開するメソッドが少なく、制限が少なく、より一般的であることに気づきました。これにより、より柔軟に使用できるようになります。

私が見逃した他のことを指摘してください?

例1

例2