Абстракция (информатика)

редактировать
Метод упорядочения сложности компьютерных систем

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

Джон В. Гуттаг

В программной инженерии и информатике, абстракциявыглядит так:

  • процесс удаления физических, пространственных или временных деталей или атрибутов при исследовании объектов или систем, чтобы сосредоточить внимание на более важных деталях; по своей природе он похож на процесс обобщения ;
  • создания абстрактного концепта - объектов путем отражения общих черт или атрибутов различных не -абстрактные объекты или системы исследования - результат процесса абстракции.

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

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

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

Содержание
  • 1 Обоснование
  • 2 Возможности языка
    • 2.1 Языки программирования
    • 2.2 Методы спецификации
    • 2.3 Языки спецификации
  • 3 Абстракция управления
    • 3.1 Структурированное программирование
  • 4 Абстракция данных
  • 5 Ручная абстракция данных
  • 6 Абстракция в объектно-ориентированном программировании
    • 6.1 Объектно-ориентированный дизайн
  • 7 Соображения
  • 8 Уровни абстракции
    • 8.1 База данных системы
    • 8.2 Многоуровневая архитектура
  • 9 См. Также
  • 10 Ссылки
  • 11 Дополнительная литература
  • 12 Внешние ссылки
Обоснование

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

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

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

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

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

Возможности языка

Языки программирования

Различные языки программирования предоставляют разные типы абстракции в зависимости от предполагаемых приложений для языка. Например:

  • В объектно-ориентированных языках программирования, таких как C ++, Object Pascal или Java, концепция абстракциясама стала декларативным выражением - с использованием ключевых слов виртуальныхC ++ ) или абстрактныхи интерфейсJava ). После такого объявления программист должен реализовать класс для создания экземпляра объекта объявления.
  • Функциональные языки программирования обычно демонстрируют абстракции, связанные с функции, такие как лямбда-абстракции (превращение члена в функцию некоторой переменной) и функции высшего порядка (параметры - это функции).
  • Современные члены Семейство языков программирования Lisp, такое как Clojure, Scheme и Common Lisp, поддерживает макросистемы, позволяющие синтаксическую абстракцию. Другие языки программирования, такие как Scala, также имеют макросы или очень похожие функции метапрограммирования (например, Haskell имеет Template Haskell и OCaml имеет MetaOCaml ). Это может позволить программисту исключить шаблонный код, абстрагироваться от утомительных последовательностей вызовов функций, реализовать новые структуры потока управления и реализовать доменные языки (DSL), которые позволяют лаконично и элегантно выражать концепции предметной области. Все это, при правильном использовании, улучшает как эффективность программиста, так и ясность кода, делая предполагаемую цель более явной. Следствием синтаксической абстракции также является то, что любой диалект Лиспа и практически любой язык программирования, в принципе, может быть реализован в любом современном Лиспе со значительно меньшими (но все же в некоторых случаях нетривиальными) усилиями по сравнению с «более традиционным» языки программирования, такие как Python, C или Java.

Методы спецификации

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

  • метод на основе абстрактной модели (VDM, Z);
  • алгебраические методы (Larch, CLEAR, OBJ, ACT ONE, CASL);
  • методы, основанные на процессах (LOTOS, SDL, Estelle);
  • Методы трассировки (SPECIAL, TAM);
  • Методы, основанные на знаниях (Refine, Gist).

Языки спецификации

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

Абстракция управления

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

a: = (1 + 2) * 5

Для человека это кажется довольно простым и очевидным вычислением (" один плюс два - три, умноженный на пять - пятнадцать »). Однако низкоуровневые шаги, необходимые для выполнения этой оценки и возврата значения «15», а затем присвоения этого значения переменной «a», на самом деле довольно тонкие и сложные. Значения необходимо преобразовать в двоичное представление (часто гораздо более сложная задача, чем можно было бы подумать), а вычисления разложить (компилятором или интерпретатором) на инструкции сборки (опять же, которые гораздо менее интуитивно понятны для программиста: такие операции, как сдвиг двоичного регистра влево или добавление двоичного дополнения содержимого одного регистра к другому - это просто не то, как люди думают об абстрактных арифметических операциях сложения или умножения). Наконец, присвоение результирующего значения «15» переменной с меткой «а», чтобы «а» можно было использовать позже, включает дополнительные «закулисные» шаги по поиску метки переменной и результирующего местоположения на физическом носителе. или виртуальная память, сохраняя двоичное представление числа "15" в этой ячейке памяти и т. д.

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

  1. оно вынуждает программиста постоянно повторять довольно общие задачи каждый раз, когда требуется аналогичная операция;
  2. оно вынуждает программиста программировать для конкретного оборудования и набора команд

Структурированное программирование

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

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

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

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

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

Абстракция данных

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

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

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

Ручное абстрагирование данных

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

Абстракция в объектно-ориентированной программирование

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

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

Common Lisp Object System или Self, например, с меньшим отличием класса от экземпляра и большим использование делегирования для полиморфизма . Отдельные объекты и функции абстрагируются более гибко, чтобы лучше соответствовать общему функциональному наследию Lisp.

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

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

Рассмотрим, например, образец фрагмента Java для представления некоторых обычных сельскохозяйственных «животных» на уровне абстракции, подходящем для моделирования простых аспектов их голода и кормления. Он определяет класс Animalдля представления как состояния животного, так и его функций:

открытый класс Animal расширяет LivingThing {private Location loc; частные двойные энергетические резервы; public boolean isHungry () {return energyReservations < 2.5; } public void eat(Food food) { // Consume food energyReserves += food.getCalories(); } public void moveTo(Location location) { // Move to new location this.loc = location; } }

С помощью приведенного выше определения можно создавать объекты типа Animalи вызывать их методы следующим образом:

thePig = new Animal (); theCow = новое животное (); если (thePig.isHungry ()) {thePig.eat (tableScraps); } если (theCow.isHungry ()) {theCow.eat (трава); } theCow.moveTo (theBarn);

В приведенном выше примере класс Animal- это абстракция, используемая вместо реального животного, LivingThing- дополнительная абстракция (в данном случае обобщение) Животное.

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

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

Объектно-ориентированный дизайн

Решения относительно того, что абстрагировать, а что оставить под контролем кодировщика, становятся главной проблемой объектно-ориентированного проектирования и анализа предметной области - Фактическое определение релевантных отношений в реальном мире является задачей объектно-ориентированного анализа или.

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

Соображения

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

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

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

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

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

Абстракция - это основная концепция абстрактной интерпретации. Проверка модели обычно проводится на абстрактных версиях изучаемых систем.

Уровни абстракции

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

Системы баз данных

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

Уровни абстракции данных в базе данных система

Физический уровень:Самый нижний уровень абстракции описывает, как система фактически хранит данные. Физический уровень подробно описывает сложные низкоуровневые структуры данных.

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

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

Многоуровневая архитектура

Возможность предоставить дизайн различных уровней абстракции может

  • значительно упростить дизайн
  • позволить игрокам с разными ролями эффективно работать на различных уровнях абстракции
  • поддерживать переносимость программных артефактов (в идеале на основе модели)

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

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

См. Также
Ссылки
Дополнительная литература
Внешние ссылки
  • SimArch пример многоуровневой архитектуры для распределенных систем моделирования.
Последняя правка сделана 2021-06-08 19:47:12
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте