問題タブ [leaky-abstraction]
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.
clojure - clojure.lang は本当に単なる実装の詳細なのですか?
Clojure では、一部のタスク ( のインスタンス化や、関数と互換性のあるカスタム データ型の実装にPersistentQueue
使用するなど) では、 のクラスやインターフェイスに関する知識が必要です。deftype
clojure.core
clojure.lang
ただし、によるとclojure.lang/package.html
:
パブリック API の一部と見なされる唯一のクラスは
clojure.lang.IFn
. 他のすべてのクラスは、実装の詳細を考慮する必要があります。
これらの記述は間違っていますか、それとも時代遅れですか? もしそうなら、将来それらを修正する予定はありますか?そうでない場合、上記のタスクを実行するためのより好ましい方法はありますか、それとも慣用的な Clojure コードではまったく実行すべきではありませんか?
c# - 実装の 1 つに余分な手順が必要な場合に、漏れやすい抽象化を回避するための C# パターン
ITracker
次のようなインターフェイスを実装しています。
最初に、Mixpanel.NET をラップするこのインターフェイスの実装を作成しました。次に、Application Insights をラップする別のものを作成しました。ただし、Application Insights ではFlush()
、データをサーバーに送信する必要があります。
実装の1つがメソッドを必要とするという理由だけITracker
で、メソッドでインターフェイスを汚染したくありません。Flush()
漏れやすい抽象化のように感じるでしょう。
ただし、ある時点 (おそらくアプリケーションのシャットダウン時) でこのメソッドを呼び出す必要があり、呼び出されるたびに呼び出したくありませんTrack
。
セッションの最後にトラッカーがガベージ コレクションされるときにメソッドを呼び出すことは可能ですか? これも良いアプローチですか?
ここでトリックを逃したような気がします!
idris - 型に名前が付けられると自動暗黙引数が機能しなくなる
この回答を書いているときに、これが期待どおりに機能することに気付きました。
しかし、プロパティに名前を付けるとすぐに機能しなくなります:
引数を埋めるとauto
失敗するようになりました
Idris がDivides
の定義を見抜くことができないのはなぜですか?
java - API に返されるオブジェクトの実装固有のメソッドへのアクセス
問題を抽象的に定式化することから始めましょう。2 つのパブリック インターフェイス タイプがあります。それらの 1 つには、他のインターフェイス タイプのインスタンスを少なくとも 2 つ受け取るメソッドが含まれています。メソッドの実装は、渡されたオブジェクトの実装に依存します。
2 つのインターフェイスで構成される次のパブリック API について考えてみましょう。
次に、その API を次のように実装します。
メソッド内のラップされたオブジェクトにアクセスする必要がありますが、メソッドは API の一部ではないconnect
ため、これは不可能です。getWrapped
実装の詳細です。
connect
問題は、実装の詳細を API に漏らさずにメソッドを実装するにはどうすればよいかということです。
これが私がこれまでに試したことです:
connect
メソッドをNode
インターフェースに入れ、 を呼び出しますparent.connect(child)
。これにより、親のラップされたオブジェクトにアクセスできるようになりますが、子のラップされたオブジェクトはまだ利用できません。渡された
Node
のが型であると仮定してNodeImpl
、ダウンキャストを使用してください。これは私には間違っているようです。他のNode
実装があるかもしれません。ラップされたオブジェクトをノードに配置しないでください。をオブジェクトに
TreeImpl
マップするマップを使用してください。Node
Wrapped
これは基本的に上記と同じです。インスタンスが関連付けられたマッピングを持たないメソッドにNode
渡されるとすぐに壊れます。connect
Node
インターフェイスにはメソッドが含まれる場合があることに注意してください。ただし、これはこの質問にとって重要ではありません。
また、インターフェースの宣言と実装の両方を管理していることに注意してください。
これを解決する別の試みは、メソッドをインターフェイスのメソッドに変換し、インターフェイスを汎用にすることconnect
です。addChild
Node
Node
Node
createNode
パブリック API の一部です。NodeImpl
そしてWrapped
隠す必要があります。run
クライアントコードです。ご覧のとおり、NodeImpl
はクライアントに表示される必要があるため、これはまだ漏れのある抽象化です。