Для чего программы разбиваются на модули

Добрый день посетители моего канал Old Programmer , канала посвященного программированию и программистам. Сегодня не большая статья о том, как создаются программы, состоящие из нескольких модулей.

Ссылки для вас

Список разделов канала Old Programmer, канала о программировании и программистах
Old Programmer 27 мая 2021
Программирование на языке Python. Путеводитель по ресурсам моего канала Old Programmer
Old Programmer 3 октября 2020

Основы модульного программирования на Python

Собственно разбиение программы на несколько файлов (модулей) естественно. Действительно, представим себе текст программа ну хотя бы в 1000 строк. Я вас уверяю, что даже если вы хорошо прокомментируете, разобьете на блоки, все равно работать с такой программой чрезвычайно не удобно. А это означает повышается вероятность появление ошибок, да и сам процесс программирования замедляется.

Желательно разбить текст программы на несколько файлов строк эдак 150-200 (впрочем это каждый сам определяет). Конечно, при этом большая часть кода должна быть упакована в функции и объекты. Другими словами, модульный подход является естественным продолжением процедурного или объектного подхода.

Занятие №47. Модули 1С — часть 5 — Общий модуль (не глобальный)

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

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

Я постараюсь изложить технические аспекты, при чем чисто практически, не вдаваясь слишком в подробности. Начну с того, что для подключения дополнительных модулей языка Python мы используем команду import . Например import sys или import math . С помощь. этой же команды можно подключать собственно ваши модули. Вот собственно и все, но как говорят, есть нюансы. Вот некоторые из них мы разберем.

Команда import может быть использована в двух формах

import
from import

Самый простой вариант, когда есть главный модуль и ряд других модулей, с которыми главный модуль связан через команду import . Но иногда не главным модулям также необходимо подключать какие-то другие ваши модули. В этом случае главный модуль может быть связан с такими модулями через «посредника» . Но давайте рассмотрим пример.

Ниже mod6000.py (главный модуль), m1.py , m2.py , m3.py — модули, объединенные в одну программу при помощи команды import .

Главный модуль импортирует два модуля m1.py и m3.py . Соответственно для запуска функции из модуля или использовании глобальной переменной, определенной в модуле используется имя модуля, точка и имя функции (переменной). То же самое относится к классу, который определен в модуле m3.py — создается объект на основе этого класса.

Но есть и интересный момент. Модуль m2.py непосредственно не импортируется в главный модуль. Но он импортируется в модуль m1.py . Соответственно доступ к объектам модуля m2.py осуществляется так m1.m2. . Конечно, m2.py можно подключать к главному модулю и напрямую, но это, как говорится, дело вкуса.

Модули / Введение в программирование, урок 14 (JavaScript ES6)

Представленная схема довольно проста, но я бы хотел обратить внимание на один нюанс. В представленном примере

  1. Все модули находятся в одном каталоге.
  2. Этот же каталог является текущим.

Что произойдет, если мы будем запускать главный модуль из другого каталога? В данном случае ответ обнадеживающий: Если все модули будут в одном каталоге, то программа будет работать корректно. Чтобы понять почему так происходит обратимся к переменной-списку sys.path . Список этот содержит все каталоги, будут искаться подключаемые по import модули. Например, у меня список имеет следующий вид

Читайте также:
Lm viewer что это за программа

[‘/home/vladislav/Yandex.Disk/projects/programming/python/import’, ‘/usr/lib/python39.zip’, ‘/usr/lib/python3.9’, ‘/usr/lib/python3.9/lib-dynload’, ‘/home/vladislav/.local/lib/python3.9/site-packages’, ‘/usr/local/lib/python3.9/dist-packages’, ‘/usr/lib/python3/dist-packages’, ‘/usr/lib/python3.9/dist-packages’]

При этом sys.path[0] это всегда путь к каталогу, где хранится главный модуль. Т.е. если все модули хранятся в одном каталоге, то программа работает корректно. Если же часть модулей находится в других каталогах, то прежде, чем их вызывать, следует дополнить список sys.path ( append() ) путями к этим каталогам. При этом правильнее использовать абсолютные (не относительные) пути.

Ну и последнее. Если у вас в программе есть модули, то в каталогах, где они хранятся появляется каталог __pycache__ . Эта папка будет содержать байт-код модулей, чтобы при повторном запуске ускорить выполнение программы.

До скорого на моем канале Old Programmer , подписываемся и оставляем комментарии.

Источник: dzen.ru

Для чего программы разбиваются на модули

Цель введения разных типов модулей — вывести модульную архитектуру на оптимальный уровень, на котором код легко поддерживать и расширять. Типизация модулей играет большую роль в том, чтобы разные модули были изолированы друг от друга и имели минимальный доступ к информации об их взаимозависимостях. Эта цель достигается с помощью линтеров , которые предотвращают появление зависимостей, которых быть не должно. Например, зависимость модуля api от модуля implementation , модуля implementation от другого модуля implementation или модуля implementation от модуля utility , предназначенного для использования в другой области кода.

🧱 Модульная архитектура: что, как и почему?

А чем, например, модуль utility отличается от модуля implementation?

Давайте более подробно рассмотрим типы модулей, которые я упоминал ранее.

  • API (Application Programming Interface)

Определяет и описывает функциональность и сервисы, которые предоставляет программа (модуль, библиотека), при этом позволяет абстрагироваться от того, как именно эта функциональность и эти сервисы реализованы.

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

Обеспечивает целенаправленную, многократно используемую функциональность, которая используется в небольшом количестве связанных модулей implementation . В редких случаях модули utility могут обеспечивать общую функциональность и могут быть использованы во всех модулях implementation . Поскольку модули utility более тесно связаны с implementation и не предоставляют базовых абстракций, они, как правило, меняются чаще, чем модули core , и не могут использоваться в api .

Содержит классы, необходимые для реализации функций и сервисов, описанных в модулях api . Обычно модули implementation содержат одну или несколько общедоступных точек входа, что позволяет им обеспечивать их реализацию в конечных приложениях с помощью графика области применения. Чтобы предотвратить взаимодействие между функциями и службами, модули implementation не могут зависеть от других модулей implementation .

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

  • Инкапсуляция: модули должны скрывать свою реализацию от внешнего окружения
  • Слабая связность: модули должны взаимодействовать только с помощью заранее оговоренных контрактов
  • Динамичность: модули можно заменять, не останавливая все приложение

Модульный подход к архитектуре делает написание кода более простым и динамичным и имеет множество преимуществ: от возможности работать над кодом в команде удаленно до высокого уровня безопасности. Главное — разобраться в том, что такое модульная архитектура и как она работает, и тогда модульный подход сможет оптимизировать работу над вашими проектами и даже улучшить их качество. Надеюсь, эта статья была вам полезна. Удачи!

Читайте также:
Что за программа atom на компьютере

Источник: proglib.io

Модульное программирование

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

Концепции модульного программирования. В основе модульного программирования лежат три основных концепции.

1. Принцип утаивания информации Парнаса. Всякий компонент утаивает единственное проектное решение, т. е. модуль служит для утаивания информации. Подход к разработке программ заключается в том, что сначала формируется список проектных решений, которые особенно трудно принять или которые, скорее всего, будут меняться. Затем определяются отдельные модули, каждый из которых реализует одно из указанных решений.

2. Аксиома модульности Коуэна. Модуль — независимая программная единица, служащая для выполнения некоторой определенной функции программы и для связи с остальной частью программы. Программная единица должна удовлетворять следующим условиям:

· блочность организации, т. е. возможность вызвать программную единицу из блоков любой степени вложенности;

· синтаксическая обособленность, т. е. выделение модуля в тексте синтаксическими элементами;

· семантическая независимость, т. е. независимость от места, где программная единица вызвана;

· общность данных, т. е. наличие собственных данных, сохраняющихся при каждом обращении;

· полнота определения, т. е. самостоятельность программной единицы.

3. Сборочное программирование Цейтина. Модули — это программные кирпичи, из которых строится программа. Существуют три основные предпосылки к модульному программированию:

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

· потребность организационного расчленения крупных разработок;

· возможность параллельного исполнения модулей (в контексте параллельного программирования).

Определения модуля и его примеры.Приведем несколько дополнительных определений модуля.

Модуль — это совокупность команд, к которым можно обратиться по имени.

Модуль — это совокупность операторов программы, имеющая граничные элементы и идентификатор (возможно агрегатный).

Функциональная спецификация модуля должна включать:

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

· описание семантики функций, выполняемых модулем по каждому из его входов.

Разновидности модулей. Существуют три основные разновидности модулей:

· функциональные модули, реализующие, как правило, одну какую-либо определенную функцию. Основным и простейшим модулем практически во всех языках программирования является процедура или функция;

· информационные модули, реализующие, как правило, несколько операций или функций над одной и той же структурой данных (информационным объектом), которая считается неизвестной вне этого модуля;

· логическиемодули, объединяющие набор функциональных и информационных модулей.

Набор характеристик модуля предложен Майерсом (1980). Он состоит из следующих конструктивных характеристик.

1. Размер модуля.

В модуле должно быть 7 (+/-2) конструкций (например, операторов для функций или функций для пакета). Это число берется на основе представлений психологов о среднем оперативном буфере памяти человека. Символьные образы в человеческом мозгу объединяются в «чанки» — наборы фактов и связей между ними, запоминаемые и извлекаемые как единое целое. В каждый момент времени человек может обрабатывать не более 7 чанков.

Модуль (функция) не должен превышать 60 строк. В результате его можно поместить на одну страницу распечатки или легко просмотреть на экране монитора.

2. Прочность (связность) модуля.

Существует гипотеза о глобальных данных, утверждающая, что глобальные данные вредны и опасны. Идея глобальных данных дискредитирует себя так же, как и идея оператора безусловного перехода goto. Локальность данных дает возможность легко читать и понимать модули, а также легко удалять их из программы.

Читайте также:
Smart tuTor что это за программа в Самсунге a51

Прочность (связность) модуля — мера независимости его частей. Чем выше связность модуля — тем лучше, тем больше связей по отношению к оставшейся части программы он упрятывает в себе. Можно выделить следующие типы связности:

· функциональная связность. Модуль с функциональной связностью реализует одну какую-либо определенную функцию и не может быть разбит на два модуля с теми же типами связностей;

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

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

Средства для создания информационно прочных модулей отсутствовали в ранних языках программирования (например, FORTRAN и даже в оригинальной версии языка Pascal). И только позже, в языке программирования Ada, появился пакет — средство задания информационно прочного модуля.

3. Сцепление модуля с другими модулями.

Сцепление — мера относительной независимости модуля от других модулей. Независимые модули могут быть модифицированы без переделки других модулей. Чем слабее сцепление модуля, тем лучше. Различают следующие типы сцепления:

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

· сцепление по данным (параметрическое) — это сцепление, когда данные передаются модулю, как значения его параметров, либо как результат его обращения к другому модулю для вычисления некоторой функции. Этот вид сцепления реализуется в языках программирования при обращении к функциям (процедурам). Две разновидности этого сцепления определяются характером данным.

4. Рутинность (независимость от предыдущих обращений) модуля.

Рутинность — это независимость модуля от предыдущих обращений к нему (от предыстории). Модуль называется рутинным, если результат его работы зависит только от количества переданных параметров (а не от количества обращений).

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

В большинстве случаев делаем модуль рутинным, т. е. независимым от предыдущих обращений.

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

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

Каждый модуль состоит из спецификации и тела. Спецификации определяют правила использования модуля, а тело – способ реализации процесса обработки.

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

При определении набора модулей, реализующих функции конкретного алгоритма, необходимо учитывать следующее:

· каждый модуль вызывается на выполнение вышестоящим модулем и, закончив работу, возвращает управление вызвавшему его модулю;

· принятие основных решений в алгоритме выносится на максимально высокий по иерархии уровень;

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

Источник: megaobuchalka.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru