Принцип абстракции (компьютерное программирование) - Abstraction principle (computer programming)

В программная инженерия и теория языков программирования, то принцип абстракции (или принцип абстракции) является основным изречение который направлен на сокращение дублирования информации в программе (обычно с упором на дублирование кода ) по возможности, используя абстракции предоставляется языком программирования или программные библиотеки[нужна цитата ]. Этот принцип иногда формулируется как рекомендация для программиста, но иногда указывается как требование языка программирования, предполагая, что он сам понимает, почему желательно использовать абстракции. Истоки этого принципа неясны; его несколько раз изобретали заново, иногда под другим названием, с небольшими вариациями.

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

Принцип

В качестве рекомендации программисту в его формулировке Бенджамин С. Пирс в Типы и языки программирования (2002), принцип абстракции гласит (курсив в оригинале):[1]

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

Как требование языка программирования, в его формулировке Дэвидом А. Шмидтом в Структура типизированных языков программирования (1994) принцип абстракции гласит:[2]

Могут быть названы фразы любого семантически значимого синтаксического класса.

История и вариации

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

  • Альфред Джон Коул, Рональд Моррисон (1982) Введение в программирование с помощью S-algol: «[Абстракция] в применении к языковому дизайну означает определение всех семантически значимых синтаксических категорий в языке и допускает абстракцию над ними».[3]
  • Брюс Дж. Макленнан (1983) Принципы языков программирования: проектирование, оценка и реализация: «Не требуйте, чтобы что-то говорилось более одного раза; исключите повторяющийся шаблон».[4]
  • Джон Пирс (1998) Программирование и метапрограммирование на схеме: «Структура и функции должны быть независимыми».[5]

Принцип играет центральную роль в шаблоны проектирования в объектно-ориентированного программирования, хотя в большинстве работ по этой теме этот принцип не упоминается. В влиятельная книга Банды четырех, говорится: "В центре внимания инкапсуляция концепция, которая меняется, тема многих шаблонов проектирования ». Это утверждение было перефразировано другими авторами как« Найдите то, что меняется, и инкапсулируйте это ».[6]

В этом веке принцип был заново изобретен в экстремальное программирование под лозунгом «Один раз и только один раз». Определение этого принципа при первом появлении было довольно кратким: «нет повторяющегося кода».[7] Позже он был разработан для применения к другим вопросам в разработке программного обеспечения: «Автоматизируйте каждый процесс, который стоит автоматизировать. Если вы обнаружите, что выполняете задачу много раз, запишите ее».[8]

Подразумеваемое

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

У неопытных программистов может возникнуть соблазн ввести слишком много абстракции в свою программу - абстракцию, которая не будет использоваться более одного раза.[нужна цитата ] Дополнительный принцип, подчеркивающий эту проблему: "Тебе это не понадобится "и, в более общем плане, Принцип KISS.

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

Обобщения

"Не повторяйся ", или" принцип DRY ", является обобщением, разработанным в контексте многоуровневые архитектуры, где связанный код по необходимости дублируется в некоторой степени на разных уровнях, обычно на разных языках. С практической точки зрения рекомендуется полагаться на автоматизированные инструменты, такие как генераторы кода и преобразования данных чтобы избежать повторения.[нужна цитата ]

Интерфейсы аппаратного программирования

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

Рекомендации

  1. ^ Пирс, Бенджамин (2002). Типы и языки программирования. MIT Press. п. 339. ISBN  0-262-16209-1.
  2. ^ Дэвид А. Шмидт, Структура типизированных языков программирования, MIT Press, 1994, ISBN  0-262-19349-3, п. 32
  3. ^ Альфред Джон Коул, Рональд Моррисон, Введение в программирование с помощью S-algol, Архив Кубка, 1982, ISBN  0-521-25001-3, п. 150
  4. ^ Брюс Дж. МакЛеннан, Принципы языков программирования: проектирование, оценка и реализация, Холт, Райнхарт и Уинстон, 1983, стр. 53
  5. ^ Джон Пирс, Программирование и метапрограммирование в схеме, Birkhäuser, 1998, ISBN  0-387-98320-1, п. 40
  6. ^ Алан Шеллоуэй, Джеймс Тротт, Объяснение шаблонов проектирования: новый взгляд на объектно-ориентированный дизайн, Аддисон-Уэсли, 2002 г., ISBN  0-201-71594-5, п. 115
  7. ^ Кент Бек, Объяснение экстремального программирования: примите изменения, 2-е издание, Addison-Wesley, 2000 г., ISBN  0-201-61641-6, п. 61
  8. ^ Хроматический, Карманное руководство по экстремальному программированию, О'Рейли, 2003, ISBN  0-596-00485-0
  9. ^ Козиол, Справочник шеллкодеров », Wiley, 2004, стр. 10, ISBN  0-7645-4468-3