問題タブ [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.

0 投票する
1 に答える
144 参照

clojure - clojure.lang は本当に単なる実装の詳細なのですか?

Clojure では、一部のタスク ( のインスタンス化や、関数と互換性のあるカスタム データ型の実装にPersistentQueue使用するなど) では、 のクラスやインターフェイスに関する知識が必要です。deftypeclojure.coreclojure.lang

ただし、によるとclojure.lang/package.html

パブリック API の一部と見なされる唯一のクラスはclojure.lang.IFn. 他のすべてのクラスは、実装の詳細を考慮する必要があります。

これらの記述は間違っていますか、それとも時代遅れですか? もしそうなら、将来それらを修正する予定はありますか?そうでない場合、上記のタスクを実行するためのより好ましい方法はありますか、それとも慣用的な Clojure コードではまったく実行すべきではありませんか?

0 投票する
4 に答える
662 参照

c# - 実装の 1 つに余分な手順が必要な場合に、漏れやすい抽象化を回避するための C# パターン

ITracker次のようなインターフェイスを実装しています。

最初に、Mixpanel.NET をラップするこのインターフェイスの実装を作成しました。次に、Application Insights をラップする別のものを作成しました。ただし、Application Insights ではFlush()、データをサーバーに送信する必要があります。

実装の1つがメソッドを必要とするという理由だけITrackerで、メソッドでインターフェイスを汚染したくありません。Flush()漏れやすい抽象化のように感じるでしょう。

ただし、ある時点 (おそらくアプリケーションのシャットダウン時) でこのメソッドを呼び出す必要があり、呼び出されるたびに呼び出したくありませんTrack

セッションの最後にトラッカーがガベージ コレクションされるときにメソッドを呼び出すことは可能ですか? これも良いアプローチですか?

ここでトリックを逃したような気がします!

0 投票する
1 に答える
43 参照

idris - 型に名前が付けられると自動暗黙引数が機能しなくなる

この回答を書いているときに、これが期待どおりに機能することに気付きました。

しかし、プロパティに名前を付けるとすぐに機能しなくなります:

引数を埋めるとauto失敗するようになりました

Idris がDividesの定義を見抜くことができないのはなぜですか?

0 投票する
1 に答える
104 参照

java - API に返されるオブジェクトの実装固有のメソッドへのアクセス

問題を抽象的に定式化することから始めましょう。2 つのパブリック インターフェイス タイプがあります。それらの 1 つには、他のインターフェイス タイプのインスタンスを少なくとも 2 つ受け取るメソッドが含まれています。メソッドの実装は、渡されたオブジェクトの実装に依存します。

2 つのインターフェイスで構成される次のパブリック API について考えてみましょう。

次に、その API を次のように実装します。

メソッド内のラップされたオブジェクトにアクセスする必要がありますが、メソッドは API の一部ではないconnectため、これは不可能です。getWrapped実装の詳細です。

connect問題は、実装の詳細を API に漏らさずにメソッドを実装するにはどうすればよいかということです。

これが私がこれまでに試したことです:

  • connectメソッドをNodeインターフェースに入れ、 を呼び出しますparent.connect(child)これにより、親のラップされたオブジェクトにアクセスできるようになりますが、子のラップされたオブジェクトはまだ利用できません。

  • 渡されたNodeのが型であると仮定してNodeImpl、ダウンキャストを使用してください。これは私には間違っているようです。他のNode実装があるかもしれません。

  • ラップされたオブジェクトをノードに配置しないでください。をオブジェクトにTreeImplマップするマップを使用してください。NodeWrappedこれは基本的に上記と同じです。インスタンスが関連付けられたマッピングを持たないメソッドにNode渡されるとすぐに壊れます。connect

Nodeインターフェイスにはメソッドが含まれる場合があることに注意してください。ただし、これはこの質問にとって重要ではありません。

また、インターフェースの宣言と実装の両方を管理していることに注意してください。


これを解決する別の試みは、メソッドをインターフェイスのメソッドに変換し、インターフェイスを汎用にすることconnectです。addChildNodeNode

NodecreateNodeパブリック API の一部です。NodeImplそしてWrapped隠す必要があります。runクライアントコードです。ご覧のとおり、NodeImplはクライアントに表示される必要があるため、これはまだ漏れのある抽象化です。