Подтвердить что ты не робот

Значение лихорадочной абстракции?

Что означает термин "личная абстракция"? (Пожалуйста, объясните с примерами. Мне часто сложно разбираться в простой теории.)

4b9b3361

Ответ 1

Вот пример пространства:

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

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

На самом деле это замечательно... 16-летний или 80-летний человек может управлять этой сложной машиной без особого понимания того, как она работает внутри!

Но есть утечки. Передача - небольшая утечка. В автоматической коробке передач вы можете почувствовать, что автомобиль теряет мощность на мгновение, когда он переключает передачи, тогда как в CVT вы чувствуете плавный крутящий момент полностью.

Есть и большие утечки. Если вы слишком быстро вращаете двигатель, вы можете повредить его. Если блок двигателя слишком холодный, автомобиль может не запускаться, или он может иметь низкую производительность. И если вы одновременно включите радиоприемник, фары и AC, вы увидите, что расход газа снизился.

Ответ 2

Это просто означает, что ваша абстракция предоставляет некоторые детали реализации, или что вам нужно знать подробности реализации при использовании абстракции. Этот термин приписывается Joel Spolsky, около 2002 года. См. Wikipedia статью для получения дополнительной информации.

Классическим примером являются сетевые библиотеки, которые позволяют обрабатывать удаленные файлы как локальные. Разработчик, использующий эту абстракцию, должен знать, что сетевые проблемы могут привести к сбою в том, что локальные файлы этого не делают. Затем вам необходимо разработать код для обработки специфических ошибок за пределами абстракции, которые предоставляет сетевая библиотека.

Ответ 3

Википедия имеет довольно хорошее определение для этого

Протекающая абстракция относится к любой реализованной абстракции, предназначенной для уменьшения (или скрытия) сложности, когда базовые детали не полностью скрыты

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

Быстрый пример - это блокировки С#/VB.Net и их невозможность захвата параметров ref/out. Причина, по которой они не могут быть захвачены, связана с детализацией реализации процесса подъема. Это не означает, что есть лучший способ сделать это.

Ответ 4

Вот пример, знакомый разработчикам .NET: класс ASP.NET Page пытается скрыть детали HTTP-операций, в частности управление данными формы, чтобы разработчикам не приходилось иметь дело с опубликованными значениями (потому что это автоматически сопоставляет значения форм с элементами управления сервером).

Но если вы блуждаете по самым основным сценариям использования, абстракция Page начинает течь, и становится трудным работать со страницами, если вы не понимаете детали реализации этого класса.

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

Ответ 5

Ну, в некотором смысле это чисто теоретическая вещь, хотя и не несущественная.

Мы используем абстракции, чтобы облегчить понимание. Я могу использовать класс строк на каком-то языке, чтобы скрыть тот факт, что я имею дело с упорядоченным набором символов, которые являются отдельными элементами. Я имею дело с упорядоченным набором символов, чтобы скрыть тот факт, что я имею дело с числами. Я имею дело с числами, чтобы скрыть тот факт, что я имею дело с 1 и 0.

Нечеткая абстракция - это та, которая не скрывает детали, которые она должна скрывать. Если строка вызова. Длина строки в 5-символьной строке в Java или .NET, я могу получить любой ответ от 5 до 10, из-за деталей реализации, где эти символы называет символы, являются точками данных UTF-16, которые могут представлять собой 1 или .5 персонажа. Произошла абстракция. Не утечка, хотя означает, что поиск длины потребует большего пространства для хранения (для хранения реальной длины) или изменения от O (1) до O (n) (чтобы определить, что такое реальная длина). Если меня волнует реальный ответ (часто вы этого не делаете), вам нужно работать над тем, что действительно происходит.

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

Ответ 6

Я продолжу приводить примеры с помощью RPC.

В идеальном мире RPC удаленный вызов процедуры должен выглядеть как локальный вызов процедуры (или так происходит история). Он должен быть полностью прозрачным для программиста таким образом, чтобы при вызове SomeObject.someFunction() они понятия не имели, если SomeObject (или просто someFunction, если на то пошло) локально хранится и выполняется или удаленно хранится и выполняется. Теория гласит, что это упрощает программирование.

Реальность другая, потому что существует ОГРОМНОЕ различие между вызовом локальной функции (даже если вы используете самый медленный интерпретируемый язык в мире) и:

  • вызов через прокси-объект
  • Сериализация ваших параметров
  • создание сетевого подключения (если оно еще не установлено)
  • передача данных удаленному прокси
  • с удаленным прокси-сервером восстановить данные и вызвать удаленную функцию от вашего имени
  • сериализация возвращаемых значений
  • передача возвращаемых значений в локальный прокси
  • повторная сборка сериализованных данных
  • возвращает ответ от удаленной функции

Только во времени это примерно три порядка (или больше!) разницы в величине. Эти три + порядка величины будут иметь огромное значение в производительности, что сделает вашу абстракцию техобслуживания процедуры скорее очевидной в первый раз, когда вы ошибочно относитесь к RPC как к реальному вызову функции. Кроме того, реальный вызов функции, запрещающий серьезные проблемы в вашем коде, будет иметь очень мало точек отказа за пределами ошибок реализации. В вызове RPC есть все следующие возможные проблемы, которые будут налагаться на случаи сбоя сверх того, что вы ожидаете от обычного локального вызова:

  • возможно, вы не сможете создать свой локальный прокси-сервер
  • возможно, вы не сможете создать экземпляр удаленного прокси-сервера
  • прокси могут не подключаться
  • параметры, которые вы отправляете, не могут быть повреждены или вообще не выполняются
  • возвращаемое значение, которое удаленные отправления могут не испортить или вообще

Итак, теперь ваш вызов RPC, который "как вызов локальной функции", имеет целую нагрузку дополнительных сбоев, с которыми вам не приходится сталкиваться при выполнении локальных вызовов функций. Абстракция снова просочилась, еще сложнее.

В конце концов, RPC - это плохая абстракция, потому что он протекает как сито на каждом уровне - когда он успешный и когда он не работает.

Ответ 7

Пример в примере django ORM many-to-many:

Обратите внимание на использование примера API, которое необходимо для использования .save() базового объекта статьи a1, прежде чем вы сможете добавлять объекты Publication к атрибуту many-to-many. И обратите внимание, что обновление атрибута "многие-ко-многим" немедленно сохраняется в базе данных, тогда как обновление сингулярного атрибута не отражается в db до тех пор, пока не будет вызван .save().

Абстракция заключается в том, что мы работаем с графом объектов, где атрибуты однозначности и многозначные атрибуты - это просто атрибуты. Но реализация в качестве реляционной базы данных поддерживает утечки данных... поскольку система целостности RDBS появляется через тонкий шпон объектного интерфейса.

Ответ 8

Предположим, что в библиотеке имеется следующий код:

Object[] fetchDeviceColorAndModel(String serialNumberOfDevice)
{
    //fetch Device Color and Device Model from DB.
    //create new Object[] and set 0th field with color and 1st field with model value. 
}

Когда потребитель вызывает API, он получает объект []. Потребитель должен понимать, что первое поле массива объектов имеет значение цвета, а второе поле - значение модели. Здесь абстракция просочилась из библиотеки в потребительский код.

Одним из решений является возврат объекта, который инкапсулирует модель и цвет устройства. Потребитель может вызвать этот объект, чтобы получить модель и значение цвета.

DeviceColorAndModel fetchDeviceColorAndModel(String serialNumberOfTheDevice)
{
    //fetch Device Color and Device Model from DB.
    return new DeviceColorAndModel(color, model);
}