問題タブ [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.
java - 検証チェックのビルダー パターンを改善しますか?
最近、自分のプロジェクトの 1 つで Builder パターンの使用を開始し、Builder クラスに何らかの検証を追加しようとしています。コンパイル時にこれを行うことはできないと想定しているため、実行時にこの検証を行っています。しかし、私は間違っているかもしれません。それが、コンパイル時にこれを実行できるかどうかを確認しようとしていることです。
問題文:
上記のビルダー パターンでは、必須のパラメーターは 1 つだけで、残りはオプションですが、またはを設定clientId
する必要があります。これら 3 つのいずれも設定されていない場合、上記のコードに示すようなエラー メッセージが表示されます。そのチェックは実行時に行っています。可能であればコンパイル時にこのチェックを行い、すべてが提供されない限りパターンをビルドしないでください。userid
flowid
deviceid
IllegalStateException
毎回これら 3 つの ID をすべて渡すことは必須ではありません。3 つすべて、場合によっては 2 つ、場合によっては 1 つだけを渡すことができますが、条件はいずれか 1 つを設定する必要があります。
実行時にこれを行うのではなく、コンパイル時にのみ ID 検証を行うことができるように、ビルダー パターンを改善するにはどうすればよいですか?
同じことを正確に説明しているこのSOリンクを見つけましたが、シナリオでどのように使用できるかわかりませんか? また、ひねりを加えたこのビルダーパターンとこのSOの質問
ビルダーパターンでこれをどのように修正できますか?
java - すべてのパラメータを必須としてビルダーパターンを使用するには?
ほとんどの場合、すべてのパラメーターが必須になるビルダー パターンがあるため、以下のコードに示すように長いコンストラクターを作成しました。
すべてのパラメータが必須である場合、私は混乱していますが、どのように役立つのでしょうか? 上記の Builder パターンを表現するより良い方法はありますか? ビルダーコンストラクターに渡されるパラメーターの数を減らすために、独自のクラスに渡されるパラメーターを論理的にグループ化する可能性がありますか?
別々のオブジェクトを持つことで物事がかなり単純化されますが、コードに慣れていない場合は、物事を理解するのが少し難しくなります。私ができることの 1 つは、すべてのパラメーターを独自のaddParam(param)
メソッドに移動し、実行時にメソッド内の必須パラメーターの検証をbuild()
実行することですか?
ここで従うべきベストプラクティスは何ですか?ここで使用できるより良いアプローチはありますか?
java - ビルダー オブジェクトを別のオブジェクトにコピーし、その中のいくつかのフィールドを変更するにはどうすればよいですか?
以下に示すようなビルダークラスがあります。
私はビルダークラスを次のように作成しています:
ここで、オブジェクトのコピーを作成し、keys
それを新しいRequestKey
オブジェクト say itに割り当て、変数内のユーザー IDのみを他のユーザー ID sayにkeysCopy
変更したいと考えています。これどうやってするの?keysCopy
12345L
私の他のクラスでは、このkeys
オブジェクトにアクセスできるので、それをコピーしてkeysCopy
オブジェクトを作成し、ユーザー ID を変更してそのオブジェクトに含める必要があります。このセッターを呼び出し12345L
て設定する必要がある場合もあります。FlowId
setFlowId
javascript - Builder パターンは未定義のオプションをどのように処理する必要がありますか?
JavaScript でビルダーを構築していますが、ビルダーがオプションの未定義の値を通常どのように処理するのかわかりません。フィールドが未定義の場合、ビルダーはオプションのフィールドをオブジェクトに追加しないと思います。それはビルダーに受け入れられますか?そうでない場合、代替手段は何ですか?
ビルダーが未定義のオプションを追加しない最初の実装のサンプルを次に示します。
ビルダー:
実際に:
前もって感謝します!
java - メソッドのjavadocで変数の値を表示する方法は?
以下に示すような静的クラスを持つ Builder パターンがあります。
addCount
ここで、メソッドに Javadoc を追加してmaxCount
、実際の数値をハードコーディングせずに値を表示できるようにします。を使用してみ{@value Builder#maxCount}
ましたが、そのメソッドで Javadoc を検索すると値 3 が表示されませんか? 私はここで何をしているのですか?
scala - ファントム型を使用した Scala Builder パターン
Scala で以下のビルダー パターンを使用します。簡単にするために、 orのみを含み、 orへの接続を持たないA
そのような3 つのインスタンスを使用しています。問題は、私が使用しなければならないコードのどこでも、呼び出しが潜在的に安全ではないことです。たとえば、で失敗します。それを守るために、ケースとオプションを一致させ、None ケースを処理する必要があります。instance1
field1
field2
field3
val s = A.instance1.field1.get; doSomething(s)
get
A.instance1.field2.get
None.get
別の解決策は、ファントム型とも呼ばれるパラメーター化された型を使用することです。そのテーマに関する優れたチュートリアルはほとんど見つかりませんでした。また、Scala でファントム型と実際のデータ (または状態) を使用してタイプ セーフなビルダー パターンを実装する方法を見つけることができませんでした。すべての例はメソッドのみを説明しています。
私の例でファントム型を使用して、実行時None
例外を回避し、適切な型不一致例外のみを取得するにはどうすればよいですか? 言及されているすべてのクラスとメソッドをパラメーター化し、封印された特性を使用しようとしていますが、これまでのところ成功していません。
java - Javaはコンストラクターの数を減らします
コンストラクターを持つクラスがあり、それぞれに 2 つのパラメーターがあるとします。たとえば、5 つの型があり、そのうちの 2 つを最初のパラメーターとして、3 つを 2 番目のパラメーターとして渡すことができます。
タイプが A、B、C、D、E であるとします。基本的に私はこのようなものを持っています:
ご覧のとおり、これらの型のすべての可能な組み合わせがあり、標準のビルダー パターンのようにオプションのパラメーターはありません。
コンストラクターの数を減らすにはどうすればよいですか? 私を助けるパターンはありますか?
編集
A を指定した場合は B を指定できず、C を指定した場合は D または E を指定できないため、標準ビルダーは使用できません。