Модульное программирование - Википедия - Modular programming

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

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

В объектно-ориентированном программировании использование интерфейсов в качестве архитектурного шаблона для создания модулей известно как интерфейсное программирование[нужна цитата ].

Терминология

Период, термин сборка (как в .NET языки подобно C #, F # или же Visual Basic .NET ) или же упаковка (как в Дротик, Идти или же Ява ) иногда используется вместо модуль. В других реализациях это разные концепции; в Python пакет - это набор модулей, а в Java 9 введение концепция нового модуля (сборник пакетов с расширенным контролем доступа).

Кроме того, термин «пакет» имеет другие значения в программном обеспечении (например, Пакеты .NET NuGet ). А компонент аналогичное понятие, но обычно относится к более высокому уровню; компонент - это часть целого система, а модуль - это часть индивидуальной программы. Масштаб термина «модуль» значительно различается между языками; в Python он очень мал, и каждый файл представляет собой модуль, а в Java 9 Планируется, что он будет крупномасштабным, где модуль представляет собой набор пакетов, которые, в свою очередь, являются наборами файлов.

Другие термины для модулей включают единица измерения, используется в Паскаль диалекты.

Языковая поддержка

Языки, формально поддерживающие концепцию модуля, включают: Ада, Алгол, BlitzMax, C ++, C #, Clojure, КОБОЛ, Common_Lisp, D, Дротик, eC, Erlang, Эликсир, Вяз, F, F #, Фортран, Идти, Haskell, IBM / 360 Ассемблер, Язык управления IBM i (CL), IBM RPG, Ява,[а] MATLAB, ML, Modula, Модула-2, Модула-3, Морфо, NEWP, Оберон, Оберон-2, Цель-C, OCaml, несколько производных от Паскаль (Компонент Паскаль, Object Pascal, Турбо Паскаль, UCSD Паскаль ), Perl, PL / I, PureBasic, Python, Рубин,[2] Ржавчина, JavaScript,[3] Visual Basic .NET и WebDNA.

Яркими примерами языков, не поддерживающих модули, являются: C и были C ++ и Паскаль в их первоначальном виде, C и C ++ тем не менее, позволяют указывать отдельные интерфейсы компиляции и декларативные интерфейсы с помощью файлы заголовков. Модули были добавлены в Objective-C в IOS 7 (2013); на C ++ с C ++ 20,[4] и Паскаль был заменен Modula и Oberon, которые включали модули с самого начала, и различные производные, которые включали модули. JavaScript имеет собственные модули с ECMAScript 2015.

Модульное программирование может выполняться даже там, где в языке программирования отсутствуют явные синтаксические функции для поддержки именованных модулей, как, например, в C. Это достигается с помощью существующих языковых функций вместе, например, с соглашения о кодировании, идиомы программирования и физическая структура кода. В IBM System i также использует модули при программировании в Интегрированная языковая среда (ИЛЭ).

Ключевые аспекты

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

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

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

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

История

Модульное программирование в форме подсистем (особенно для ввода-вывода) и программных библиотек восходит к ранним программным системам, где оно использовалось для повторное использование кода. Модульное программирование как таковое с целью модульности, разработанное в конце 1960-х и 1970-х годах как крупномасштабный аналог концепции структурное программирование (1960-е). Термин «модульное программирование» восходит как минимум к Национальному симпозиуму по модульному программированию, организованному в Институте информации и систем в июле 1968 г. Ларри Константин; другие ключевые концепции были скрытие информации (1972) и разделение проблем (SoC, 1974).

Модули не были включены в исходную спецификацию для АЛГОЛ 68 (1968), но были включены как расширения в ранние реализации, АЛГОЛ 68-R (1970) и АЛГОЛ 68C (1970), а позже формализованная.[5] Одним из первых языков, разработанных с самого начала для модульного программирования, был недолговечный Modula (1975), автор Никлаус Вирт. Еще одним ранним модульным языком был Меса (1970-е), автор Xerox PARC, а Вирт опирался на Mesa, а также на оригинальную Modula в своем преемнике, Модула-2 (1978), который повлиял на более поздние языки, особенно через своего преемника, Модула-3 (1980-е). Использование Modula точки-квалифицированные имена, подобно М.а ссылаться на объект а из модуля M, совпадает с нотацией для доступа к полю записи (и аналогично для атрибутов или методов объектов) и в настоящее время широко распространен, например, в C #, Dart, Go, Java и Python. Модульное программирование получило широкое распространение с 1980-х годов: первоначальный Паскаль язык (1970) не включал модули, но более поздние версии, особенно UCSD Паскаль (1978) и Турбо Паскаль (1983) включили их в форму «единиц», как это сделали находящиеся под влиянием Паскаля Ада (1980). Стандарт Extended Pascal ISO 10206: 1990 ближе к Modula2 в своей модульной поддержке. Стандартный ML (1984)[6] имеет одну из самых полных модульных систем, включая функторы (параметризованные модули) для отображения между модулями.

В 1980-х и 1990-х годах модульное программирование было омрачено и часто смешивалось с объектно-ориентированного программирования, особенно из-за популярности C ++ и Java. Например, семейство языков C имело поддержку объектов и классов в C ++ (первоначально C с классами, 1980) и Objective-C (1983), поддерживающие только модули спустя 30 лет или более. Java (1995) поддерживает модули в форме пакетов, хотя основной единицей организации кода является класс. Однако Python (1991) с самого начала активно использовал как модули, так и объекты, используя модули в качестве основной единицы организации кода, а «пакеты» - как более крупномасштабную единицу; и Perl 5 (1994) включает поддержку как модулей, так и объектов, при этом широкий спектр модулей доступен из CPAN (1993).

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

Смотрите также

Примечания

  1. ^ Термин «пакет» используется для обозначения модуля в JLS;[1] - видеть Пакет Java. "Модули ", своего рода набор пакетов, планируется для Java 9 как часть Проект Jigsaw; раньше они назывались «суперпакетами» и планировались для Java 7.

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

  1. ^ Джеймс Гослинг, Билл Джой, Гай Стил, Гилад Браха, Спецификация языка Java, третье издание, ISBN  0-321-24678-0, 2005. Во Введении говорится: «Глава 7 описывает структуру программы, которая организована в пакеты, подобные модулям Modula». Слово «модуль» не имеет в Java особого значения.
  2. ^ [1]
  3. ^ Спецификация языка ECMAScript® 2015, модули 15.2
  4. ^ «N4720: рабочий проект, расширения C ++ для модулей» (PDF).
  5. ^ Линдси, Чарльз Х. (Февраль 1976 г.). "Предложение о модульном механизме в АЛГОЛЕ 68" (PDF). Бюллетень Алгола (39): 20–29. Архивировано из оригинал (PDF) на 2016-03-03. Получено 2014-12-01.
  6. ^ Дэвид Маккуин (август 1984 г.). «Модули для стандартного машинного обучения, LFP '84 Труды симпозиума ACM 1984 г. по LISP и функциональному программированию»: 198–207. Цитировать журнал требует | журнал = (помощь)

внешняя ссылка