12

今日のプログラミングで見られる抽象化の逆転の最悪の例は何ですか?

この概念に慣れていない方のために説明すると、抽象化の反転は、高レベルの構造の上に低レベルの構造を実装することです。より正確には、コンストラクト A と B があるとします。B は A の上に実装されていますが、A はどこにも公開されていません。したがって、下位レベルのコンストラクト A が本当に必要な場合は、そもそも B が A に関して実装されている場合、B の上に A を実装することになります。http://en.wikipedia.org/wiki/Abstraction_inversionを参照してください。

4

8 に答える 8

11

おそらく私がこれまでに見た抽象化の悪用の最悪の例は、基本的なフロー制御要素 (if、while、シーケンス式) を流暢なインターフェースでラップしたこの流暢な C#でした。

したがって、完全に慣用的でクリーンなコード:

var selectedTextBox = (TextBox)sender,
if (IsAdmin)
{
    selectedTextBox.Enabled = true;
    selectedTextBox.Text = superSecretPassword;
}
else
{ 
    selectedTextBox.Clear();
}

この混乱になります:

Cast<TextBox>(sender).
    WithIf(IsAdmin,
        With(selectedTextBox => selectedTextBox.Enabled = true).
        With(selectedTextBox => selectedTextBox.Text = superSecretPassword),
        With(selectedTextBox => selectedTextBox.Clear());

ラムダを使用するとすべてが改善されるためです。

于 2010-03-29T15:05:24.650 に答える
3

これはかなり死んだトピックのようです。議論を始めるために、私自身の質問に答えます。私が見た中で最悪の抽象化の逆転は、OOP スタイルの抽象クラス/インターフェイスを使用して関数ポインターを複製することだと思います。例えば:

interface foo {
    int bar();
}

class myClass1 implements foo {
    // No member variables.

    int bar() {
        // Implementation
    }

    // No other methods.
}

class myClass2 implements foo {
    // No member variables.

    int bar() {
        // Implementation
    }

    // No other methods.
}

クラスは、状態と動作の両方をカプセル化する必要がある場合の強力な抽象化であると想定されています。関数ポインターは、動作のみを格納するために使用される比較的単純なものです。仮想関数は関数ポインターの配列を使用して実装されますが、多くの OO 言語は関数ポインターまたは直接同等のものを公開しません。したがって、インターフェイスとクラスを使用して関数ポインターと同等の機能を実装することになり、これらのクラスとインターフェイス自体が関数ポインターの観点から実装されます。これは、不要な複雑さとパフォーマンスの低下の両方につながります。

于 2008-11-19T23:56:03.823 に答える
1

フラグブール変数を使用して、構造化プログラミングでgotoをシミュレートするのはどうですか?ただし、構造化プログラミングは一般的に受け入れられるようになりました。これは、抽象化の逆転が必ずしも悪いことではないことを示しているのではないでしょうか。

于 2011-02-13T08:14:27.253 に答える
1

SQL 結果セットを処理するためのクライアント側手続き型コレクション ライブラリの使用。

于 2010-03-29T14:14:35.257 に答える
1

これがあなたの質問に答えているかどうかはわかりませんが、Lisp のような素敵な高級言語が Fortran やアセンブリ言語であるかのように使用されているのを見たことがあります (そして、私は罪を犯しました)。それがプログラマーのレベルです。

私見ですが、言語がどんなに高レベルであっても、それが普遍的であれば、最下位レベルで使用できるというのは、計算の皮肉の 1 つです。洗練は洗練を保証するものではありません。

于 2008-11-19T20:49:17.520 に答える
0

今日のプログラミングで見られる抽象化の逆転の最悪の例は何ですか?

これが重要かどうかはわかりませんが、クラスが目的ではなく実装にちなんで名付けられているのを見ると、通常はイライラします。それは実際には一種のハンガリー語の表記法です。

  • 顧客工場
  • 意思決定ツリーの訪問者
  • AbstractWindowDecorator
  • JsonDataAdapter
  • TabbedDocumentImpl
  • ConcreteListHandler

「Factory」、「Visitor」、「Decorator」、「Adapter」、「Impl」、「Concrete」 - どのように実装され、何のために使用されるか誰が気にしますか?

于 2010-03-29T14:53:01.667 に答える
0

よろしければ、別の回答または質問を。「抽象化」という言葉には実際に定義がありますか? 抽象化は実際に良いのか、悪いのか、中立なのか? つまり、数字の 2 が抽象的であることは理解しています。これは、2 つの靴、2 つの目、2 つのサイクルなどについて一般的なことを表しているからです。インターフェース IStack は、スタックのように機能するものに適用されるため、抽象的である可能性があります。しかし、サブルーチン A がサブルーチン B を呼び出す場合、それはより抽象的であることを意味しますか? なぜ私たちはこの言葉に夢中になっているのでしょうか。

EDT: 私が尋ねているのは、木よりも森の方が重要だと考えて、人々が「具体的な」問題に鼻を向けるのを見たからです.

于 2008-11-22T15:15:10.440 に答える
0

これが本当に資格があるかどうかはわかりませんが、関連しているようです。SQL Server 2005 に CLR 機能が追加されたとき、多くの開発者が「ストアド プロシージャから直接 Web サービス呼び出しを開始できるようになった!」などと言っているのを耳にしました。これを行うためのチュートリアルもいくつか見ました。これらは、相反する抽象化レベルです。

于 2008-11-22T15:33:03.417 に答える