Существует ли общепринятое определение того, что такое абстракция программирования , используемая программистами? [Примечание: программирование абстракции не следует путать со словарными определениями для слова «абстракция».] Существует ли однозначное или даже математическое определение? Каковы некоторые четкие примеры абстракций?
terminology
abstraction
mlvljr
источник
источник
Ответы:
Ответ на вопрос «Можете ли вы определить, какая программная абстракция более или менее математически?» нет." Абстракция не является математическим понятием. Это все равно, что попросить кого-нибудь математически объяснить цвет лимона.
Если вам нужно хорошее определение: абстракция - это процесс перехода от конкретной идеи к более общей. Например, взгляните на свою мышь. Это беспроводной? Какой у него датчик? Сколько кнопок? Это эргономично? Насколько оно большое? Ответы на все эти вопросы могут точно описать вашу мышь, но независимо от того, каковы ответы, это все же мышь, потому что это указательное устройство с кнопками. Это все, что нужно, чтобы стать мышью. «Silver Logitech MX518» - это конкретный конкретный предмет, а «мышь» - это абстракция. Важно помнить, что нет такого конкретного объекта, как «мышь», это просто идея. Мышь на вашем столе всегда что-то более конкретное - это
Абстракция может быть многослойной и настолько мелкой или крупнозернистой, насколько вам угодно (MX518 - это мышь, представляющая собой указывающий объект, являющаяся периферийным устройством компьютера, работающим от электричества), может заходить так далеко, как вы хотите и практически в любом направлении, которое вы хотите (у моей мыши есть провод, то есть я мог бы классифицировать его как объекты с проводом. Он также плоский в нижней части, поэтому я мог бы классифицировать его как вид объектов, которые не будут катиться, когда в вертикальном положении на наклонной плоскости).
Объектно-ориентированное программирование построено на концепции абстракций и семейств или групп из них. Хороший ООП означает выбор хороших абстракций на соответствующем уровне детализации, которые имеют смысл в области вашей программы и не «просачиваются». Первое означает, что классификация мыши как объекта, который не катится по наклонной плоскости, не имеет смысла для приложения, которое инвентаризирует компьютерное оборудование, но может иметь смысл для симулятора физики. Последнее означает, что вам следует избегать «привязывать себя» к иерархии, которая не имеет смысла для каких-либо объектов. Например, в моей иерархии выше, мы уверены, что всекомпьютерная периферия питается от электричества? Как насчет стилуса? Если мы хотим сгруппировать стилус в категорию «периферийные устройства», у нас возникнет проблема, поскольку он не использует электричество, и мы определили компьютерную периферию как объекты, которые используют электричество. Проблема круга-эллипса является наиболее известным примером этой головоломки.
источник
Я категорически не согласен с большинством ответов.
Это мой ответ:
Это из теории абстрактной интерпретации компьютерных программ, которая обычно является подходом статического анализа на сегодняшний день.
источник
Абстракция больше сосредоточена
What
и меньше наHow
. Или вы можете сказать, знать только то, что вам нужно, и просто доверять поставщику для всех других услуг. Иногда это даже скрывает личность поставщика услуг.Например, этот сайт предоставляет систему для того, чтобы задавать вопросы и отвечать на них. Почти все здесь знают, каковы процедуры запроса, ответа, голосования и прочего на этом сайте. Но очень немногие знают, каковы основные технологии. Например, был ли сайт разработан на ASP.net mvc или Python, работает ли он на сервере Windows или Linux и т. Д. Потому что это не наше дело. Таким образом, этот сайт поддерживает уровень абстракции над своим основным механизмом для нас, предоставляющих услугу.
Некоторые другие примеры:
Автомобиль скрывает все свои механизмы, но предоставляет возможность управлять, заправляться и обслуживать его своему владельцу.
Любой API скрывает все детали своей реализации, предоставляя сервис другим программистам.
Класс в ООП скрывает своих частных членов и реализацию открытых членов, предоставляя услугу для вызова открытых членов.
При использовании объекта типа
Interface
илиabstract class
в Java или C ++ реальная реализация скрыта. И не просто скрытые, реализации методов, объявленных вInterface
, также, вероятно, будут отличаться в различных реализованных / унаследованных классах. Но так как вы получаете ту же услугу, просто не беспокойтесь,How
она реализована и именноWho
/What
предоставляет услугу.Скрытие личности : для предложения «Я знаю, что Сэм может писать компьютерные программы». абстракция может быть: «Сэм - программист. Программисты умеют писать компьютерные программы». Во втором утверждении человек не важен. Но его способность заниматься программированием важна.
источник
How
всегда полезно понятьWhat
с. Таким образом, это может быть смешано с абстракцией.Программная абстракция - это упрощенная модель проблемы.
Например, соединение TCP / IP - это абстракция над отправкой данных. Вы просто включаете IP-адрес и номер порта и отправляете его в API. Вас не волнуют все детали проводов, сигналов, форматов сообщений и сбоев.
источник
Абстракция - это просто программная версия теоремы.
У вас есть формальная система, вы предлагаете мысль об этой системе. Вы делаете доказательство этого, и если это сработает, то у вас есть теорема. Зная, что ваша теорема справедлива, вы можете использовать ее в дальнейших доказательствах системы. Примитивы, предоставляемые системой (например, операторы if и типы значений int), обычно рассматриваются как аксиомы, хотя это не совсем верно, поскольку все, что не является инструкциями ЦП, написанными в машинном коде, является своего рода абстракцией.
В функциональном программировании идея программы как математического утверждения очень сильна, и часто система типов (в сильном, статически типизированном языке, таком как Haskell, F # или OCAML) может использоваться для проверки теоремы с помощью доказательств.
Например: допустим, у нас есть проверка на добавление и равенство в качестве примитивных операций, а целые и логические значения в качестве примитивных типов данных. Это наши аксиомы. Таким образом, мы можем сказать, что
1 + 3 == 2 + 2
это теорема, а затем использовать правила сложения, целых чисел и равенства, чтобы проверить, верно ли это утверждение.Теперь давайте предположим, что мы хотим умножения, и наши примитивы (для краткости) включают в себя циклическую конструкцию и средства для назначения символических ссылок. Мы могли бы предположить, что
Я собираюсь притвориться, что доказал это, демонстрируя, что умножение верно. Теперь я могу использовать умножение, чтобы делать больше вещей с моей системой (язык программирования).
Я также могу проверить свою систему типов. (*) имеет тип int -> int -> int. Требуется 2 дюйма и выводит int. Добавление имеет тип int -> int -> int, поэтому 0 + (rest) сохраняется до тех пор, пока (rest) приводит к int. Мой цикл может делать разные вещи, но я говорю, что он выводит цепочку каррированных функций, так что (x + (x + (x ... + 0))) - результат. Форма этой цепочки сложения просто (int -> (int -> (int ... -> int))), поэтому я знаю, что мой конечный результат будет int. Так что моя система типов подтвердила результаты моего другого доказательства!
Создайте такую идею на протяжении многих лет, многих программистов и множества строк кода, и у вас есть современные языки программирования: богатый набор примитивов и огромные библиотеки «проверенных» абстракций кода.
источник
Будет ли ответ Википедии достаточно хорошим? http://en.wikipedia.org/wiki/Abstraction_%28programming%29
источник
Ну, математически, "целое число" - это абстракция. И когда вы делаете формальные доказательства, подобные этому x + y = y + x для всех целых чисел, вы работаете с абстракцией "целое число", а не с конкретными числами, такими как 3 или 4. То же самое происходит в разработке программного обеспечения, когда вы взаимодействуете с машина на уровне выше регистров и мест памяти. Вы можете думать более сильные мысли на более абстрактном уровне, в большинстве случаев.
источник
IInt add(IInt a, IInt b);
подпрограмму в программе, в которой вы заранее об этом знаете ,a
иb
будете, скажем,Int128: IInt
более или менее хорошим примером? - у вас есть фрагмент кода, который делает то, что должен делать, зная (будучи в состоянии доказать), что он сделает то, что вам нужно, и в то же время (и с другой стороны) вы заставите его делать именно то, что вы нужно ли, чтобы он когда-либо не знал об этом (имея возможность использовать эту вещь и в других контекстах)?add(int, int)
подпрограмму / функцию. Этого будет достаточно, толькоreturn 2 + 3;
в этом случае. И почему вы должны использовать более «универсальную» подпрограмму (return a + b;
т.е. работать с любыми фактическими даннымиa
иb
предоставленными параметрами и, таким образом, действительно абстрагироваться от их значений) - это был мой (риторический) вопрос выше. Надеюсь, теперь стало немного яснее.Вы получаете хорошие ответы здесь. Я бы только предостерегал - люди думают, что абстракция - это как-то замечательная вещь, которую нужно поставить на пьедестал, и от которой ты не сможешь насытиться. Нет. Это просто здравый смысл. Это просто признание сходства между вещами, поэтому вы можете применить решение проблем к ряду проблем.
Позволь мне мозоль ...
Высоко в моем списке раздражающих моментов, когда люди говорят о «слоях абстракции», как будто это хорошо. Они делают «обертки» вокруг классов или процедур, которые им не нравятся, и называют их «более абстрактными», как будто это сделает их лучше. Помните басню про «Принцессу на горошине»? Принцесса была настолько деликатна, что, если бы под ее матрасом была горошинка, она не могла бы спать, и добавление дополнительных слоев матрасов не помогло бы. Идея, что добавление большего количества слоев «абстракции» поможет, просто так - обычно это не так. Это просто означает, что любое изменение в базовой сущности должно проходить через несколько уровней кода.
источник
Я думаю, что вы могли бы найти мой пост в блоге о дырявых абстракциях полезным. Вот соответствующий фон:
Абстракция - это механизм, помогающий взять то, что является общим среди набора связанных фрагментов программы, устранить их различия и позволить программистам работать непосредственно с конструкцией, представляющей эту абстрактную концепцию. Эта новая конструкция (фактически) всегда имеет параметризацию : средство для настройки использования конструкции в соответствии с вашими конкретными потребностями.
Например,
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.
Если созданная абстракция предоставляет слишком много несущественных деталей, она не сможет создать новую конструкцию со своими собственными операциями: это просто будет другое имя для той же вещи.
источник
Хорошо, я понял, что вы спрашиваете: «Что такое математически строгое определение« абстракции »?»
Если это так, я думаю, что вам не повезло - «абстракция» - это термин «архитектура / дизайн программного обеспечения», и, насколько я знаю, не имеет математической поддержки (возможно, кто-то лучше разбирающийся в теоретической CS поправит меня здесь), кроме как «связывание» или «сокрытие информации» имеют математические определения.
источник
Абстракция - это когда вы игнорируете детали, которые считаются несущественными в пользу тех, которые считаются релевантными.
Абстракция включает в себя инкапсуляцию, сокрытие информации и обобщение. Он не охватывает аналогий, метафор или эвристики.
Любой математический формализм для понятия абстракции сам по себе был бы абстракцией, так как он обязательно потребовал бы, чтобы базовая вещь была абстрагирована в набор математических свойств! Теория категорий о морфизме , вероятно, наиболее близка к тому, что вы ищете.
Абстракция - это не то, что вы объявляете, это то, что вы делаете .
источник
Как способ объяснить это другому человеку, я бы пошел другим путем, от результатов назад:
Если вы хотите расширить это, вы можете добавить:
Кроме того, я думаю, что вы должны начать с примеров ...
источник
Вы можете проверить некоторые показатели Боба Мартина
http://en.wikipedia.org/wiki/Software_package_metrics
Тем не менее, я не думаю, что его "абстрактность" такая же, как ваша. Это скорее мера «отсутствия реализации в классе», означающая использование интерфейсов / абстрактных классов. Нестабильность и расстояние от главной последовательности, вероятно, играют больше в том, что вы ищете.
источник
Merriam-Webster определяет абстрактное как прилагательное, оторванное от любого конкретного случая.
Абстракция - это модель некоторой системы. Они часто перечисляют группу предположений, которые должны быть выполнены, чтобы реальная система была смоделирована абстракцией, и они часто используются, чтобы позволить нам осмыслить все более сложные системы. Переход от реальной системы к абстракции не имеет никакого формального математического метода для этого. Это зависит от суждения того, кто определяет абстракцию, и какова цель абстракции.
Однако часто абстракции определяются в терминах математических конструкций. Это, вероятно, потому что они так часто используются в науке и технике.
Примером является ньютоновская механика. Предполагается, что все бесконечно мало и вся энергия сохраняется. Взаимодействия между объектами четко определены математическими формулами. Теперь, как мы знаем, вселенная работает не совсем так, и во многих ситуациях абстракция просачивается. Но во многих ситуациях это работает очень хорошо.
Другая абстрактная модель - это типичные линейные элементы цепи, резисторы, конденсаторы и катушки индуктивности. Снова взаимодействия четко определены математическими формулами. Для низкочастотных цепей или простых релейных драйверов и прочего анализ RLC работает хорошо и дает очень хорошие результаты. Но в других ситуациях, таких как микроволновые радиосхемы, элементы слишком велики, а взаимодействия более тонкие, и простые абстракции RLC не выдерживают. Что делать в этот момент, зависит от решения инженера. Некоторые инженеры создали другую абстракцию поверх других, некоторые заменяют идеальные операционные усилители новыми математическими формулами их работы, другие заменяют идеальные операционные усилители на имитируемые реальные операционные усилители, которые, в свою очередь, моделируются сложной сетью меньших размеров. идеальные элементы.
Как уже говорили другие, это упрощенная модель. Это инструмент, используемый для лучшего понимания сложных систем.
источник
Employer
предположенияEmployee
).Абстракция представляет что-то (например, концепцию, структуру данных, функцию) в терминах чего-то еще. Например, мы используем слова для общения. Слово - это абстрактная сущность, которая может быть представлена в терминах звуков (речи) или в виде графических символов (письма). Основная идея абстракции состоит в том, что рассматриваемая сущность отличается от основного представления, так же как слово - это не звуки, которые используются для его произнесения, или буквы, которые используются для его написания.
Таким образом, по крайней мере в теории, базовое представление абстракции может быть заменено другим представлением. На практике, однако, абстракция редко полностью отличается от базового представления, и иногда представление « протекает» » через. Например, речь несет в себе эмоциональные оттенки, которые очень трудно передать в письменной форме. Из-за этого аудиозапись и транскрипт одних и тех же слов могут оказывать разное влияние на аудиторию. Другими словами, абстракция слов часто протекает.
Абстракции обычно бывают слоями. Слова - это абстракции, которые могут быть представлены буквами, которые, в свою очередь, сами являются абстракциями звуков, которые, в свою очередь, являются абстракциями модели движения частиц воздуха, которые создаются голосовыми связками и которые обнаруживаются ушными барабанами. ,
В информатике биты обычно являются самым низким уровнем представления. Байты, ячейки памяти, инструкции по сборке и регистры ЦП являются следующим уровнем абстракции. Затем у нас есть примитивные типы данных и инструкции языка более высокого уровня, которые реализуются в виде байтов, областей памяти и инструкций по сборке. Затем функции и классы (при условии языка ОО), которые реализованы в терминах примитивных типов данных и встроены в языковые инструкции. Тогда более сложные функции и классы реализуются в терминах более простых. Некоторые из этих функций и классов реализуют структуры данных, такие как списки, стеки, очереди и т. Д. Те, в свою очередь, используются для представления более конкретных объектов, таких как очередь процессов, или список сотрудников, или хэш-таблица названий книг. ,
источник
int
меньше чем (MAX_INT_SIZE / 2-1) и возвращающая другую, которая в два раза больше:int f(int a) { return a*2; }
2. «обработчик» с прототипом, которыйvoid (*) (void)
должен быть вызван, когда ... хм, его следует вызывать согласно контракт вызывающего абонента - оба представляют абстракции (1 - по деталям его реализации (которые мы предоставили, но которые не будут доступны для тех, у кого нет доступа к исходному коду), 2 - по какому именно обработчику делает (обратите внимание, однако, что это известно человеку, который назначил обработчик)) и не просочитьсяОдин способ, которым я пытаюсь описать это людям, не может быть лучшим способом
Рассмотрим программу, которая добавляет 2 + 2 и выводит 4
Рассмотрим программу, которая добавляет два числа, введенных пользователем, x + y = z
Что является более полезным и общим?
источник
Я бы сказал, что абстракция - это то, что скрывает ненужные детали. Одной из самых основных единиц абстракции является процедура. Например, я не хочу беспокоиться о том, как я сохраняю данные в базу данных, когда я читаю эти данные из файла. Поэтому я создаю функцию save_to_database.
Абстракции также могут быть объединены в большие абстракции. Например, функции могут быть объединены в класс, классы могут быть объединены в программу, программы могут быть объединены в распределенную систему и т. Д.
источник
save_to_database
не должен беспокоиться о том, как именно сохраняются данные, если / потому что вы выбрали нужную реализацию ! Т.е. в любом случае найдется место для предоставления (абстрактного «относительного» к некоторым частям кода) детали, это просто вопрос разумного выбора - облегчения «изменения мнения» и т. Д.Я всегда думаю об абстракции в программировании как о сокрытии деталей и предоставлении упрощенного интерфейса. Это основная причина, по которой программисты могут разбивать монументальные задачи на управляемые части. С помощью абстракции вы можете создать решение для части проблемы, включая все мелкие детали, а затем предоставить простой интерфейс для использования решения. Тогда вы можете «забыть» о деталях. Это важно, потому что нет способа, которым человек мог бы одновременно запомнить все детали сверхсложной системы. Это не означает, что детали под абстракцией никогда не придется пересматривать, но на данный момент необходимо помнить только интерфейс.
В программировании этот упрощенный интерфейс может быть любым - от переменной (абстрагируемой от группы битов и обеспечивающей более простой математический интерфейс) до функции (абстрагирующей любое количество обработки в однострочный вызов) до класса и далее.
В конце концов, основная задача программистов - абстрагировать все вычислительные детали и предоставить простой интерфейс, такой как GUI, который может использовать тот, кто не знает ничего о том, как работают компьютеры.
Некоторые из преимуществ абстракции:
Позволяет разбить большую проблему на управляемые части. При добавлении записей человека в базу данных вам не нужно возиться со вставкой и балансировкой деревьев индексов в базе данных. Эта работа, возможно, была сделана в какой-то момент, но теперь она удалена, и вам больше не нужно об этом беспокоиться.
Позволяет нескольким людям хорошо работать вместе над проектом. Я не хочу знать все тонкости кода моего коллеги. Я просто хочу знать, как его использовать, что он делает и как совместить его с моей работой (интерфейсом).
Позволяет людям, у которых нет необходимых знаний, выполнять сложную задачу. Моя мама может обновить ее Facebook, и люди, которых она знает по всей стране, могут видеть это. Без абстракции безумно сложной системы до простого веб-интерфейса она ни за что не сможет начать делать что-то подобное (как и я в этом отношении).
Однако абстракция может иметь обратный эффект, делая вещи менее управляемыми, если они чрезмерно используются. Разбивая проблему на слишком много мелких частей, количество интерфейсов, которые вы должны запомнить, увеличивается, и становится все труднее понять, что происходит на самом деле. Как и большинство вещей, баланс должен быть найден.
источник
Дополнительный уровень косвенности.
Вы не хотите заботиться о том, является ли объект, который вы используете, a
Cat
или aDog
, поэтому вы просматриваете таблицу виртуальных функций, чтобы найти правильнуюmakeNoise()
функцию.Я уверен, что это может быть применено и к «более низким» и «более высоким» уровням - подумайте о компиляторе, ищущем правильную инструкцию для использования для данного процессора, или о том, что Haskell
Monad
абстрагируется от вычислительных эффектов, вызывая всеreturn
и>>=
.источник
Это то, о чем я действительно хотел писать в блоге в течение более длительного времени, но я так и не дошел до этого. К счастью, я представитель зомби, и есть даже щедрость. Мой пост получился довольно длинным , но вот суть:
[...]
Надеюсь, это поможет.
источник
Здесь нематематический ответ:
Абстрагирование в программировании - это притворство, что вы не заботитесь о деталях сейчас, тогда как на самом деле вы заботитесь о них и должны заботиться о них все время. Это в основном притворство.
источник
Для меня абстракция - это то, что не существует «буквально», это что-то вроде идеи. Если вы выражаете это математически, это больше не является абстрактным, потому что математика - это язык для выражения того, что происходит в вашем мозгу, так что это может быть понято чьим-то мозгом, поэтому вы не можете структурировать свои идеи, потому что если вы это делаете, это не идея больше: вам нужно понять, как работает мозг, чтобы выразить модель идеи.
Абстракция - это то, что позволяет вам интерпретировать реальность в нечто, что может быть независимым от нее. Вы можете абстрагировать пляж и мечту, но пляж существует, а мечта - нет. Но вы могли бы сказать, что оба существуют, но это не так.
Самое сложное в абстракции - это найти способ выразить это так, чтобы другие люди могли понять это и превратить его в реальность. Это самая сложная работа, и она не может быть выполнена в одиночку: вы должны изобрести относительную модель, которая работает над вашими идеями и которую может понять кто-то другой.
Для меня абстракция в компьютерном языке должна называться «математикой» модели, она заключается в повторном использовании идей, которые могут быть переданы, и это огромное ограничение по сравнению с тем, что может быть достигнуто абстрактно.
Проще говоря, атомы находятся рядом друг с другом, но им все равно. Большой набор молекул, организованных в человека, может понять, что он рядом с кем-то, но не может понять, как, просто атомы позиционируют себя в какой-то схеме.
Один объект, которым управляет понятие, вообще не может «понять» себя. Вот почему мы пытаемся верить в Бога и поэтому нам трудно понять свой мозг.
Могу ли я получить свою медаль сейчас?
источник
Интересный вопрос. Я не знаю ни одного определения абстракции, которое считается авторитетным в программировании. Хотя другие люди предоставили ссылки на некоторые определения из различных ветвей теории или математики CS; Мне нравится думать об этом аналогично «супервентности» см. Http://en.wikipedia.org/wiki/Supervenience.
Когда мы говорим об абстракции в программировании, мы, по сути, сравниваем два описания системы. Ваш код является описанием программы. Абстракция вашего кода также будет описанием этой программы, но на более высоком уровне. Конечно, у вас может быть даже более высокий уровень абстракции вашей исходной абстракции (например, описание программы в архитектуре системы высокого уровня по сравнению с описанием из программы в ее подробном проекте).
Теперь, что делает одно описание «более высокого уровня», чем другое. Ключ «множественная реализуемость» - ваша абстракция программы может быть реализована многими способами на многих языках. Теперь вы можете сказать, что можно создать несколько проектов и для одной программы - два человека могут создать два различных проекта высокого уровня, которые точно описывают программу. Эквивалентность реализаций имеет значение.
При сравнении программ или проектов вы должны делать это таким образом, чтобы вы могли определить ключевые свойства описания на этом уровне. Вы можете столкнуться со сложными способами сказать, что дизайн эквивалентен другому, но самый простой способ думать об этом - может ли одна двоичная программа удовлетворить ограничения обоих описаний?
Так что же делает один уровень описания выше другого? Допустим, у нас есть один уровень описания A (например, проектная документация) и другой уровень описания B (например, исходный код). A является более высоким уровнем, чем B, потому что если A1 и A2 являются двумя неэквивалентными описаниями на уровне A, то реализации этих описаний, B1 и B2, должны также быть неэквивалентными на уровне B. Однако обратное не всегда верно ,
Поэтому, если я не могу создать одну двоичную программу, которая удовлетворяет двум разным документам проекта (т.е. ограничения этих проектов будут противоречить друг другу), то исходный код, который реализует эти проекты, должен быть другим. Но с другой стороны, если я возьму два набора исходного кода, которые не могут быть скомпилированы в одну и ту же двоичную программу, все равно может случиться так, что двоичные файлы, полученные в результате компиляции этих двух наборов исходного кода, будут соответствовать одному и тому же проекту. документ. Таким образом, проектный документ является «абстракцией» исходного кода.
источник
Программные абстракции - это абстракции, сделанные кем-то на элементе программирования. Допустим, вы знаете, как создать меню из его предметов и вещей. Затем кто-то увидел этот кусок кода и подумал: эй, это может быть полезно в других типах структур, похожих на нанятых, и определил Шаблон проектирования компонентов с помощью абстракции первого куска кода.
Объектно-ориентированные шаблоны проектирования являются хорошим примером абстракции, и я имею в виду не реальную реализацию, а то, как мы должны подходить к решению.
Итак, подводя итог, абстракция программирования - это подход, который позволяет нам понять проблему, это средство получить что-то, но это не реальная вещь
источник