Что такое абстракция? [закрыто]


38

Существует ли общепринятое определение того, что такое абстракция программирования , используемая программистами? [Примечание: программирование абстракции не следует путать со словарными определениями для слова «абстракция».] Существует ли однозначное или даже математическое определение? Каковы некоторые четкие примеры абстракций?


... и то, что я вынужден доказать, что я не робот, публикует это, наводит на мысль, что я действительно прошу слишком многого :)
mlvljr

8
Что вы подразумеваете под "математически"? Я бы не думал об абстракции как о математической концепции.
Fishtoaster

2
@mlvljr: извините, я все еще не уверен, что следую. Абстракция - это просто практика предоставления более простого способа решения чего-либо. Я не вижу, как формальные инструменты / методы имеют какое-либо отношение к этому.
Fishtoaster

1
@mlvljr, вы хотите математический пример или математика, чтобы покрыть все программные извлечения. Я не думаю, что последний существует.
К. Росс

8
Perhpas cstheory.stackexchange.com - правильное место для этого вопроса
Конрад Фрикс

Ответы:


46

Ответ на вопрос «Можете ли вы определить, какая программная абстракция более или менее математически?» нет." Абстракция не является математическим понятием. Это все равно, что попросить кого-нибудь математически объяснить цвет лимона.

Если вам нужно хорошее определение: абстракция - это процесс перехода от конкретной идеи к более общей. Например, взгляните на свою мышь. Это беспроводной? Какой у него датчик? Сколько кнопок? Это эргономично? Насколько оно большое? Ответы на все эти вопросы могут точно описать вашу мышь, но независимо от того, каковы ответы, это все же мышь, потому что это указательное устройство с кнопками. Это все, что нужно, чтобы стать мышью. «Silver Logitech MX518» - это конкретный конкретный предмет, а «мышь» - это абстракция. Важно помнить, что нет такого конкретного объекта, как «мышь», это просто идея. Мышь на вашем столе всегда что-то более конкретное - это

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

Объектно-ориентированное программирование построено на концепции абстракций и семейств или групп из них. Хороший ООП означает выбор хороших абстракций на соответствующем уровне детализации, которые имеют смысл в области вашей программы и не «просачиваются». Первое означает, что классификация мыши как объекта, который не катится по наклонной плоскости, не имеет смысла для приложения, которое инвентаризирует компьютерное оборудование, но может иметь смысл для симулятора физики. Последнее означает, что вам следует избегать «привязывать себя» к иерархии, которая не имеет смысла для каких-либо объектов. Например, в моей иерархии выше, мы уверены, что всекомпьютерная периферия питается от электричества? Как насчет стилуса? Если мы хотим сгруппировать стилус в категорию «периферийные устройства», у нас возникнет проблема, поскольку он не использует электричество, и мы определили компьютерную периферию как объекты, которые используют электричество. Проблема круга-эллипса является наиболее известным примером этой головоломки.


2
Я думаю, что я вижу; Вы конкретно говорите о том, что обращаетесь к методу или функции абстрактным образом, то есть по контракту, а не по его реализации. Ваши утверждения верны, и это совершенно правильное использование термина; вызов метода - это абстракция какого-то конкретного поведения.
Nlawalker

4
@nlawalker: вы смешиваете абстракцию с обобщением. Они не одно и то же. То, что вы описываете, является последним («переход от конкретной идеи к более общей »). Абстракция движется от конкретных вещей к абстрактным вещам, например, имея 7 синих и 7 красных шариков и говоря: «У меня есть два комплекта с одинаковым количеством шариков одного цвета»: здесь я перехожу от конкретных вещей (мраморов) к абстрактным вещам (классы и эквивалентные множества). Кстати, натуральное число n - это класс всех эквивалентных наборов мощности n, некруговой, определяемый взаимно-однозначным отображением между этими наборами.
pillmuncher

33
Цвет лимона, математически, светлый с длиной волны приблизительно 570 нм.
Эрик

1
@ Эрик Я так и собирался это написать. Ба!
Гари Роу

1
@Erik Это физика, а не математика :) Математика ничего не знает о таких понятиях, как «свет». Свет эмпирический; Математика нет.
Андрес Ф.

25

Я категорически не согласен с большинством ответов.

Это мой ответ:

Учитывая два набора G и H, связь Галуа (альфа, бета) может быть определена между ними, и можно сказать, что один является конкретизацией другого; переверните соединение, и одно является абстракцией другого. Эти функции являются функцией конкретизации и функцией абстракции.

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


8
ОК, вы получаете золотую звезду за профессорство :)
Майк Данлавей

@Mike: Yay? :-)
Пол Натан

Ах, и может ли быть пример?
mlvljr

2
@mlvljr: di.ens.fr/~cousot/AI astree.ens.fr предоставляет эскиз данных.
Пол Натан

1
Амир: это техническое определение абстракции от мира статического анализа.
Пол Натан

13

Абстракция больше сосредоточена Whatи меньше наHow . Или вы можете сказать, знать только то, что вам нужно, и просто доверять поставщику для всех других услуг. Иногда это даже скрывает личность поставщика услуг.

Например, этот сайт предоставляет систему для того, чтобы задавать вопросы и отвечать на них. Почти все здесь знают, каковы процедуры запроса, ответа, голосования и прочего на этом сайте. Но очень немногие знают, каковы основные технологии. Например, был ли сайт разработан на ASP.net mvc или Python, работает ли он на сервере Windows или Linux и т. Д. Потому что это не наше дело. Таким образом, этот сайт поддерживает уровень абстракции над своим основным механизмом для нас, предоставляющих услугу.

Некоторые другие примеры:

  • Автомобиль скрывает все свои механизмы, но предоставляет возможность управлять, заправляться и обслуживать его своему владельцу.

  • Любой API скрывает все детали своей реализации, предоставляя сервис другим программистам.

  • Класс в ООП скрывает своих частных членов и реализацию открытых членов, предоставляя услугу для вызова открытых членов.

  • При использовании объекта типа Interfaceили abstract classв Java или C ++ реальная реализация скрыта. И не просто скрытые, реализации методов, объявленных в Interface, также, вероятно, будут отличаться в различных реализованных / унаследованных классах. Но так как вы получаете ту же услугу, просто не беспокойтесь, Howона реализована и именно Who/ Whatпредоставляет услугу.

  • Скрытие личности : для предложения «Я знаю, что Сэм может писать компьютерные программы». абстракция может быть: «Сэм - программист. Программисты умеют писать компьютерные программы». Во втором утверждении человек не важен. Но его способность заниматься программированием важна.


Так почему бы просто не назвать это "точной спецификацией чего?"
mlvljr

+1 для бита сатори, также
mlvljr

@mlvljr Немного Howвсегда полезно понять Whatс. Таким образом, это может быть смешано с абстракцией.
Гульшан

7

Программная абстракция - это упрощенная модель проблемы.

Например, соединение TCP / IP - это абстракция над отправкой данных. Вы просто включаете IP-адрес и номер порта и отправляете его в API. Вас не волнуют все детали проводов, сигналов, форматов сообщений и сбоев.


Ага! Что такое упрощенная модель здесь? Помните дырявую головоломку, кстати? :)
mlvljr

7

Абстракция - это просто программная версия теоремы.

У вас есть формальная система, вы предлагаете мысль об этой системе. Вы делаете доказательство этого, и если это сработает, то у вас есть теорема. Зная, что ваша теорема справедлива, вы можете использовать ее в дальнейших доказательствах системы. Примитивы, предоставляемые системой (например, операторы if и типы значений int), обычно рассматриваются как аксиомы, хотя это не совсем верно, поскольку все, что не является инструкциями ЦП, написанными в машинном коде, является своего рода абстракцией.

В функциональном программировании идея программы как математического утверждения очень сильна, и часто система типов (в сильном, статически типизированном языке, таком как Haskell, F # или OCAML) может использоваться для проверки теоремы с помощью доказательств.

Например: допустим, у нас есть проверка на добавление и равенство в качестве примитивных операций, а целые и логические значения в качестве примитивных типов данных. Это наши аксиомы. Таким образом, мы можем сказать, что 1 + 3 == 2 + 2это теорема, а затем использовать правила сложения, целых чисел и равенства, чтобы проверить, верно ли это утверждение.

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

ref x (*) y := loop y times {x +}) 0

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

Я также могу проверить свою систему типов. (*) имеет тип int -> int -> int. Требуется 2 дюйма и выводит int. Добавление имеет тип int -> int -> int, поэтому 0 + (rest) сохраняется до тех пор, пока (rest) приводит к int. Мой цикл может делать разные вещи, но я говорю, что он выводит цепочку каррированных функций, так что (x + (x + (x ... + 0))) - результат. Форма этой цепочки сложения просто (int -> (int -> (int ... -> int))), поэтому я знаю, что мой конечный результат будет int. Так что моя система типов подтвердила результаты моего другого доказательства!

Создайте такую ​​идею на протяжении многих лет, многих программистов и множества строк кода, и у вас есть современные языки программирования: богатый набор примитивов и огромные библиотеки «проверенных» абстракций кода.


4

Будет ли ответ Википедии достаточно хорошим? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

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


И что тогда будет примером абстрактной вещи?
mlvljr

3
@mlvljr: Если вы прочитаете статью в Википедии, вы увидите несколько.
Джон Фишер

К сожалению, я почти уверен, что они будут слишком абстрактными ..
mlvljr

4

Ну, математически, "целое число" - это абстракция. И когда вы делаете формальные доказательства, подобные этому x + y = y + x для всех целых чисел, вы работаете с абстракцией "целое число", а не с конкретными числами, такими как 3 или 4. То же самое происходит в разработке программного обеспечения, когда вы взаимодействуете с машина на уровне выше регистров и мест памяти. Вы можете думать более сильные мысли на более абстрактном уровне, в большинстве случаев.


Не будете ли использовать и IInt add(IInt a, IInt b);подпрограмму в программе, в которой вы заранее об этом знаете , aи bбудете, скажем, Int128: IIntболее или менее хорошим примером? - у вас есть фрагмент кода, который делает то, что должен делать, зная (будучи в состоянии доказать), что он сделает то, что вам нужно, и в то же время (и с другой стороны) вы заставите его делать именно то, что вы нужно ли, чтобы он когда-либо не знал об этом (имея возможность использовать эту вещь и в других контекстах)?
mlvljr

1
Извините, но я не могу понять ваш вопрос.
Кейт Грегори

Ну, предположим, вы пишете программу, которая должна добавить 2 к 3. Вы делаете это, вызывая add(int, int)подпрограмму / функцию. Этого будет достаточно, только return 2 + 3;в этом случае. И почему вы должны использовать более «универсальную» подпрограмму ( return a + b;т.е. работать с любыми фактическими данными a и bпредоставленными параметрами и, таким образом, действительно абстрагироваться от их значений) - это был мой (риторический) вопрос выше. Надеюсь, теперь стало немного яснее.
mlvljr

Мой первый комментарий довольно "запутан", я согласен :)
mlvljr

4

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

Позволь мне мозоль ...

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


Представление об абстракции как о чем-то «слишком прекрасном, чтобы быть ясно воспринятым (или, более того, описанным в сухих (математических) терминах»), не помогает (во-первых и, по крайней мере) понять, что это такое, и (во-вторых) разработать методы его применение и (ужас!) оценка [как и каким образом данный код является абстрактным].
mlvljr

3
Если изменение в одном месте заставляет вас делать несколько изменений в другом месте, то ваши абстракции плохие. В сущности, я не скажу, что я или кто-либо еще никогда не ошибался в стороне от слишком большого количества абстракций, но есть способ для этого безумия. Хорошие абстракции являются краеугольным камнем слабосвязанного кода. При правильной абстракции изменения становятся смехотворно простыми. Так что да, я ставлю абстракции на пьедестал и трачу слишком много времени на поиск нужных.
Джейсон Бейкер

@Jason Baker Пусть наши методы абстракции будут достаточно конкретными, чтобы эффективно их использовать ...
mlvljr

1
@Jason: «Если изменение в одном месте заставляет вас делать несколько изменений в другом месте, то ваши абстракции плохие». Я с тобой там. Кажется, меня окружают плохие.
Майк Данлавей

1
Похоже, вы работали в месте, где у разработчиков были великие видения, и не было сильного босса, который удерживал команду в фокусе. Когда я оказываюсь в такой среде, я начинаю искать другую работу (бюджеты проектов всегда превышаются, или достаточно маленькая компания => банкрот). Недавно я видел твит: «код спагетти» против «кода лазаньи», последний - когда слишком много слоев.
yzorg

4

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

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

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

Абстракция связана с инкапсуляцией и модульностью, и эти понятия часто неправильно понимают.

В этом Listпримере инкапсуляция может использоваться, чтобы скрыть детали реализации связанного списка; в объектно-ориентированном языке, например, вы можете сделать nextи previousуказатели частным, где только реализация списка разрешен доступ к этим полям.

Инкапсуляции недостаточно для абстракции, потому что это не обязательно означает, что у вас есть новая или другая концепция конструкций. Если бы весь Listкласс давал вам методы доступа в стиле ' getNext' / ' setNext', он инкапсулировал бы вас в подробности реализации (например, называли ли вы поле ' prev' или ' previous'? Каков его статический тип?), Но это будет иметь очень низкую степень абстракции.

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

Сокрытию информации способствует инкапсуляция (чтобы ваш код не зависел от нестабильных деталей реализации), но инкапсуляция не требуется для модульности. Например, вы можете реализовать Listструктуру в C, выставляя « next» и « prev» указатели на мир, но и обеспечивают интерфейс, содержащий initList(),addToList() иremoveFromList()функции. При условии соблюдения правил интерфейса вы можете гарантировать, что определенные свойства будут всегда сохраняться, например, гарантировать, что структура данных всегда находится в допустимом состоянии. [Классическая статья Парнаса о модульности, например, была написана с примером в сборке. Интерфейс является контрактом и формой сообщения о дизайне, он не обязательно должен быть механически проверен, хотя мы сегодня на это полагаемся.]

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

  • Если алгоритм n ^ 3 «красиво инкапсулирован», он все равно будет работать хуже, чем улучшенный алгоритм n log n.

  • Если интерфейс поддерживает определенную операционную систему, ни одно из преимуществ модульного дизайна не будет реализовано, когда, скажем, видеоигру нужно перенести с Windows на iPad.

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


Что ж, похоже, это то, что я на самом деле хотел (некоторые "ранты", защищенные от здравого смысла / примера) в "модульном == абстрактном == хорошем == взгляде" ты не можешь оценить никогда ") , спасибо (все еще читаю)
mlvljr

И вот провокационный девиз из моего предстоящего ответа (на мой собственный вопрос): «Абстракции протекают, когда умы становятся слабыми»;)
mlvljr

2

Хорошо, я понял, что вы спрашиваете: «Что такое математически строгое определение« абстракции »?»

Если это так, я думаю, что вам не повезло - «абстракция» - это термин «архитектура / дизайн программного обеспечения», и, насколько я знаю, не имеет математической поддержки (возможно, кто-то лучше разбирающийся в теоретической CS поправит меня здесь), кроме как «связывание» или «сокрытие информации» имеют математические определения.


2

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

Абстракция включает в себя инкапсуляцию, сокрытие информации и обобщение. Он не охватывает аналогий, метафор или эвристики.

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

Абстракция - это не то, что вы объявляете, это то, что вы делаете .


+1 "Я занимаюсь абстракцией!" будет хорошо для футболки;) Спасибо за ссылку на морфизм (ы) (хотя в нем прямо не упоминается поли - один из десятка других упомянутых;)).
mlvljr

2

Как способ объяснить это другому человеку, я бы пошел другим путем, от результатов назад:

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

Если вы хотите расширить это, вы можете добавить:

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

Кроме того, я думаю, что вы должны начать с примеров ...


1

Вы можете проверить некоторые показатели Боба Мартина

http://en.wikipedia.org/wiki/Software_package_metrics

Тем не менее, я не думаю, что его "абстрактность" такая же, как ваша. Это скорее мера «отсутствия реализации в классе», означающая использование интерфейсов / абстрактных классов. Нестабильность и расстояние от главной последовательности, вероятно, играют больше в том, что вы ищете.


Да, помни ту газету. Дядя Боб великолепно заряжает толпу и заставляет людей интересоваться механикой ОО.
mlvljr

Странно, я забыл объявить (сразу) :)
mlvljr

1

Merriam-Webster определяет абстрактное как прилагательное, оторванное от любого конкретного случая.

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

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

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

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

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


Возможно, мне следовало бы подчеркнуть это лучше, но меня интересуют не те абстракции, в которых отсутствуют ненужные детали их реальных прототипов, а, таким образом, даются некоторые полезные советы по проектированию систем, которые должны работать с вышеупомянутыми объектами реального мира. (Примером является создание класса Employee с некоторыми реальными свойствами Employee, которые могут быть полезны в бизнес-приложении). Меня интересует своего рода абстракция, которая «ограждает» программную сущность от других таких сущностей, которые имеют с ней дело (например, будут Employerпредположения Employee).
mlvljr

1
Ты не имеешь никакого смысла. Предоставление советов по проектированию реальной системы не является целью абстракции. Если вы ничего не знаете о том, что моделируется, это не проблема для решения абстракции.
whatsisname

Я говорил об абстрагировании деталей от объектов реального мира, с которыми будет иметь дело программное обеспечение - в процессе создания этого программного обеспечения. Использование (программной) абстракции сущности реального мира для (ре) проектирования этой реальной вещи не предназначалось (это «программные системы» как «системы» в «, но, таким образом, предоставляет некоторые полезные советы по проектированию систем» в мой комментарий выше).
mlvljr

1

Абстракция представляет что-то (например, концепцию, структуру данных, функцию) в терминах чего-то еще. Например, мы используем слова для общения. Слово - это абстрактная сущность, которая может быть представлена ​​в терминах звуков (речи) или в виде графических символов (письма). Основная идея абстракции состоит в том, что рассматриваемая сущность отличается от основного представления, так же как слово - это не звуки, которые используются для его произнесения, или буквы, которые используются для его написания.

Таким образом, по крайней мере в теории, базовое представление абстракции может быть заменено другим представлением. На практике, однако, абстракция редко полностью отличается от базового представления, и иногда представление « протекает» » через. Например, речь несет в себе эмоциональные оттенки, которые очень трудно передать в письменной форме. Из-за этого аудиозапись и транскрипт одних и тех же слов могут оказывать разное влияние на аудиторию. Другими словами, абстракция слов часто протекает.

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

В информатике биты обычно являются самым низким уровнем представления. Байты, ячейки памяти, инструкции по сборке и регистры ЦП являются следующим уровнем абстракции. Затем у нас есть примитивные типы данных и инструкции языка более высокого уровня, которые реализуются в виде байтов, областей памяти и инструкций по сборке. Затем функции и классы (при условии языка ОО), которые реализованы в терминах примитивных типов данных и встроены в языковые инструкции. Тогда более сложные функции и классы реализуются в терминах более простых. Некоторые из этих функций и классов реализуют структуры данных, такие как списки, стеки, очереди и т. Д. Те, в свою очередь, используются для представления более конкретных объектов, таких как очередь процессов, или список сотрудников, или хэш-таблица названий книг. ,


1
Если это протекает, то это явно не абстракция ... достаточно, давайте будем честными.
mlvljr

2
@mlvljr К сожалению, компьютеры - это не математические проблемы, поэтому вам нужно учесть некоторый уровень утечки. Если ничего другого, то тот факт, что вычисления выполняются на физическом устройстве, подразумевает определенные ограничения в отношении объема проблем, которые могут быть смоделированы. Технически, теоремы неполноты подразумевают, что некоторые вещи не могут быть доказаны о математических системах внутренне, поэтому даже математика имеет «дырявые абстракции».
CodexArcanum

2
Вы всегда можете найти ситуацию, когда абстракция будет протекать. Идеальной абстракции не бывает. Это просто вопрос того, сколько он протекает и можете ли вы жить с ним.
Дима

@CodexArcanum 1. Процедура, принимающая intменьше чем (MAX_INT_SIZE / 2-1) и возвращающая другую, которая в два раза больше: int f(int a) { return a*2; }2. «обработчик» с прототипом, который void (*) (void)должен быть вызван, когда ... хм, его следует вызывать согласно контракт вызывающего абонента - оба представляют абстракции (1 - по деталям его реализации (которые мы предоставили, но которые не будут доступны для тех, у кого нет доступа к исходному коду), 2 - по какому именно обработчику делает (обратите внимание, однако, что это известно человеку, который назначил обработчик)) и не просочиться
mlvljr

Ограничение MAX_INT_SIZE нигде не указано в сигнатуре вашего метода. Если вы не используете язык, который допускает программирование на основе контракта (например, Eiffel), это утечка. Упоминание ограничений в документации не считается, поскольку документация находится за пределами системы. А что, если во время операции отключается питание? Что делать, если вам нужно передавать данные по сети, и есть задержка? Никакая парадигма программирования не может абстрагироваться от физического состояния оборудования системы.
CodexArcanum

1

Один способ, которым я пытаюсь описать это людям, не может быть лучшим способом

Рассмотрим программу, которая добавляет 2 + 2 и выводит 4

Рассмотрим программу, которая добавляет два числа, введенных пользователем, x + y = z

Что является более полезным и общим?


Это почти то, о чем был мой комментарий к ответу Кейт Грегори. ;) Интересно то, что, хотя менее общая программа может использовать более общую, обеспечение пользователя, который запросил первый со вторым, вероятно, было бы бесполезно ...
mlvljr

1

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

Абстракции также могут быть объединены в большие абстракции. Например, функции могут быть объединены в класс, классы могут быть объединены в программу, программы могут быть объединены в распределенную систему и т. Д.


Вызов кода save_to_databaseне должен беспокоиться о том, как именно сохраняются данные, если / потому что вы выбрали нужную реализацию ! Т.е. в любом случае найдется место для предоставления (абстрактного «относительного» к некоторым частям кода) детали, это просто вопрос разумного выбора - облегчения «изменения мнения» и т. Д.
mlvljr

1

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

В программировании этот упрощенный интерфейс может быть любым - от переменной (абстрагируемой от группы битов и обеспечивающей более простой математический интерфейс) до функции (абстрагирующей любое количество обработки в однострочный вызов) до класса и далее.

В конце концов, основная задача программистов - абстрагировать все вычислительные детали и предоставить простой интерфейс, такой как GUI, который может использовать тот, кто не знает ничего о том, как работают компьютеры.

Некоторые из преимуществ абстракции:

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

  • Позволяет нескольким людям хорошо работать вместе над проектом. Я не хочу знать все тонкости кода моего коллеги. Я просто хочу знать, как его использовать, что он делает и как совместить его с моей работой (интерфейсом).

  • Позволяет людям, у которых нет необходимых знаний, выполнять сложную задачу. Моя мама может обновить ее Facebook, и люди, которых она знает по всей стране, могут видеть это. Без абстракции безумно сложной системы до простого веб-интерфейса она ни за что не сможет начать делать что-то подобное (как и я в этом отношении).

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


1

Дополнительный уровень косвенности.

Вы не хотите заботиться о том, является ли объект, который вы используете, a Catили a Dog, поэтому вы просматриваете таблицу виртуальных функций, чтобы найти правильную makeNoise()функцию.

Я уверен, что это может быть применено и к «более низким» и «более высоким» уровням - подумайте о компиляторе, ищущем правильную инструкцию для использования для данного процессора, или о том, что Haskell Monadабстрагируется от вычислительных эффектов, вызывая все returnи >>=.


1

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

Абстракция в программировании - это понимание сути объекта в данном контексте.

[...]

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

Надеюсь, это поможет.


+1, да, эта тема, похоже, действительно надоедает многим из нас;) Я надеюсь (наконец) дополнить ваш ответ некоторыми своими соображениями, чтобы вызвать некоторый интерес к дискуссии.
mlvljr

0

Здесь нематематический ответ:

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


1
+1, но не всегда думаю (подумайте о действительно ненужных деталях :)). Первоначальный вопрос: «О том, чтобы навсегда удалить детали, временно забыть их или даже использовать их каким-то образом, не зная об этом?»
mlvljr

1
Мне все равно, сколько фотонов попало в мои клиенты сегодня.
Flamingpenguin

0

Для меня абстракция - это то, что не существует «буквально», это что-то вроде идеи. Если вы выражаете это математически, это больше не является абстрактным, потому что математика - это язык для выражения того, что происходит в вашем мозгу, так что это может быть понято чьим-то мозгом, поэтому вы не можете структурировать свои идеи, потому что если вы это делаете, это не идея больше: вам нужно понять, как работает мозг, чтобы выразить модель идеи.

Абстракция - это то, что позволяет вам интерпретировать реальность в нечто, что может быть независимым от нее. Вы можете абстрагировать пляж и мечту, но пляж существует, а мечта - нет. Но вы могли бы сказать, что оба существуют, но это не так.

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

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

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

Один объект, которым управляет понятие, вообще не может «понять» себя. Вот почему мы пытаемся верить в Бога и поэтому нам трудно понять свой мозг.

Могу ли я получить свою медаль сейчас?


0

Интересный вопрос. Я не знаю ни одного определения абстракции, которое считается авторитетным в программировании. Хотя другие люди предоставили ссылки на некоторые определения из различных ветвей теории или математики CS; Мне нравится думать об этом аналогично «супервентности» см. Http://en.wikipedia.org/wiki/Supervenience.

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

Теперь, что делает одно описание «более высокого уровня», чем другое. Ключ «множественная реализуемость» - ваша абстракция программы может быть реализована многими способами на многих языках. Теперь вы можете сказать, что можно создать несколько проектов и для одной программы - два человека могут создать два различных проекта высокого уровня, которые точно описывают программу. Эквивалентность реализаций имеет значение.

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

Так что же делает один уровень описания выше другого? Допустим, у нас есть один уровень описания A (например, проектная документация) и другой уровень описания B (например, исходный код). A является более высоким уровнем, чем B, потому что если A1 и A2 являются двумя неэквивалентными описаниями на уровне A, то реализации этих описаний, B1 и B2, должны также быть неэквивалентными на уровне B. Однако обратное не всегда верно ,

Поэтому, если я не могу создать одну двоичную программу, которая удовлетворяет двум разным документам проекта (т.е. ограничения этих проектов будут противоречить друг другу), то исходный код, который реализует эти проекты, должен быть другим. Но с другой стороны, если я возьму два набора исходного кода, которые не могут быть скомпилированы в одну и ту же двоичную программу, все равно может случиться так, что двоичные файлы, полученные в результате компиляции этих двух наборов исходного кода, будут соответствовать одному и тому же проекту. документ. Таким образом, проектный документ является «абстракцией» исходного кода.


0

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

Объектно-ориентированные шаблоны проектирования являются хорошим примером абстракции, и я имею в виду не реальную реализацию, а то, как мы должны подходить к решению.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.