Аннотация: В этой лекции мы рассматриваем структуру модулей, их создание и подключение к проекту. На конкретном практическом примере рассматривается работа с модулями.
Цель лекции
Изучение внутренней структуры модулей, создание модуля и подключение его к проекту.
Модули
Модуль (англ. Unit) — это автономно компилируемая программная единица, которая может включать в себя такие объекты программы, как типы, константы, переменные и подпрограммы (процедуры и функции).
Каждый раз, когда мы создаем какое либо окно, для него автоматически создаются два файла: файл описаний *.lfm и модуль *.pas. В файле описаний в простом текстовом виде содержится описание формы — какие компоненты на ней находятся, как они настроены, какие параметры содержатся у свойств каждого компонента. Редактировать этот файл вручную крайне не рекомендуется, лучше всё сделать в Lazarus, в Инспекторе объектов и Редакторе форм, так вы гарантированно избежите ошибок в описании формы.
В файле модуля находится исходный код — то, что делает программа , когда пользователь взаимодействует с различными компонентами или с самой формой. Весь тот код, все процедуры и функции, которые мы вводили, находятся в модуле того или иного окна. Однако значение модулей этим не ограничивается. Модули необязательно должны быть связаны с окном, они могут существовать в проекте и сами по себе! Чаще всего это делают с двумя целями:
Уроки на языке Pascal. Урок 19. Модуль (Unit).
- Разработка приложений несколькими программистами (каждый пишет свой код, который потом собирается и компилируется в единый проект).
- Программист может собирать собственную библиотеку часто используемых функций и процедур, помещая их в независимые модули, которые затем он может подключить к любому своему проекту или даже поделиться ими с другими программистами.
Как вы понимаете, больше всего нас интересует вторая цель, с этим рано или поздно сталкивается любой практикующий программист. Кроме того, на просторах Интернета вы можете найти великое множество самых разнообразных инструментов, выполненных в виде модулей, которые авторы выкладывают в общий доступ , их можно скачать и использовать в своих программах.
Как-то раз один мой ученик спросил, не является ли дурным тоном использовать чужой код. Давным-давно, на заре программирования это было и впрямь не очень принято. Однако теперь все изменилось — программы стали гораздо больше, функциональней, простая программа содержит очень много кода.
Например, мы с вами не раз применяли функцию Length() , которая возвращает длину строки в символах или длину массива в элементах. В принципе, мы могли бы поднапрячься, и самостоятельно реализовать эту функцию стандартными средствами Паскаля. Однако это было бы неоправданной тратой времени, ведь эта функция уже реализована и включена в библиотеку Lazarus!
Я ответил тому ученику, что дурным тоном будет изобретать велосипед, то есть, впустую тратить время на разработку того, что давным-давно реализовано. Конечно, если вы будете использовать чужой код без ведома и разрешения автора, то это будет плохо. Однако если автор сам выложил свой код, то почему бы им не воспользоваться? Разумеется, тут остается риск того, что автор — не очень хороший программист, и его код может «глючить» — работать с ошибками. В этом случае могу дать такой совет: ищите исходники на приличных, больших сайтах, которые не заброшены и часто обновляются. В следующей лекции, на лабораторной работе, мы используем один такой чужой модуль .
Как в Python писать программы с интерфейсом?
Сейчас же нас больше интересует, как создать модуль самостоятельно, как поместить в него процедуры и функции, которые могут пригодиться нам в дальнейшем, в различных проектах. Мы реализуем модуль с «защитой от дураков» — с проверкой правильности вводимого пользователем числа. Причем числа могут быть целые беззнаковые (от 0 и выше), целые со знаком (могут быть отрицательными) и вещественные, которые все со знаком.
Структура модулей
Модуль в Паскале имеет следующую структуру:
Unit ; interface //открытая часть implementation //закрытая часть initialization finalization end.
Имя модуля
Имя модуля должно точно соответствовать имени файла этого модуля. То есть, если вы создаете модуль
unit MyUnit;
то и сохранять его нужно обязательно в файл MyUnit.pas. При этом старайтесь выбирать для модулей понятные имена, не соответствующие стандартным модулям. Имена стандартных подключаемых модулей вы можете видеть в разделе uses в Редакторе кода.
Совет: если при редактировании кода и удерживая нажатой клавишу вы подведете указатель мыши к имени какого либо подключаемого модуля, его имя превратится в гиперссылку, щелкнув по которой вы откроете этот модуль. Можете посмотреть, как реализуются профессиональные модули, заглянуть «во внутренности» процедур и функций.
Интерфейсная часть
Интерфейсная часть — это открытая часть, начинается со служебного слова interface . Здесь можно объявлять глобальные типы, константы , переменные, функции и процедуры, которые будут доступны для всех программ и модулей, к которым вы подсоедините данный модуль . Здесь же при желании вы можете указать служебное слово uses, после которого перечислить те модули, которые хотите подключить к этому модулю. Пример (выполнять не нужно):
Unit MyUnit; interface uses windows; const MyPI = 3.1415; var MyGlobalVariable: Integer; function MyGlobalFunc(a, b: string): boolean; procedure MyClobalProc;
Здесь мы создаем модуль с именем MyUnit , который нужно сохранить в файл с именем MyUnit.pas. Далее, мы объявляем интерфейсную часть. Тут с помощью служебного слова uses (англ. использовать) мы указываем, что к этому модулю нужно еще подключить модуль windows , который входит в стандартную поставку Lazarus.
Далее, мы объявляем константу MyPI , которой сразу присваиваем значение , и переменную MyGlobalVariable . И константой, и переменной можно будет пользоваться извне — там, где будет подключаться этот модуль .
Далее мы объявляем функцию и процедуру. Обратите внимание: только объявляем! Само описание (код) этих функции и процедуры будет в разделе исполняемой части (или разделе реализации). В дальнейшем этими процедурой и функцией мы также сможем пользоваться извне.
Источник: intuit.ru
Программирование по модулям в СИ
Программирование – это процедура написания утилит и софта для разного рода консолей. Существуют различные методы и концепции соответствующего процесса. Вести разработку можно на кроссплатформенных и нативных языках.
Огромную популярность обрело СИ-семейство. Пример – C. Этот язык относительно прост и удобен для понимания. Он предусматривает так называемое модульное программирование. Далее речь зайдет о подобном способе написания софта.
Понятие
Модульное программирование – своеобразная организация утилиты (программного обеспечения) в виде связи независимых блоков, которые носят название модулей. Структура и поведение оных будут подчиняться конкретным принципам и алгоритмам.
Мо дульное программи рование – особый принцип коддинга, при котором отдельные компоненты (блоки) предельно изолированы друг от друга. Детали одного модуля не будут оказывать никакого влияния на реализацию другого. Получить подобного рода результат удастся получить посредством интерфейсов. Возможны и иные виды представления, через которые нельзя получить прямой доступ к кодификации.
Способы реализации
Модульное программирование c, как и в любом другом языке, предусматривает несколько способом реализаций. В зависимости от них будут меняться принципы применения тех или иных функций:
- Установка зависимости. В данной ситуации каждый элемент будет обладать собственным интерфейсом. Модули взаимодействуют посредством interfaces.
- Фабричный прием. Базируется на существовании некоторого объекта, который необходим для создания других. В приложение внедряется прототип, объединяющие ключевые черты для большинства функций. Параметры здесь будут наследоваться от «завода».
- Сервисный подход. Программист должен сделать общий единый интерфейс. Он послужит для функций и их взаимодействия своеобразным буфером.
Первый вариант встречается чаще остальных. Но их тоже необходимо применять на практике. Связано это с тем, что элементарное создание интерфейсов создает ограничения доступа к модулям. Чтобы снизить сложность приложения, требуется уменьшить имеющиеся связи. Функции и интерфейсы, ссылаемые на себе подобные, делают данный процесс сложнее.
Требования к модулям
В программируемом приложении при использовании модулей необходимо учитывать некоторые требования. Без них написать софт, который будет работать по задумке, не представляется возможным.
Модуль – это своеобразная последовательность логически связанных фрагментов (функций), которые оформлены в виде самостоятельных утилитных блоков. А вот требования, которые к нему предъявляются:
- Должен отвечать только за одну единственную функцию. При построении модуля применяется концепция «один блок – одна функция». Отвечает за самостоятельную задачу. На входе можно передать определенных набор исходных материалов, обработать их в соответствие с техническим заданием, а потом возвратить результат обработки.
- Ссылка осуществляется через специализированное имя. Он должен обладать всего одним входом и выходом. Это гарантирует замкнутость «блока».
- Функции должны выступать в виде завершенных алгоритмов.
- Модуль должен передавать управление в точку первоначального вызова. Тут должна присутствовать возможность самостоятельного вызова других «обособленных функций».
- История вызовов не должна сохраняться. Она же не применяется при функционировании «блока кода».
- Логическая независимость. Результат программируемого модуля находится в зависимости от исходных материалов. От других функций утилиты – нет.
- Наличие слабых информационных связей с иными «блоками» утилиты. Обмен информацией производится редко. От предельно минимизирован.
- Модуль C должен быть относительно небольшой. Это касается и его размера, и сложности. Опытные разработчики стараются создавать не более двух страничек печатного текста.
Для того, чтобы обеспечить «блоку» соответствующие критерии, нужно применять принципы информационной локализованности. Смысл его заключается в том, что все электронные материалы о структуре данных, прототипах, константах и функций «прячется» в пределах «готового блока кода». Доступ предоставляется лишь через соответствующий модуль. В СИ-семействе они легко различимы. Обладают расширением .*h.
Как выделить
При работе с рассматриваемым объектом в СИ требуется запомнить, что он состоит из реализации и заголовочного файла. Первый имеет документ вида .c, второй — .h.
Код, который отвечает за подключение «блока», будет на этапе компиляции нуждаться только в интерфейсе. При предпроцессинге заголовочный документ просто копируется в кодификацию директивой #include “somelib.h”
Реализация должна обязательно полностью воплощать в жизнь задуманный интерфейс. Благодаря этому она будет включать тоже свой файл заголовка. Вот пример того, как проект из одного ключевого документа и «блока» будет выглядеть в редакторе:
Это – база, которую может и должен знать каждый разработчик. Программу при помощи рассмотренной концепции создать не составит никакого труда. Особенно если заранее продумать ее структуру и логику.
На что обратить внимание
Приведенный пример предусматривает следующие особенности:
- В документе «мейн.с» не нужно подключать «стдио.h». Это несмотря на то, что он применяется в hello.c.
- Данный момент связан с тем, что никакие типы из stdio не требуются для того, чтобы обрабатывать интерфейс hello.h, который оказывается в «мейне» в процессе компилирования.
- Если бы требовалось для обработки interfaces «блоков» брать определения из той или иной библиотеки, последние должны прописывается не в hello.c, а в hello.h. Данный примем обеспечивает отсутствие ошибок в тех пространствах, где подключается hello.
Это – то, что нужно помнить о модульном программировании C. Информация поможет начать более глубокое изучение концепции.
Лучшее решение для быстрого понимания темы
Для того, чтобы лучше разбираться в функциях и «изолированности кода» в СИ-семействе рекомендуется закончить специализированные онлайн курсы. Они могут быть пройдены в любое время, когда удобно пользователю.
Есть предложения для новичков в программировании, а также для опытных разработчиков. Пользователи смогут изучать функции СИ-семейства и их особенности. В процессе гарантирована масса практики, сбор портфолио и постоянное кураторство. Пользователи смогут получить по выпуску сертификат, подтверждающий знания в выбранном направлении.
Интересует разработка на C? Обратите внимание на курс «Программист C» в Otus.
Источник: otus.ru
Что такое модуль в Python? А что значит пакет?
В программировании модуль — это часть программного обеспечения, имеющая определенный функционал. Например, при создании игры в пинг-понг один модуль будет отвечать за игровую логику, а другой модуль будет отвечать за рисование игры на экране. Каждый модуль представляет собой файл, который можно редактировать отдельно.
Написание модулей
Mодули в Python — это просто файлы Python с расширением .py. Имя модуля будет именем файла. Модуль Python может иметь набор функций, классов или переменных, определенных и реализованных. В приведенном выше примере у нас будет два файла:
mygame/ mygame/game.py mygame/draw.py
Скрипт Python game.py будет реализовывать игру. Он будет использовать функцию draw_game из файла draw.py , или, другими словами, модуль draw , который реализует логику для рисования игры на экране.
Модули импортируются из других модулей с помощью команды import . В этом примере скрипт game.py может выглядеть примерно так:
# game.py # import the draw module import draw def play_game(): . def main(): result = play_game() draw.draw_game(result) #this means that if this script is executed, then main() will be executed
Модуль draw может выглядеть примерно так:
# draw.py def draw_game(): .
В этом примере модуль game импортирует модуль draw , что позволяет ему использовать функции, реализованные в этом модуле. Функция main будет использовать локальную функцию play_game для запуска игры, а затем выводить результат игры, используя функцию, реализованную в модуле draw , называемую draw_game . Чтобы использовать функцию draw_game из модуля draw , нам нужно указать, в каком модуле реализована функция, используя оператор точки. Чтобы сослаться на функцию draw_game из game модуля, нам нужно будет импортировать модуль draw и только затем вызывать draw.draw_game() .
Когда директива import draw будет запущена, интерпретатор Python будет искать файл в каталоге, из которого был выполнен скрипт, по имени модуля с префиксом .py , поэтому в нашем случае он попытается найти draw.py . Если он найдет его, то импортирует. Если нет, он продолжит искать встроенные модули.
ВВозможно, вы заметили, что при импорте модуля появляется файл .pyc, который представляет собой скомпилированный файл Python. Python компилирует файлы в байт-код Python, так что ему не придется анализировать файлы при каждой загрузке модулей. Если файл .pyc существует, он загружается вместо файла .py, но этот процесс прозрачен для пользователя.