問題タブ [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.
inheritance - Scalaでの自己型継承
私が次の特徴を持っているとしましょう:
コンパイラエラー:illegal inheritance; self-type C does not conform to B's selftype B with A
予想どおり、自己型アノテーションのコメントを外すと、コンパイラは問題ありません。
Cもこのセルフタイプを必要とする理由は明らかだと思います。コンパイラがすでに必要であると判断できた場合、なぜAから「継承」できないのか理解できません。
複雑な階層を持つセルフタイプを使用する場合、特に、それぞれが独自のセルフタイプを持つ多数の特性を混在させる場合は、冗長性を減らすことができると思います。
私はおそらく現在の振る舞いには正当な理由があると思います、私はそれが何であるかを見つける/理解することができませんでした。
最初は、ミックスインの線形化に関連しているのではないかと思いましたが、ここでは再生されないようです(より複雑な自己タイプとより多くの特性が混在している場合でも)。
場合によってはあいまいさが発生しますか?もしそうなら、あいまいさがないのになぜそれが機能しないのですか?
それとも、それを適切に実装する際のいくつかの困難に関連していますか?
トピックに関するいくつかの議論を見つけることができましたが(自己タイプが継承されていないなど)、ほとんどの場合、問題を述べているだけで、説明や解決策(存在する場合)があまりないので、それがどのようであるかを結論付けています。
scala - scala での Mixins とコンポジション
Java の世界 (より正確には、複数の継承/ミックスインがない場合) の経験則は非常に単純です: 「クラスの継承よりもオブジェクトの構成を優先する」。
特にscalaで、ミックスインも検討する場合、それがどのように変更されるかを知りたいですか?
ミックスインは、複数の継承またはより多くのクラス構成の方法と見なされますか?
「クラス構成よりもオブジェクト構成を優先する」(またはその逆) ガイドラインもありますか?
オブジェクト構成でも機能する場合に mixin を使用 (または悪用) する例をいくつか見てきましたが、どちらが優れているかは常にわかりません。それらを使用して非常に類似したことを達成できるように思えますが、いくつかの違いもあります。いくつかの例:
- 可視性 - ミックスインを使用すると、すべてがパブリック API の一部になりますが、コンポジションの場合はそうではありません。
- 冗長性 - ほとんどの場合、ミックスインは冗長性が低く、使いやすいですが、常にそうであるとは限りません (たとえば、複雑な階層で自己型も使用する場合)
短い答えが「場合による」であることは知っていますが、おそらく、これまたはそれが優れている典型的な状況がいくつかあります。
これまでに思いついたガイドラインの例をいくつか示します (2 つの特性 A と B があり、A が B のいくつかのメソッドを使用したいと仮定します)。
- A の API を B のメソッドで拡張したい場合は mixin、それ以外の場合はコンポジションです。しかし、作成しているクラス/インスタンスがパブリック API の一部でない場合は役に立ちません。
- ミックスインを必要とするいくつかのパターン (例: Stackable Trait Pattern )を使用したい場合は、簡単に決定できます。
- 循環依存関係がある場合は、自己型の mixin が役立ちます。(私はこの状況を回避しようとしますが、必ずしも簡単ではありません)
- 動的な実行時の決定が必要な場合は、合成を行う方法、次にオブジェクトの合成を行います。
多くの場合、mixin の方が簡単 (および/または冗長度が低い) ように見えますが、"God クラス" や、artima の 2 つの記事: part 1、part 2 (BTW it他の問題のほとんどは関連性がなく、scala にはそれほど深刻ではないように思えます)。
このようなヒントは他にありますか?
castle-dynamicproxy - 城の動的プロキシを使用してインターフェイスを集約するにはどうすればよいですか
コードベースで宣言型 mixin 管理を許可したいと考えています。次のようなインターフェイスを宣言したい
したがって、私のクラスは、必要なデータ アクセス レイヤーのビットのみを使用できます。私の IoC コンテナーでは、これらのインターフェイスの実装を 1 つのインスタンスに集約したいと考えています。ただし、参照されたスレッドと同様のことを行うと、ジェネレーターは、インターフェイスが複数の場所で実装されていることを示す例外をスローします。独自のインターセプターを実装して通過する以外に何ができますか?
関連するスレッド:
より良い例 (コードの壁)
スロー
c++ - C++でSingletonMixinクラスを作成する
私には4つのクラスがあります。S1、S2、S3、S4と呼びましょう。これらのクラスはシングルトンです。それぞれにgetInstanceとfinalizeメソッド(およびインスタンスのプライベート変数)があります。
ここで、finalizeメソッドとgetInstanceメソッドの繰り返しを避けるために、次のようなSingletonMixinクラスを作成しようとしています。
ここでの問題は、シングルトンクラスをインスタンス化し、コンストラクターをプライベートに保つにはどうすればよいかということです。
編集
(説明)
つまり、どうすればそれを行うことができますか?
しかし、プライベートTコンストラクトT()
ありがとう!
ruby-on-rails - 共通のプロパティをactiverecordクラスに注入する正しい方法は何ですか?
このモジュールを使用する予定でした (完全な例はこちらhttp://pastie.org/1098444 )
しかし、これらの値はモデルに到達していないようです。
と
ActiveRecord::StatementInvalid: SQLite3::ConstraintException: categories.name は NULL にできません: INSERT INTO "categories" ("created_at", "updated_at", "id") VALUES ('2010-08-15 23:20:43' 、「2010-08-15 23:20:43」、980190962)
どうすればこれを行うことができなければ、これはまったく有効なアプローチですか? もしそうなら、私の間違いは何ですか?
単体テストの失敗
終わり
若干の痕跡
test_can_be_created(TileTest): ActiveRecord::StatementInvalid: SQLite3::ConstraintException: categories.name は NULL にできません: INSERT INTO "categories" ("created_at", "updated_at", "id") VALUES ('2010-08-16 02 :06:43', '2010-08-16 02:06:43', 980190962) /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc /lib/active_record/connection_adapters/abstract_adapter.rb:202:in rescue in log'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter.rb:194:in
log' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/ connection_adapters/sqlite_adapter.rb:135:in execute'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:239:in
insert_fixture' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:634 :in block in insert_fixtures'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:570:in
each' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:570:ininsert_fixtures'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in
ブロック (4 レベル) in create_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in each'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:514:in
block (3 レベル) create_fixtures 内の /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract/database_statements.rb:139 : transaction'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:512:in
create_fixtures 内のブロック (2 レベル) ' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/connection_adapters/abstract_adapter.rb: 104: disable_referential_integrity'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:503:in
create_fixtures のブロック内' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activesupport-3.0.0.rc/lib/active_support/benchmarkable.rb:55:insilence'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:502:in
create_fixtures' /Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:961:in load_fixtures'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activerecord-3.0.0.rc/lib/active_record/fixtures.rb:926:in
setup_fixtures' /Users/janlimpens/ .rvm/gems/ruby-1.9.2-rc2@rails3/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:409:_run_setup_callbacks'
/Users/janlimpens/.rvm/gems/ruby-1.9.2-rc2@rails3/gems/activesupport-3.0.0.rc/lib/active_support/testing/setup_and_teardown.rb:34:in
実行中'
c++ - What detectable differences are there between a class and its base-class?
Given the following template:
What visible differences in interface or behaviour are there between an object of type Foo
and an object of type wrapper<Foo>
?
I'm already aware of one:
wrapper<Foo>
only has a nullary constructor, copy constructor and assignment operator (and it only has those if those operations are valid onFoo
). This difference may be mitigated by having a set of templated constructors inwrapper<T>
that pass values through to the T constructor.
But I'm not sure what other detectable differences there might be, or if there are ways of hiding them.
(Edit) Concrete Example
Some people seem to be asking for some context for this question, so here's a (somewhat simplified) explanation of my situation.
I frequently write code which has values which can be tuned to adjust the precise performance and operation of the system. I would like to have an easy (low code overhead) way of exposing such values through a config file or the user interface. I am currently writing a library to allow me to do this. The intended design allows usage something like this:
When run, this would set up or read the following configuration values:
This is made up code (as it happens my use case isn't even machine learning), but it shows a couple of important aspects of the design. Tweakable values are all named, and may be organised into a hierarchy. Values may be grouped by a couple of methods, but in the above example I just show one method: Wrapping an object in a hotobject<T>
class. In practice, the hotobject<T>
wrapper has a fairly simple job -- it has to push the object/group name onto a thread-local context stack, then allow the T
object to be constructed (at which point the hotvar<T>
values are constructed and check the context stack to see what group they should be in), then pop the context stack.
This is done as follows:
As far as I can tell, construction order in this scenario is quite well-defined:
hotobject_stack_helper
is constructed (pushing the name onto the context stack)T
is constructed -- including constructing each ofT
's members (the hotvars)- The body of the
hotobject<T>
constructor is run, which pops the context stack.
So, I have working code to do this. There is however a question remaining, which is: What problems might I cause for myself further down the line by using this structure. That question largely reduces to the question that I'm actually asking: How will hotobject behave differently from T itself?
python - 「ミックスイン」クラスを古いスタイルの基本クラスに適用する方法
新しいスタイルのクラスの上に重ねられるように設計された mixin クラスを作成しました。
この mixin を古いスタイルのクラスに適用する最もスムーズな方法は何ですか? super
メソッドでへの呼び出しを使用している__init__
ため、これはおそらく (?) 変更する必要がありますが、それ以外の場合は、 への変更をできるだけ少なくしたいと考えていMixinClass
ます。必要な変更を行うサブクラスを派生させることができるはずです。
から派生したクラスの上にクラスデコレータを使用することを検討していますBaseClass
。
whereMixinOldSchoolRemix
から派生し、混合されるクラスを含むクラス変数を代わりに使用するために使用するMixinClass
メソッドを再実装するだけです。この場合は. このクラス変数は、ミキシング プロセスの一部として設定されます。super
OldStyleClass
old_style_mix
old_style_mix
MixedWithOldStyleClass
mixin クラス (eg MixinOldSchoolRemix
) ディクショナリの内容でeg のクラス ディクショナリを更新するだけです。
これは合理的な戦略ですか?より良い方法はありますか?古いスタイルのクラスをまだ使用している利用可能なモジュールが多数あることを考えると、これはよくある問題のようです。
c# - 実装者からのインターフェイス拡張メソッドの呼び出しは、C#では奇妙です
実装者からインターフェイスで機能する拡張メソッドを呼び出すには、thisキーワードを使用する必要があるようです。これは奇妙に思えます。
誰かが理由を知っていますか?
インターフェイスの共有実装を取得する簡単な方法はありますか?
多重継承/ミックスインの撤回に苦しんでいるので、これは私を苛立たせます。
おもちゃの例:
ruby-on-rails - Railsのコントローラーからlink_toをミックスインして呼び出す方法は?
これは初心者の質問のように思えますが、簡単な答えは私にはわかりません。HTMLリンクを吐き出すメソッド を呼び出す必要がありlink_to
ます。を呼び出しますが、これはコントローラーのバージョンではなく、AVモジュールのバージョンを呼び出します。私はこれを私が意図したことをするように強制することができましたActionController
ActionView::Helpers::UrlHelper.link_to
url_for
コントローラーで。しかし、なぜそれが正確に機能するのかはまだわかりません。誰かがメソッドのスコープとここで起こっていることを隠すことを説明してもらえますか?link_to
コントローラで呼び出すことができるように(または一般的に、モジュールからの一部のメソッドのみを含めるために)混合するためのより良い方法は何ですか(リンクを使用してフラッシュ文字列を生成することがユースケースです)。
MVCについての講義はしないでください。どちらかといえば、link_to
とは別のモジュールで行う必要がありますurl_for
。これに関するノイズの量から判断すると、多くの人がこの一見些細な問題に遭遇し、アプリを機能させるための1分間のハックが本当に必要なときに、「Railsway」で1時間を無駄にすることになります。おそらくヘルパーとこれを行うための「レールの方法」はありますか?またはより良いルビーの方法?
ruby - Ruby モジュールのインクルードでモジュールのシングルトン クラスが除外されるのはなぜですか?
Ruby でクラスが継承されると、シングルトン クラスも継承されます。
ただし、モジュールの場合はそうではありません。
この制限を回避するために、多くの人がこの醜いハックに頼っています。
わかりましたので、私の質問: モジュールに対するこの制限の背後にある理論的/概念的な理由はありますか? それとも単に実装上の問題でしたか?
C ソース コード (YARV/MRI) を見た後、実装上の問題があることを確認できます (克服できないわけではありませんが、すべて同じです)。しかし、これが唯一の理由ですか? この制限の他の理由はありますか?
ありがとう