Худшая Инверсия Абстракции - PullRequest
10 голосов
/ 19 ноября 2008

Какой худший (из-за распространенности или серьезности) пример инверсии абстракции, который вы видите сегодня в программировании?

Для тех из вас, кто не знаком с этой концепцией, инверсия абстракции реализует низкоуровневые конструкции поверх высокоуровневых конструкций. Точнее, предположим, что у вас есть конструкции A и B. B реализован поверх A, но A нигде не отображается. Поэтому, если вам действительно нужна конструкция A более низкого уровня, вы в конечном итоге реализуете A поверх B, когда B в первую очередь реализуется в терминах A. Смотри http://en.wikipedia.org/wiki/Abstraction_inversion.

Ответы [ 8 ]

11 голосов
/ 29 марта 2010

Вероятно, худшим примером злоупотребления абстракцией, который я когда-либо видел, был этот свободный C # , который обернул основные элементы управления потоком (если, whiles, упорядоченные выражения) в свободный интерфейс.

Итак, ваш совершенно идиоматичный, чистый код:

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());

Потому что с лямбдами все лучше!

2 голосов
/ 20 ноября 2008

Это похоже на довольно мертвую тему. Я отвечу на свой вопрос, чтобы начать обсуждение. Я бы сказал, что худшая инверсия абстракций, которую я видел, - это использование абстрактных классов / интерфейсов в стиле ООП для репликации указателей функций. Например:

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.
}

Предполагается, что класс является мощной абстракцией для случаев, когда вам нужно инкапсулировать как состояние, так и поведение. Указатель на функцию - это нечто относительно простое, которое используется только для определения поведения. Виртуальные функции реализованы с использованием массивов указателей на функции, но многие ОО-языки не предоставляют указатели на функции или что-либо прямо эквивалентное. Поэтому вы в конечном итоге используете интерфейсы и классы для реализации функциональности, эквивалентной указателям на функции, а сами эти классы и интерфейсы реализуются в терминах указателей на функции. Это приводит как к ненужной сложности, так и к снижению производительности.

1 голос
/ 13 февраля 2011

Как насчет симуляции goto в структурном программировании с использованием флаговых булевых переменных? Тем не менее, структурное программирование стало общепринятым. Разве это не признак того, что инверсия абстракции не всегда плохая вещь?

1 голос
/ 29 марта 2010

Использование клиентских библиотек процедурных коллекций для обработки наборов результатов SQL.

1 голос
/ 19 ноября 2008

Я не уверен, что это ответ на ваш вопрос, но я видел это (и я был виновен в этом), где хороший язык высокого уровня, такой как Лисп, используется, как если бы это был Fortran или даже Assembly язык, потому что это уровень, на котором был программист.

ИМХО, это одна из ироний вычислений: независимо от того, насколько высок уровень языка, если он универсален, его можно использовать на самом низком уровне. Изысканность не является гарантией изощренности.

0 голосов
/ 29 марта 2010

Что является худшим (из-за распространенность или серьезность) пример инверсия абстракции, которую вы видите в программирование сегодня?

Я не знаю, считается ли это, но обычно меня раздражают, когда я вижу классы, названные в честь их реализации вместо , для чего они предназначены . Это действительно своего рода венгерская запись, обратите внимание:

  • CustomerFactory
  • DecisionTreeVisitor
  • AbstractWindowDecorator
  • JsonDataAdapter
  • TabbedDocumentImpl
  • ConcreteListHandler

«Фабрика», «Посетитель», «Декоратор», «Адаптер», «Импл», «Бетон» - кого волнует, как это реализовано, для чего оно используется?

0 голосов
/ 22 ноября 2008

Я не уверен, действительно ли это соответствует действительности, но, похоже, это связано. Когда в SQL Server 2005 появились возможности CLR, я слышал, как разработчики говорили что-то вроде: «Ну, теперь мы можем запускать вызовы веб-служб прямо из наших хранимых процедур!» Я также видел несколько уроков по этому вопросу. Это несколько противоречивых уровней абстракции.

0 голосов
/ 22 ноября 2008

Еще один ответ или вопрос, если не возражаете. Есть ли у слова «абстракция» определение? Абстракции на самом деле хорошие, или плохие, или нейтральные? Я имею в виду, я понимаю, что число 2 является абстрактным, потому что оно обозначает то, что является общим для 2 башмаков, 2 глаз, 2 циклов и т. Д. Интерфейс IStack может быть абстрактным, поскольку он применяется к вещам, которые действуют как стеки. Но если подпрограмма A вызывает подпрограмму B, значит ли это, что она более абстрактна? Почему мы так очарованы этим словом?

EDT: я спрашиваю только потому, что видел, как люди поднимают нос по "конкретным" вопросам, думая, что лес важнее деревьев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...