問題タブ [fluent-interface]
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.
c# - C#プロパティとチェーンメソッドを流暢に設定する
.NET3.5を使用しています。いくつかの複雑なサードパーティのクラスがあります。これらは自動的に生成され、制御できなくなりますが、テスト目的で使用する必要があります。私のチームがテストコードで多くの深くネストされたプロパティの取得/設定を行っているのを見て、それはかなり面倒になっています。
この問題を解決するために、階層ツリー内のさまざまなオブジェクトにプロパティを設定するための流暢なインターフェイスを作成したいと思います。このサードパーティライブラリには多数のプロパティとクラスがあり、すべてを手動でマッピングするのは面倒です。
私の最初の考えは、オブジェクト初期化子を使用することでした。Red
、、、Blue
およびGreen
はプロパティであり、4番目のプロパティをその混合色で最も近いRGBセーフカラーにMix()
設定するメソッドです。塗料は、使用する前にColor
均質化する必要があります。Stir()
これはを初期化するために機能しますが、チェーンやその他のメソッドをそれPaint
にチェーンする必要があります。Mix()
次の試み:
ただし、設定するプロパティごとにメソッドを定義する必要があり、すべてのクラスに何百もの異なるプロパティがあるため、これは適切にスケーリングされません。また、C#にはC#4より前のメソッドを動的に定義する方法がないため、何らかの方法でこれを自動的に行うためにフックすることはできないと思います。
3回目の試行:
それはそれほど悪くはないように見えます、そしてそれは実行可能であるように思われます。これは推奨されるアプローチですか?Set
このように機能するメソッドを作成することは可能ですか?それとも、別の戦略を追求する必要がありますか?
c# - 流暢なインターフェース設計とコードの匂い
基本的には、次のようなことができるようになりたいです。
そのため、いくつかの「ステップ」には名前が付けられており、いくつかは付けられていません。
私が気に入らないのは、StepClause がその派生クラス NamedStepClause の知識を持っていることです。
私はこれをよりよくするためにいくつかのことを試しました。私は物事をインターフェイスに移動しようとしましたが、問題は具体的なものからインターフェイスに移動しました. Step() を完全に別の型の一部にすることもできます。その場合、この問題は発生せず、次のようになります。
これは問題ありませんが、可能であればステップの命名をオプションにしたいと思います。
SO hereに関するこの他の投稿は、興味深く有望に見えます。あなたの意見は何ですか?元の解決策は完全に受け入れられないと思いますか?
ところで、これらのアクション メソッドは述語とファンクターを使用しますが、ステップに名前を付けるために追加のパラメーターを使用する必要はないと思います。
私にとって重要なのは、これらのアクション メソッドを 1 か所だけで定義することです。したがって、ジェネリックと拡張メソッドを使用した参照リンクのソリューションは、これまでのところ最良のアプローチのようです。
java - 流暢なインターフェースを持つメソッド名
私は次のPermissions
ような流暢なスタイルのメソッドを持つJavaのクラスを持っています:
問題は、これらのメソッドに名前を付けるか、それとも。set{Property}
だけにするかです{property}
。後者は次のようになります。
これらのメソッドを個別に見ると、read
何かが読み取れると思いますが、一方で、Scalaのような名前付きパラメーターのようなものを使用する意図に近いです。
c# - ライブラリ開発-提案された機能の有効なユースケースを探す
私は、「リフレクションを使用する開発者のエクスペリエンスを向上させる」ことを目的としたFasterflectというライブラリに貢献しています。そのため、従来のリフレクションの上に構築された抽象化を提供し、まったく同じシナリオで使用されます。
次に、オブジェクトインスタンスを介してメンバーにアクセスするための現在の構文を示します。
あるユーザーは、lamdbaベースのアクセスのサポートを追加することを提案しました(Fluent Hibernateと同様)。
コンパイル時に知らない型に対してリフレクションが通常実行されることを考えると、これが役立つシナリオを考えるのに苦労しています。私は想像力に欠けているだけですか?コンパイル時にタイプがわかっているリフレクションの有効なシナリオはありますか?
このNBuilder機能リクエストには、元の提案に対する追加のコンテキストがいくつかあり、 Fasterflect機能リクエストを表示することもできます。
.net - 流暢なインターフェイスは、.NETアプリケーションの実行時のパフォーマンスに大きな影響を与えますか?
私は現在、既存のテクノロジーに流暢なインターフェースを実装することに専念しています。これにより、次のスニペットのようなコードが可能になります。
このような構造を実装するには、引数を蓄積して他のオブジェクトに渡すクラスが必要です。たとえば、Open.File(...).In(...)
構成を実装するには、次の2つのクラスが必要です。
つまり、最初の例などの構成要素ステートメントが多いほど、実際のステートメントが最終的に実行できるようになるまで、チェーン内の後続のオブジェクトに引数を渡すために、より多くのオブジェクトを作成する必要があります。
質問:
私はいくつかの意見に興味があります:上記の手法を使用して実装された流暢なインターフェイスは、それを使用するアプリケーションの実行時のパフォーマンスに大きな影響を与えますか?実行時のパフォーマンスでは、速度とメモリ使用量の両方の側面を参照します。
非常に短い期間だけ、潜在的に多数の一時的な引数節約オブジェクトを作成する必要があることを覚えておいてください。これは、ガベージコレクターに一定の圧力をかける可能性があると思います。
パフォーマンスに大きな影響があると思われる場合は、流暢なインターフェイスを実装するためのより良い方法を知っていますか?
c# - Castle Fluent Interface でインターセプターを登録する
インターセプターを介してnhibernate トランザクション処理を実装しようとしていますが、流暢なメカニズムを介してインターフェイスを登録する方法がわかりませんでした。
私は見る
しかし、それを使用する方法がわからない。誰かが私を助けることができますか?この例は少し複雑に見えました。
php - PHPでメソッドチェーンの終わりを検出していますか?
上記の私の質問に関する簡単な例が見つかりません: メソッドチェーンの終わりを検出するにはどうすればよいですか?
たとえば Zend_Db_Select を見ただけですが、これはこの単純な質問には複雑すぎると思います。
PHPでメソッドチェーンの「終わり」をキャッチすることは可能ですか?
ありがとう、ファブリック
javascript - AJAXの非同期性を抽象化するための流暢なJavascriptインターフェースの設計
AJAXおよびHTTPリクエストの非同期性を隠すようにAPIを設計する方法、または基本的にそれを遅らせて流暢なインターフェイスを提供する方法を教えてください。Twitterの新しいAnywhereAPIの例を示すには:
vsこれ(各呼び出しの非同期性がはっきりと見える)
ユーザーを検索し、ツイートのタイムラインを取得し、最初の20件のツイートのみをフィルタリングし、カスタムフィルターを適用し、最終的にコールバック関数を使用して各ツイートを処理します。
このような適切に設計されたAPIは、each / map / etcなどのループ関数に到達するまで、各関数呼び出しがクエリ(この場合はHTTP URL)を構築するクエリビルダー(ORMを考えてください)のように機能するはずです。 HTTP呼び出しが行われ、渡された関数がコールバックになります。
簡単な開発ルートは、各AJAX呼び出しを同期させることですが、それはおそらく最善の解決策ではありません。私はそれを非同期にする方法を考え出し、それでもAJAXの非同期性を隠すことに興味があります。
c# - C#で可能な部分的なジェネリック型推論?
IoCクラスライブラリの流暢なインターフェイスの書き直しに取り組んでいます。基本クラスを通じていくつかの共通機能を共有するためにコードをリファクタリングしたときに、問題が発生しました。
注:これは私がやりたいことであり、私がしなければならないことではありません。別の構文でやらなければならない場合はそうしますが、コードを希望どおりにコンパイルする方法について誰かが考えている場合は、大歓迎です。
特定の基本クラスでいくつかの拡張メソッドを使用できるようにしたいのですが、これらのメソッドは、メソッドの引数に関連する1つのジェネリック型を持つジェネリックである必要がありますが、メソッドは、特定の子孫に関連する特定の型も返す必要があります。 'が呼び出されます。
上記の説明よりもコード例の方が優れています。
動作しないものの簡単で完全な例を次に示します。
これをコンパイルすると、次のようになります。
私が欲しいのは、拡張メソッド( )がとのParameter<T>
両方で呼び出せるようにすることです。どちらの場合も、戻り型は拡張が呼び出された型と一致する必要があります。ConcreteTypeRegistration
DelegateRegistration
問題は次のとおりです。
私は書きたいです:
しかし、Parameter<T>
それはそれが呼び出されたのと同じタイプのオブジェクトを返します。つまり、次のことを意味します。
コンパイラをだましてこの飛躍をさせる方法はありますか?
メソッドに2つのジェネリック型引数を追加するとParameter
、型推論によって両方を提供するか、何も提供しないように強制されます。これは、次のことを意味します。
私にこれを与えます:
これも同様に悪いことです。
クラスを簡単に再構築したり、メソッドを階層に導入することで非拡張メソッドにすることもできますが、私の質問は、2つの子孫のメソッドを複製する必要がなく、何らかの方法で1回だけ宣言できるかどうかです。 、基本クラスの場合。
言い換えれば。上記の最初のコード例のクラスを変更して、問題のメソッドを複製せずにMainメソッドの構文を保持できるようにする方法はありますか?
コードは、C#3.0と4.0の両方と互換性がある必要があります。
編集:両方のジェネリック型引数を推論に残したくない理由は、一部のサービスでは、1つの型のコンストラクターパラメーターにパラメーター値を指定し、子孫である値を渡すためです。今のところ、指定された引数値と呼び出す正しいコンストラクターの照合は、引数の名前とタイプの両方を使用して行われます。
例を挙げましょう:
両方を型推論に任せると、パラメーターの型はでFileStream
はなく、になりますStream
。
php - クロージャーは DSL/流暢なインターフェイスの作成にどのように役立ちますか: PHP の例?
クロージャーが DSL (流暢なインターフェース) の作成にどのように役立つかを示す PHP の例を教えてください。
編集:次の質問で受け入れられた回答は、ネストされたクロージャーについて説明しています。誰かがその例を PHP に翻訳できれば、それも役に立ちます: 流暢なインターフェースの経験はありますか? あなたの意見が必要です!