問題タブ [mixins]
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.
ruby - Ruby ミックスインとインスタンス変数
パラメータを混合メソッドに渡すベストプラクティスの方法はありますか?
ミックスインを使用するクラスは、混合メソッドが期待するインスタンス変数を設定するか、必要なすべてのパラメーターを引数として混合メソッドに渡すことができます。
この背景には、コンテンツのパブリッシュを行う Rails コントローラーがありますが、他のコントローラーやモデルでさえ「パブリッシャーとして機能する」ことができる必要があるため、コントローラーのメソッドをモジュールに分解し、それをミックスインします。必要です。
たとえば、「パブリッシャーとして機能する」必要がある Rails コントローラーのコードで、混合メソッド question_xhtml() を呼び出します...
最終的に、question_xhtml にはこれらすべてが必要です。このアプローチは合理的ですか、それともそうする方が良いでしょうか
...または、他の何か?
ruby - メソッドへのRubyモジュールの組み込み
クラスでは、特定の条件下でFoo
メソッドを含めたいと思います。Bar
include
シングルトンクラス内で実行しなくても、メソッドでを実現するためのよりクリーンな(そしてより明確な)方法はありますか?
c++ - テンプレートを介した C++ ミックスイン: なぜこれが機能しないのですか?
いくつかの純粋な仮想パブリック メソッドを持つ抽象基本クラスとして実装されたインターフェイスがあります。サブクラス間の違いは大きくないため、これらの純粋仮想関数はテンプレートを使用して実装できます。そのため、複数の継承を使用して、実装を提供する適切にテンプレート化されたヘルパー クラスを混在させることを考えました。ただし、コンパイラは、基本クラスが抽象であると不平を言います。ヘルパー mix-in の実装を考慮していないため、必要なメソッドの実装がないと考えています。
例えば:
MSC 10.0 (Visual Studio 2010) を使用しています。g++ 4.5 を使用すると、コードは同様のエラーで失敗します。
Get
または、私のプロジェクトの実際の同等物は、適切なパフォーマンスのためにインライン化する必要がある非常にマイナーな操作であるため(put-pixel/get-pixelを考えてください)、仮想にすることはできません-したがって、汎用アルゴリズムではなく、汎用アルゴリズムをテンプレート化する必要があります仮想関数呼び出しを介して。
ruby - クラス定義の最後で mixin メソッドを実行する
レシーバークラスを反映してコードを生成するミックスインがあります。これは、次の単純な例のように、クラス定義の最後でクラス メソッドを実行する必要があることを意味します。
ミックスインにこれを自動的に実行してもらいたいのですが、方法が思いつきません。私の最初の考えは、ミックスインに追加receiver.print_methods
するself.included
ことでしたが、それを反映させたいメソッドがまだ宣言されていないため、機能しません。クラスの最後に電話include PrintMethods
することもできましたが、それは悪い形のように感じます.
print_methods
クラス定義の最後に呼び出す必要がないように、これを実現するためのトリックはありますか?
scala - Scalaの動的ミックスイン - 可能ですか?
私が達成したいのは、適切な実装を行うことです
B が何であるかは知っているかもしれませんが、A が何であるかはわかりません (ただし、B に自己型がある場合は、A にいくつかの制約を追加できます)。scala コンパイラは上記の署名に満足していますが、実装がどのようになるかはまだわかりませんでした。
私の頭に浮かんだいくつかのオプション:
- リフレクション/動的プロキシの使用。
- 最も単純なケース: A は Java レベルのインターフェースであり、B をインスタンス化でき、自己型はありません。難しいことではないと思います (予想外の厄介な問題に遭遇しない限り):
新しい B (b) を作成し、A と B の両方を実装し、a または b のいずれかに委譲する呼び出しハンドラーを使用するプロキシも作成します。 - B をインスタンス化できない場合でも、そのサブクラスを作成して、上記で説明したようにすることができます。自己型もある場合は、おそらくあちこちで委任が必要になるでしょうが、それでも機能する可能性があります。
- しかし、A が具象型で、適切なインターフェイスが見つからない場合はどうなるでしょうか。
- さらに問題が発生する可能性はありますか (たとえば、線形化に関連するものや、Java の相互運用性を支援する特別な構成要素など)?
- 最も単純なケース: A は Java レベルのインターフェースであり、B をインスタンス化でき、自己型はありません。難しいことではないと思います (予想外の厄介な問題に遭遇しない限り):
- mixin の代わりに一種のラッピングを使用して B[A] を返すと、b から a にアクセスできます。
残念なことに、この場合、呼び出し元はネスティングがどのように行われるかを知る必要があります。必要な機能にアクセスするための適切なレベルのネストであるため、解決策とは考えていません。 - コンパイラ プラグインの実装。私はそれを経験したことはありませんが、私の直感は、それは簡単ではないということです. Kevin Wright のautoproxyプラグインにも少し似たような目的があると思いますが、私の問題には十分ではありません (まだ?)。
他に有効なアイデアはありますか?どの方法をお勧めしますか? どのような「挑戦」が待っているのでしょうか。
それとも、現在の Scala 制約では不可能なため、忘れるべきでしょうか?
問題の背後にある意図: ビジネス ワークフローがあるとしますが、厳密すぎません。順序が固定されているステップもあれば、固定されていないステップもありますが、最後にすべてのステップを実行する必要があります (または、さらに処理が必要なステップもあります)。
もう少し具体的な例: A があり、それに B と C を追加できます。どちらが先かは気にしませんが、最後には A と B と C が必要になります。
コメント: 私は Groovy についてあまり知りませんが、SO がこの質問をポップアップしました。
design-patterns - 単一責任とミックスイン
Mixinsは通常、クラスに新しい動作を導入することを考えると 、これは通常、クラスに複数の動作があることを意味します。
クラスに単一の責任がある場合、これは変更の理由が1つしかないクラスとして定義されます。
だから、私はこれを2つの異なる視点から見ることができます
クラスには変更の理由が1つだけあります。混合されたモジュールにも、変更の理由が1つだけあります。クラスが変更された場合、クラスのみを再テストする必要があります。モジュールを変更した場合は、モジュールのみを再テストする必要があります。したがって、SRPはそのままです。
クラスには、変更の2つの理由があります。クラスが変更された場合、クラスとモジュールの両方を再テストする必要があります。モジュールが変更された場合は、クラスとモジュールの両方を再テストする必要があります。ヘンジ、SRPに違反しています。
ミックスインの使用は単一責任の原則に違反し、最終的にはシステムの保守が困難になりますか?
scala - Scalaでの型パラメーターとミックスインの使用
編集2:
以下のコードを使用して、ミックスインと型パラメーターの組み合わせを使用して、RomanNumeralsを使用した演習で必要な型安全性を達成することができました。本質的には、すべてをインポートした後、RomanNumerals
書き込むことはできますが、タイプの不一致コンパイラエラーが発生します(ローマ数字の不正な組み合わせであるため)。今、私は、特性、ミックスイン、および型パラメーターを使用するこの方法が問題ないと見なされるのか、いわば言語を乱用しているのか疑問に思っています:)より単純でクリーンなもので同じ種類の型安全性を達成するより良い方法はありますかコード?L X V I
L L
X L X
編集:
ビクターの回答に基づくさらなる質問。わかりましたが、Bがトレイトになるように、typeパラメーターに上限と下限を追加するとどうなりますか?例えば
それともB
、この場合でもクラスになることができますか?f引数も適用されることがわかっている場合はどうなりFoo[B] with B
ますか?それを使用しB
てリターンタイプとミックスインする方法はありますか?
以下の元の質問
Scalaでオブジェクトを作成するときに、型パラメーターとして取得するトレイトをミックスしたい:
これにより、コンパイルエラーが発生します。
私も試しました:
しかし、それは機能しません:
これを回避する方法はありますか?withMの戻り型が次のようになるようFoo with B
に、B
はに渡される型パラメータです。withM
ruby - ruby ミックスインの奇妙な継承
含まれているモジュールのメソッドが後続のクラス定義に混在しているのはなぜですか (クラスがそれ自体に含まれているかのように)。
プリント:
これは予想される動作ですか?なんで?
c++ - 可変個引数テンプレートを使用して C++ で mixin コンストラクターの問題を解決する
私は最近、コンストラクターの問題に取り組みました。この問題では、互いに装飾するさまざまな mixin クラス (および最上位のホスト クラス) が異なるコンストラクター シグネチャを持っています。結果の装飾されたクラスで単一のコンストラクターを維持し、init 関数を追加せずに、次の解決策を見つけました。mixin クラスに課される唯一の制限は、そのコンストラクターが複数のパラメーターを受け取る場合、それらはすべて単一のタプルにカプセル化する必要があるということです。(このコードを g++ でコンパイルするには、-std=c++0x フラグが必要です)
私の質問は次のとおりです
。1) C++0X でこの問題を解決するためのより優れた、より洗練された方法はありますか?
2) 具体的には、タプルは本当に必要ですか?
c# - Mixinsと.net
正確には、ミックスインとは何ですか?
C#でそれを達成するためのテクニックはありますか?