Принцип абстракции (компьютерное программирование)
В разработке программного обеспечения и теории языков программирования принцип абстракции (или принцип абстракции ) — это базовое изречение , целью которого является уменьшение дублирования информации в программе (обычно с упором на дублирование кода ), когда это практически возможно, путем использования абстракций, предоставляемых язык программирования или библиотеки программного обеспечения . [1] Этот принцип иногда формулируется как рекомендация программисту, но иногда формулируется как требование языка программирования, при условии, что он сам понимает, почему желательно использовать абстракции. Истоки этого принципа неясны; его изобретали заново несколько раз, иногда под другим названием, с небольшими вариациями.
При прочтении в качестве рекомендаций программисту принцип абстракции можно обобщить как принцип « не повторяться » (DRY), который рекомендует избегать дублирования информации в целом, а также избегать дублирования человеческих усилий, задействованных в программном обеспечении. процесс разработки.
Принцип [ править ]
В качестве рекомендации программисту в формулировке Бенджамина К. Пирса в книге «Типы и языки программирования» (2002) принцип абстракции гласит (курсив в оригинале): [2]
Каждая значительная часть функциональности программы должна быть реализована только в одном месте исходного кода. Если схожие функции выполняются отдельными частями кода, обычно бывает полезно объединить их в один, абстрагируя различные части.
В качестве требования к языку программирования, сформулированного Дэвидом А. Шмидтом в книге «Структура типизированных языков программирования» (1994), принцип абстракции гласит: [3]
Могут быть названы фразы любого семантически значимого синтаксического класса.
История и варианты [ править ]
Принцип абстракции упоминается в нескольких книгах. Некоторые из них вместе с формулировкой, если она краткая, перечислены ниже.
- Альфред Джон Коул, Рональд Моррисон (1982). Введение в программирование на S-алголе : «[Абстракция] применительно к проектированию языка заключается в определении всех семантически значимых синтаксических категорий в языке и разрешении абстракции над ними». [4]
- Брюс Дж. МакЛеннан (1983) Принципы языков программирования: проектирование, оценка и реализация : «Избегайте необходимости формулировать что-то более одного раза; исключите повторяющийся шаблон». [5]
- Джон Пирс (1998) Программирование и метапрограммирование в схеме : «Структура и функция должны быть независимыми». [6]
Этот принцип играет центральную роль в шаблонах проектирования , хотя в большинстве работ по объектно-ориентированного программирования этой теме этому принципу не дают названия. В книге «Шаблоны проектирования», написанной «Бандой четырех», говорится: «Основное внимание здесь уделяется заключению варьирующейся концепции , которая является темой многих шаблонов проектирования». Другие авторы перефразировали это утверждение как «Найдите то, что меняется, и инкапсулируйте это». [7]
В этом столетии этот принцип был заново изобретен в экстремальном программировании под лозунгом «Один раз и только один раз». Определение этого принципа на первый взгляд было довольно лаконичным: «нет дублирующегося кода». [8] Позже это было доработано и применимо к другим проблемам разработки программного обеспечения: «Автоматизируйте каждый процесс, который стоит автоматизировать. Если вы обнаружите, что выполняете задачу много раз, напишите для нее сценарий». [9]
Последствия [ править ]
Принцип абстракции часто формулируется в контексте некоторого механизма, предназначенного для облегчения абстракции. Базовым механизмом абстракции управления является функция или подпрограмма . Абстракции данных включают различные формы полиморфизма типов . Более сложные механизмы, которые могут объединять абстракции данных и управления, включают: абстрактные типы данных , включая классы , политипизм и т. д. Поиск более богатых абстракций, позволяющих уменьшить дублирование в сложных сценариях, является одной из движущих сил в исследованиях и проектировании языков программирования.
У неопытных программистов может возникнуть соблазн ввести в свою программу слишком много абстракции — абстракции, которая не будет использоваться более одного раза. [ нужна ссылка ] Дополнительный принцип, который подчеркивает эту проблему, — « Вам это не понадобится » и, в более общем плане, принцип KISS .
Поскольку код обычно подлежит пересмотру, следование принципу абстракции может повлечь за собой рефакторинг кода. [ нужна ссылка ] Усилия по переписыванию фрагмента кода, как правило, необходимо амортизировать с учетом предполагаемых будущих преимуществ абстракции. Эмпирическое правило, управляющее этим, было разработано Мартином Фаулером и популяризировано как правило трех . В нем говорится, что если часть кода копируется более двух раз, т. е. в конечном итоге будет иметь три или более копий, то ее необходимо абстрагировать.
Обобщения [ править ]
« Не повторяйте себя », или «принцип DRY», — это обобщение, разработанное в контексте многоуровневых архитектур , где связанный код по необходимости дублируется в некоторой степени на разных уровнях, обычно на разных языках. С практической точки зрения, здесь рекомендуется полагаться на автоматизированные инструменты, такие как генераторы кода и преобразования данных, чтобы избежать повторения. [ нужна ссылка ]
Интерфейсы аппаратного программирования [ править ]
Помимо оптимизации кода, иерархическое/рекурсивное значение уровня абстракции в программировании также относится к интерфейсам между аппаратными уровнями связи, также называемым «уровнями абстракции» и «уровнями абстракции». В этом случае уровень абстракции часто является синонимом интерфейса. Например, при изучении шелл-кода и интерфейса между языками более высокого и низкого уровня уровень абстракции меняется от команд операционной системы (например, в C) до вызовов и команд уровня регистров и схем (например, в ассемблере и двоичном коде). В данном примере границей или интерфейсом между уровнями абстракции является стек. [10]
Ссылки [ править ]
- ^ Мишра, Джибитеш (2011). Программная инженерия . Пирсон Образовательная Индия. ISBN 978-81-317-5869-4 .
- ^ Пирс, Бенджамин (2002). Типы и языки программирования . МТИ Пресс. п. 339. ИСБН 0-262-16209-1 .
- ^ Дэвид А. Шмидт, Структура типизированных языков программирования , MIT Press, 1994, ISBN 0-262-19349-3 , с. 32
- ^ Альфред Джон Коул, Рональд Моррисон, Введение в программирование с помощью S-algol , Архив CUP, 1982, ISBN 0-521-25001-3 , с. 150
- ^ Брюс Дж. МакЛеннан, Принципы языков программирования: проектирование, оценка и реализация , Холт, Райнхарт и Уинстон, 1983, стр. 53
- ^ Джон Пирс, Программирование и метапрограммирование в схеме , Биркхойзер, 1998, ISBN 0-387-98320-1 , с. 40
- ^ Алан Шеллоуэй, Джеймс Тротт, Объяснение шаблонов проектирования: новый взгляд на объектно-ориентированное проектирование , Аддисон-Уэсли, 2002, ISBN 0-201-71594-5 , с. 115
- ^ Кент Бек, Объяснение экстремального программирования: примите перемены , 2-е издание, Аддисон-Уэсли, 2000, ISBN 0-201-61641-6 , с. 61
- ^ Chromatic, Карманное руководство по экстремальному программированию , О'Рейли, 2003 г., ISBN 0-596-00485-0
- ^ Козиол, Справочник шеллкодеров» , Wiley, 2004, стр. 10, ISBN 0-7645-4468-3