В разработке программного обеспечения и теории языков программирования принцип абстракции ( или принцип абстракции ) — это базовое изречение , целью которого является уменьшение дублирования информации в программе (обычно с упором на дублирование кода ), когда это практически возможно, путем использования абстракций , предоставляемых язык программирования или библиотеки программного обеспечения . [1] Этот принцип иногда формулируется как рекомендация программисту, но иногда формулируется как требование языка программирования, при условии, что он сам понимает, почему желательно использовать абстракции. Истоки этого принципа неясны; его изобретали заново несколько раз, иногда под другим названием, с небольшими вариациями.
При прочтении в качестве рекомендаций программисту принцип абстракции можно обобщить как принцип « не повторяйся » (DRY), который рекомендует избегать дублирования информации в целом, а также избегать дублирования человеческих усилий, задействованных в программном обеспечении. процесс развития.
В качестве рекомендации программисту, сформулированный Бенджамином К. Пирсом в книге «Типы и языки программирования» (2002), принцип абстракции гласит (выделено в оригинале): [2]
Каждая значительная часть функциональности программы должна быть реализована только в одном месте исходного кода. Если сходные функции выполняются отдельными частями кода, обычно бывает полезно объединить их в один, абстрагируя различные части.
В качестве требования к языку программирования, сформулированного Дэвидом А. Шмидтом в книге « Структура типизированных языков программирования» (1994), принцип абстракции гласит: [3]
Могут быть названы фразы любого семантически значимого синтаксического класса.
Принцип абстракции упоминается в нескольких книгах. Некоторые из них вместе с формулировкой, если она краткая, перечислены ниже.
Этот принцип играет центральную роль в шаблонах проектирования объектно-ориентированного программирования , хотя в большинстве работ по этой теме этому принципу не дают названия. В книге «Шаблоны проектирования» , написанной «Бандой четырех», говорится: «Основное внимание здесь уделяется заключению варьирующейся концепции , которая является темой многих шаблонов проектирования». Другие авторы перефразировали это утверждение как «Найдите то, что меняется, и инкапсулируйте это». [7]
В этом столетии этот принцип был заново изобретен в экстремальном программировании под лозунгом «Один раз и только один раз». Определение этого принципа на первый взгляд было довольно лаконичным: «нет дублирующегося кода». [8] Позже оно было доработано и применимо к другим проблемам разработки программного обеспечения: «Автоматизируйте каждый процесс, который стоит автоматизировать. Если вы обнаружите, что выполняете задачу много раз, напишите для нее сценарий». [9]
Принцип абстракции часто формулируется в контексте некоторого механизма, предназначенного для облегчения абстракции. Базовым механизмом абстракции управления является функция или подпрограмма . Абстракции данных включают различные формы полиморфизма типов . Более сложные механизмы, которые могут объединять абстракции данных и управления, включают в себя: абстрактные типы данных , включая классы , политипизм и т. д. Поиск более богатых абстракций, позволяющих уменьшить дублирование в сложных сценариях, является одной из движущих сил в исследованиях и проектировании языков программирования.
У неопытных программистов может возникнуть соблазн ввести в свою программу слишком много абстракции — абстракции, которая не будет использоваться более одного раза. [ нужна цитация ] Дополнительным принципом, который подчеркивает эту проблему, является « Вам это не понадобится » и, в более общем плане, принцип KISS .
Поскольку код обычно подлежит пересмотру, следование принципу абстракции может повлечь за собой рефакторинг кода. [ нужна цитата ] Усилия по переписыванию фрагмента кода, как правило, должны быть амортизированы с учетом предполагаемых будущих выгод от абстракции. Эмпирическое правило, управляющее этим, было разработано Мартином Фаулером и популяризировано как правило трех . В нем говорится, что если часть кода копируется более двух раз, т. е. в конечном итоге будет иметь три или более копий, то ее необходимо абстрагировать.
« Не повторяйте себя », или «принцип DRY», — это обобщение, разработанное в контексте многоуровневых архитектур , где связанный код по необходимости дублируется в некоторой степени на разных уровнях, обычно на разных языках. С практической точки зрения, здесь рекомендуется полагаться на автоматизированные инструменты, такие как генераторы кода и преобразования данных, чтобы избежать повторения. [ нужна цитата ]
Помимо оптимизации кода, иерархическое/рекурсивное значение уровня абстракции в программировании также относится к интерфейсам между аппаратными уровнями связи, также называемым «уровнями абстракции» и «уровнями абстракции». В этом случае уровень абстракции часто является синонимом интерфейса. Например, при изучении шелл-кода и интерфейса между языками более высокого и низкого уровня уровень абстракции меняется от команд операционной системы (например, в C) до вызовов и команд уровня регистров и схем (например, в ассемблере и двоичном коде). В данном примере границей или интерфейсом между уровнями абстракции является стек. [10]