Что такое модульное программирование в чем его плюсы и минусы
Модульное программирование
Модуль – это последовательность логически связанных фрагментов, оформленных как отдельная часть программы.
К модулю предъявляются следующие требования:
1) модуль должен реализовывать единственную функцию, т.е. при построении модуля используется концепция: «один модуль – одна функция». Таким образом, модуль – это элемент программы, выполняющий самостоятельную задачу. На его входе он может получать определенный набор исходных данных, обрабатывать их в соответствии с заданным алгоритмом и возвращать результат обработки, т.е. реализуется стандартный принцип IPO (Input – Process – Output) – вход-процесс-выход;
2) на модуль нужно ссылаться с помощью его имени. Он должен иметь один вход и один выход, что гарантирует замкнутость модуля и упрощает сопровождение программ;
3) модуль должен иметь функциональную завершенность, т.е. выполнять перечень регламентированных операций для реализации каждой отдельной функции в полном составе, достаточных для завершения начатой обработки;
4) модуль должен возвращать управление в точку его вызова, в свою очередь, он должен иметь возможность сам вызывать другие модули;
5) модуль не должен сохранять историю своих вызовов и использовать ее при своем функционировании;
6) модуль должен иметь логическую независимость, т.е. результат работы программного модуля зависит только от исходных данных, но не зависит от работы других модулей;
7) модуль должен иметь слабые информационные связи с другими программными модулями – обмен информацией между модулями должен быть по возможности минимизирован;
8) модуль должен быть сравнительно невелик, т.е. быть обозримым по размеру и сложности. Опытные программисты рекомендуют его размер не более двух страниц распечатки на принтере.
Для достижения независимости модулей часто используется принцип информационной локализованности, который состоит в том, что вся информация о структуре данных, о прототипах функций, констант и т.д. сосредотачивается («упрятывается») в отдельном модуле. Доступ к этой информации осуществляется только через этот модуль (в алгоритмическом языке С/С++ такие модули имеют расширение *.h).
Программирование с использованием модулей называется модульным программированием. Оно возникло еще в начале 60-х годов XX в. Модульное программирование основано на идее использования уровней абстракции, когда вся проблема или комплекс задач разбивается на задачи, подзадачи, абстрагируется и представляется в виде иерархического дерева связанных между собой модулей, в совокупности представляющих создаваемое программное обеспечение (ПО).
Достоинствами модульного программирования является следующее:
· большую программу могут писать одновременно несколько программистов, что позволяет раньше закончить задачу;
· можно создавать библиотеки наиболее употребительных модулей;
· упрощается процедура загрузки в оперативную память большой программы, требующей сегментации;
· появляется много естественных контрольных точек для отладки проекта;
· проще проектировать и в дальнейшем модифицировать программы.
Недостатки модульного программирования заключаеются в следующем:
· возрастает размер требуемой оперативной памяти;
· увеличивается время компиляции и загрузки;
· увеличивается время выполнения программы;
· довольно сложными становятся межмодульные интерфейсы.
Модульное программирование реализуется через модули – функции. Функция – это область памяти, выделяемая для сохранения программного кода, предназначенного для выполнения конкретной задачи. Другими словами, функция – минимальный исполняемый модуль программы на языке С/С++. По умолчанию функция имеет тип external, и доступ к ней возможен из любого файла программы. Но она может быть ограничена спецификатором класса памяти static.
Функция характеризуется типом, областью действия связанного с функцией имени, видимостью имени функции, типом связывания.
Все функции имеют рекомендуемый стандартами языка единый формат определения. Он имеет заголовок функции, в котором задаются: тип, имя функции и спецификация формальных параметров:
Тип имя_функции (спецификация_параметров) тело_функции
Тип – это тип возвращаемого функцией значения, в том числе void (кроме типов массива или функции). Умолчанием является тип int. Если тип возврата функции не void, то тело функции должно содержать как минимум один оператор return.
Имя_функции – идентификатор, с помощью которого можно обратиться к функции. Он выбирается программистом произвольно и не должен совпадать со служебными словами и с именами других объектов программы. Однако любая программа на языке С/С++ должна иметь хотя бы одну функцию с именем main – главную функцию, содержащую точку входа в программу.
Спецификация_параметров – список формальных параметров, т.е. переменных, принимающих значения, передаваемые функции при ее вызове. Список формальных параметров перечисляется через запятую. Каждый формальный параметр должен иметь следующий формат:
Тип может быть встроенным (int, long, float, double и т.д.), структурой (struct), объединением (union), перечислением (enum), указателями на них или на функции или классы (class). Имя_формального_параметра представляет собой имя используемой в теле функции переменной. Идентификаторы формальных параметров не могут совпадать с именами локальных переменных, объявленных внутри тела функции.
Объявление формального параметра может содержать инициализатор, то есть выражение, которое должно обеспечить параметру присвоение начального значения. Инициализатор параметра не является константным выражением. Начальная инициализация параметров происходит не на стадии компиляции (как, например, выделение памяти под массивы), а непосредственно в ходе выполнения программы.
В языке С/C++ допустимы функции, количество параметров у которых при компиляции функции не фиксировано, следовательно, остаются неизвестными и их типы. Количество и типы параметров таких функций становятся известными только при их вызове, когда явно задан список фактических параметров. При определении и описании таких функций со списками параметров неопределенной длины спецификацию формальных параметров следует закончить запятой и многоточием.
Каждая функция с переменным количеством параметров должна иметь хотя бы один обязательный параметр. После списка обязательных параметров ставится запятая, а затем многоточие, извещающее компилятор, что дальнейший контроль соответствия количества и типов параметров при обработке вызова функции проводить не нужно.
Спецификация_параметровможет отсутствовать, то есть скобки могут быть пустыми, но в этом случае рекомендуется указывать тип void.
Тело_функции – часть определения функции, ограниченная фигурными скобками и непосредственно размещенная вслед за заголовком функции. Тело_функцииможет быть либо составным оператором, либо блоком. Например:
Модульное программирование
Что такое модульное программирование
Модуль в программировании — это фрагмент кода, имеющий определенное функциональное значение и характеризующийся логической завершенностью.
Модульное программирование — это способ создания программы посредством объединения модулей в единую структуру.
Применение способа позволяет значительно повысить скорость разработки, обеспечить ее надежность, упростить тестирование. Модульное программирование удобно при групповой работе, так как каждый из участников процесса имеет возможность сконцентрироваться только на своем объеме работ, не отвлекаясь на деятельность коллег.
Осторожно! Если преподаватель обнаружит плагиат в работе, не избежать крупных проблем (вплоть до отчисления). Если нет возможности написать самому, закажите тут.
Важное преимущество подхода — возможность заменить или обновить один из компонентов без изменений всей остальной системы.
В чем состоит особенность, основные принципы
Основной принцип метода сформулирован канадским программистом Дэвидом Парнасом. Согласно его высказыванию, для создания одного модуля достаточно минимальных знаний о содержании других. Именно на основе этого принципа Парнас выдвинул концепцию сокрытия информации в программировании.
Сокрытие в программировании — это способ проектирования, предполагающий разграничение доступа разных частей продукта к внутренним компонентам друг друга.
Технологически процесс выглядит так:
В качестве структурных единиц могут выступать сервисы, классы, библиотеки функций, структуры данных и другие единицы, реализующие определенную функцию и способные предоставить интерфейс к ней.
Разновидности модулей
В информатике существуют дополнительные понятия модуля.
Модуль — это набор команд, который имеет свое обозначение и который можно вызвать по имени.
Модуль — это совокупность программных операторов, имеющая идентификатор и граничные компоненты.
Также принято выделять три разновидности:
Примерами крупных могут послужить набор пакетов в языках Java, Ada, а также набор модулей в программном языке Modula-2.
Проблемы модульного программирования
Несмотря на существенные достоинства метода, специалисты подмечают и ряд недостатков:
Если первые три пункта легко нивелируются мощью современной техники, то последний целиком и полностью зависит от программистов, оптимальности предложенных ими решений.
Что такое модульное программирование и кому оно нужно
В любой профессии, не только в программировании, вы переживаете разные эмоциональные состояния по ходу выполнения проекта:
Некоторые думают, что это нормально: стоит смириться и каждый раз проживать этот цикл. На деле же всё немного проще, и решение лежит не в области психологии, а в подходе к созданию кода.
Классическая проблема программирования
В западной литературе существует термин «big ball of mud» для описания архитектуры программы. Давайте переведём его дословно. Графически «большой шар грязи» можно представить в виде точек на окружности, символизирующих функциональные элементы, и прямых – связей между ними:
Похоже на ваши глаза перед сдачей проекта, не так ли?
Это иллюстрация той сложности, с которой вам надо работать, какое количество связей учитывать, если возникает ошибка.
Программирование не уникальная дисциплина: здесь можно и нужно применять опыт из других областей. Возьмём, к примеру, компьютер. Их производители не задумываются над многообразием задач, которые решает пользователь, и уж тем более не выделяют под каждую маленький процессор и память. Компьютер – это просто набор независимых сложных объектов, объединённых в одном корпусе при помощи разъёмов и проводов. Объекты не уникальны, не оптимизированы конкретно под вас, и тем не менее блестяще справляются со своей задачей.
В программировании есть точно такие же решения. Например, библиотеки. Они помогают не тратить драгоценное время на изобретение велосипеда. Однако для частных задач библиотеки не эффективны – создание отнимет уйму времени, а при единичной повторяемости эффективность стремится к нулю.
В этом случае полезнее обратиться к модулям. Модуль – логически завершённый фрагмент кода, имеющий конкретное функциональное назначение. Для взаимодействия модулей используются способы, не позволяющие изменять параметры и функциональность. Плюсы модульного программирования очевидны:
Модульное программирование крайне эффективно при групповых разработках, где каждый сотрудник может сконцентрироваться только на своём фронте работ и не оглядываться на решения коллег. Однако и в индивидуальном подходе вы получаете, как минимум, вышеописанные преимущества.
Но не всё так просто.
Проблемы модульного программирования
Сама по себе идея использования модулей не сильно упрощает код, важно минимизировать количество прямых связей между ними. Здесь мы подходим к понятию «инверсия управления» (IoC). Упрощённо – это принцип программирования, при котором отдельные компоненты кода максимально изолированы друг от друга. То есть детали одного модуля не должны влиять на реализацию другого. Достигается это при помощи интерфейсов или других видов представления, не обеспечивающих прямого доступа к модульному коду.
В повседневной жизни таких примеров множество. Чтобы купить билет на самолёт или узнать время вылета, вам не надо звонить пилоту. Чтобы выпить молока, не надо ехать в деревню или на завод и стоять над душой у коровы. Для этого всегда есть посредники.
В модульном программировании существует три основные реализации:
Несмотря на то, что первая реализация IoC используется чаще всего, для первых шагов в модульном программировании лучше использовать другие два. Причина – простое создание интерфейсов лишь ограничивает доступ к модулям, а для снижения сложности кода необходимо также уменьшить количество связей. Интерфейсы, хаотично ссылающиеся на другие интерфейсы, код только усложняют.
Для решения этой проблемы необходимо разработать архитектуру кода. Как правило, она схожа с файловой структурой любого приложения:
Соблюдение принципа модульности в больших проектах позволит сэкономить время и не расплескать стартовый задор. Более того, у вас получится наконец сосредоточиться на самом интересном – реализации оригинальных задумок в коде. А ведь это именно то, что каждый из нас ищет в программировании.
В любой профессии, не только в программировании, вы переживаете разные эмоциональные состояния по ходу выполнения проекта:
Некоторые думают, что это нормально: стоит смириться и каждый раз проживать этот цикл. На деле же всё немного проще, и решение лежит не в области психологии, а в подходе к созданию кода.
Классическая проблема программирования
В западной литературе существует термин «big ball of mud» для описания архитектуры программы. Давайте переведём его дословно. Графически «большой шар грязи» можно представить в виде точек на окружности, символизирующих функциональные элементы, и прямых – связей между ними:
Похоже на ваши глаза перед сдачей проекта, не так ли?
Это иллюстрация той сложности, с которой вам надо работать, какое количество связей учитывать, если возникает ошибка.
Программирование не уникальная дисциплина: здесь можно и нужно применять опыт из других областей. Возьмём, к примеру, компьютер. Их производители не задумываются над многообразием задач, которые решает пользователь, и уж тем более не выделяют под каждую маленький процессор и память. Компьютер – это просто набор независимых сложных объектов, объединённых в одном корпусе при помощи разъёмов и проводов. Объекты не уникальны, не оптимизированы конкретно под вас, и тем не менее блестяще справляются со своей задачей.
В программировании есть точно такие же решения. Например, библиотеки. Они помогают не тратить драгоценное время на изобретение велосипеда. Однако для частных задач библиотеки не эффективны – создание отнимет уйму времени, а при единичной повторяемости эффективность стремится к нулю.
В этом случае полезнее обратиться к модулям. Модуль – логически завершённый фрагмент кода, имеющий конкретное функциональное назначение. Для взаимодействия модулей используются способы, не позволяющие изменять параметры и функциональность. Плюсы модульного программирования очевидны:
Модульное программирование крайне эффективно при групповых разработках, где каждый сотрудник может сконцентрироваться только на своём фронте работ и не оглядываться на решения коллег. Однако и в индивидуальном подходе вы получаете, как минимум, вышеописанные преимущества.
Но не всё так просто.
Проблемы модульного программирования
Сама по себе идея использования модулей не сильно упрощает код, важно минимизировать количество прямых связей между ними. Здесь мы подходим к понятию «инверсия управления» (IoC). Упрощённо – это принцип программирования, при котором отдельные компоненты кода максимально изолированы друг от друга. То есть детали одного модуля не должны влиять на реализацию другого. Достигается это при помощи интерфейсов или других видов представления, не обеспечивающих прямого доступа к модульному коду.
В повседневной жизни таких примеров множество. Чтобы купить билет на самолёт или узнать время вылета, вам не надо звонить пилоту. Чтобы выпить молока, не надо ехать в деревню или на завод и стоять над душой у коровы. Для этого всегда есть посредники.
В модульном программировании существует три основные реализации:
Несмотря на то, что первая реализация IoC используется чаще всего, для первых шагов в модульном программировании лучше использовать другие два. Причина – простое создание интерфейсов лишь ограничивает доступ к модулям, а для снижения сложности кода необходимо также уменьшить количество связей. Интерфейсы, хаотично ссылающиеся на другие интерфейсы, код только усложняют.
Для решения этой проблемы необходимо разработать архитектуру кода. Как правило, она схожа с файловой структурой любого приложения:
Соблюдение принципа модульности в больших проектах позволит сэкономить время и не расплескать стартовый задор. Более того, у вас получится наконец сосредоточиться на самом интересном – реализации оригинальных задумок в коде. А ведь это именно то, что каждый из нас ищет в программировании.
Русские Блоги
Подробное объяснение модульного программирования в интерфейсной разработке
Предисловие
Развитие интерфейсных технологий меняется с каждым днем. С повсеместным использованием технологии Ajax библиотека jQuery постоянно появляется, интерфейсный код расширяется, а область разработки javascript становится все более обширной. Для стандартизации управления будет использоваться модульное программирование. Эта статья начинается с концепции модульности, объяснения причин модульности, а также преимуществ и недостатков различных методов модуляризации. И все они знакомят с процессом разработки норм модульности и модульности на примерах имитационных упражнений. Позвольте читателям лучше понять концепцию модульного программирования.
Модульная базовая концепция
js реализует модульное программирование (оригинальный способ)
Фактически, несколько связанных функций определены в одном файле js.
Например, мы модифицируем файл users.js и добавляем функцию getById, что означает поиск пользователя по id. Затем создайте новый файл product.js и добавьте функцию getById, что означает поиск продукта по идентификатору.
Модульная спецификация
1. Спецификация Commonjs
Создайте файл пользователей и определите модуль пользователей, который конкретно инкапсулирует набор методов, связанных с пользователями. Все методы инкапсулируются в объект, и, наконец, весь объект назначается свойству module.exports.
Добавить use_users.js, представить модуль пользователей и деконструировать некоторые методы для моего использования.
проблема: В спецификации Commonjs модули загружаются синхронно:
1. После загрузки предыдущего модуля могут быть загружены последующие модули, а последующие коды могут быть выполнены.
2. Если вы работаете на стороне сервера и загружаете локальные файловые модули js, вам не нужно беспокоиться о скорости загрузки.
3. Если он запущен на клиенте, модуль на удаленном сервере должен быть загружен, что вызовет задержку. Потому что: по умолчанию скрипт загружается синхронно. Предыдущий сценарий не может быть загружен, и последний сценарий не может быть запущен.
4. Итак, как ее решить? Это асинхронная загрузка модулей на стороне клиента. Давайте посмотрим на спецификацию AMD для загрузки асинхронного модуля.
2. Спецификация AMD
Шаг 1. Определите подмодуль. Модуль должен быть определен с помощью специальной функции define (). Возвращаемое значение функции обратного вызова в define () определяет, что бросает модуль.
Шаг 2. Добавьте подмодули в основной файл js:
Подчеркните: путь к файлу js модуля в [] в define () или require () определяется относительно основного файла js.
Последний шаг: в HTML сначала введите require.js и представьте основной файл js.
2. Асинхронная загрузка, поэтому файл require.js также загружается асинхронно.
Создайте новую папку demo_js, в которой создайте новую папку модулей, добавьте demo_js / modules / users.js и инкапсулируйте модули для бизнес-функций, связанных с пользователем.
Добавьте demo_js / modules / utils.js, библиотеку, которая инкапсулирует общие функции инструментов.
Добавьте demo_js / modules / products.js, модуль, который инкапсулирует бизнес-функции, связанные с продуктом, которые зависят от модуля utils.
В папке demo_js папка модулей находится на уровне, добавьте demo_js / main.js, основной файл js, и введите другие подмодули
Добавьте amd.html, используйте скрипт, чтобы ввести файл require.js и основной файл js
Запускаем и наблюдаем за изменениями головного элемента в сети и элементов
Было обнаружено, что js-файлы других модулей, загружаемые элементами скрипта, динамически добавляются в порядке зависимости
Проблема
Метод 1. Заранее настройте все подмодули и пути модулей подуровня и назначьте им псевдонимы.
Метод 2: Настройте базовый каталог:
-o, за которым следует список параметров:
В результате в каталоге demo_js создается main-built.js.
Измените значение атрибута data-main на странице amd.html на demo_js / main-built.js
Запустите HTML и наблюдайте за изменениями элементов заголовка в сети и элементов
В результате в сети есть только один запрос main-built.js, кроме require.js.
подводить итоги:
Выполнить: Результат: Даже если функции модуля продуктов не используются, модуль продуктов должен быть загружен заранее, а js загружается по запросу в программе, что требует следующего стандартного CMD
Спецификация CMD
seajs.use() vs require()
Скопируйте каталог demo_js и переименуйте его в demo_js1
измените demo_js1 / modules / users.js
Измените demo_js1 / modules / utils.js
Измените demo_js1 / modules / products.js
Корневой каталог проекта: определите cmd.html, импортируйте sea.js и основной модуль.
Выполнить: результат: выполнить по требованию
Однако при наблюдении за элементом и сетью все еще есть проблемы, но они выполняются по запросу. Фактически, все файлы js загружаются в начале, что не служит целям оптимизации.
Итак, в чем разница между require () и require.async ()?
Давайте попробуем это в упражнении:
Измените demo_js1 / main.js, используйте require.async () вместо require ()
Беги, результат тот же. Но наблюдая за сетью и элементом, больше не загружайте все в начале, а загружайте по запросу.
Есть много вещей, поэтому давайте сначала напишем это, я надеюсь, что после прочтения у меня появится собственное понимание модульного программирования. Если есть вопросы, пожалуйста, свяжитесь с нами,личный блог