Модульное программирование. Интеллектуальная собственность
Челябинский юридический колледж
Кафедра математических и естественнонаучных дисциплин
КУРСОВАЯ РАБОТА
по
дисциплине «Теория разработки программных
продуктов»
Модульное
программирование. Интеллектуальная
собственность
| Студент
гр. ПО-1-07, отделение права и |
Николаев И.А |
| Руководитель | Кравчук Н.В |
Челябинск
2010
Содержание
Введение…………………………………………………………
1. Модульное программирование
1.1. Общее положение………………………………………
1.2. Цель и характеристики………………………………………
1.3. Методы модульного программирования……………………..
1.4. Контроль
структуры модульной программы…
2. Интеллектуальная
собственность……………………………………………
2.1. Общее положение………………………………………………………
2.2. Патент, правовые
аспекты…......................
2.3. Интеллектуальная
собственность в software………………
3. Практическая часть. Программа «электронный Дневник»
3.1. Описание
3.2. Разработка и руководство
3.3. Заключение по практической части.
Заключение……………………………………………………
Список литературы…………………………………
Введение
Целью данной курсовой работы является рассмотрение двух вопросов касающихся технологии разработки программных продуктов:
- Модульное программирование
- Интеллектуальная собственность
Первая часть курсовой работы рассматривает некоторые типы модульного программирования, его структуру и типы
Вторая часть освещает юридические
аспекты права собственности
на программные продукты, патенты
и понятие интеллектуальной собственности
в целом.
Третья часть рассматривает выбранный мною продукт «Электронный дневник». Эта программа предназначена для занесения ведения личных записей посредством ПК.
- Модульное программирование
- Общее положение
В
основе того или иного языка
Модульное
программирование. Основная идея
заключается в том, чтобы "спрятать"
данные и процедуры внутри независимых
программных единиц - модулей.
Эту идею впервые реализовал Н. Вирт в
алгоритмическом языке Modula (1975-1979 годы),
а затем "подхватили" и остальные,
распространенные в то время языки программирования.
Например, известные системы программирования
Turbo Pascal и Turbo С.
Необходимо указать ещё 2 ступени развития
модульного программирования:
Объектно-ориентированное программирование. Вскоре, необходимо было сделать не случайное объединение данных и алгоритмов их обработки в единое целое, а - смысловое. То есть необходимо было создать модульное программирование нового уровня, когда основной акцент делается на смысловую связь структур данных и алгоритмов их обработки. Сейчас практически все основные языки программирования (их более 100, в том числе такие распространенные, как Object Pascal, C++, Smalltalk) базируются на этой идее, а предком их является язык Simula, созданный еще в 1960 году.
Обобщенные
технологии разработки
приложений. Идеология объектно-ориентированного
программирования породила CASE-технологии
разработки и сборки программ на основе
уже известных программных моделей, содержащих
интерфейсы и прототипы (шаблоны
— template) данных: COM (Component Object Model), STL (Standard
Template Library), ATL (Active Template Library). Все эти новшества
поддерживают визуальные
среды разработки, например, такие известные,
как Visual C++, Borland C++ Builder, Borland Delphi.
Теперь
подробно рассмотрим технологию модульного
программирования.
1.2.
Цель и характеристики.
Приступая к разработке каждой программы, следует иметь в виду, что она, как правило, является большой системой, поэтому надо принять меры для ее упрощения. Для этого такую программу разрабатывают по частям, которые называются программными модулями. А сам такой метод разработки программ называют модульным программированием.
Программный
модуль - это любой фрагмент описания
процесса, оформляемый как
Таким образом, программный модуль может рассматриваться и как средство борьбы со сложностью программ, и как средство борьбы с дублированием в программировании (т.е. как средство накопления и многократного использования программистских знаний).
Модульное программирование является воплощением в процессе разработки программ обоих общих методов борьбы со сложностью: и обеспечение независимости компонент системы и использование иерархических структур.
Для
воплощения первого метода формулируются
определенные требования, которым должен
удовлетворять программный
Для
воплощения второго метода используют
древовидные модульные
Характеристики модуля:
- размер модуля;
- прочность модуля;
- сцепление с другими модулями;
- рутинность модуля (независимость от предыстории обращений к нему).
Размер модуля измеряется числом содержащихся в нем операторов или строк. Модуль не должен быть слишком маленьким или слишком большим. Маленькие модули приводят к громоздкой модульной структуре программы и могут не окупать накладных расходов, связанных с их оформлением. Большие модули неудобны для изучения и изменений, они могут существенно увеличить суммарное время повторных трансляций программы при отладке программы. Обычно рекомендуются программные модули размером от нескольких десятков до нескольких сотен операторов.
Прочность модуля - это мера его внутренних связей. Чем выше прочность модуля, тем больше связей он может спрятать от внешней по отношению к нему части программы и, следовательно, тем больший вклад в упрощение программы он может внести.
Самой слабой степенью прочности обладает модуль, прочный по совпадению. Это такой модуль, между элементами которого нет осмысленных связей. Такой модуль может быть выделен, например, при обнаружении в разных местах программы повторения одной и той же последовательности операторов, которая и оформляется в отдельный модуль. Необходимость изменения этой последовательности в одном из контекстов может привести к изменению этого модуля, что может сделать его использование в других контекстах ошибочным. Такой класс программных модулей не рекомендуется для использования. Вообще говоря, предложенная Майерсом упорядоченность по степени прочности классов модулей не бесспорна. Однако, это не очень существенно, так как только два высших по прочности класса модулей рекомендуются для использования. Эти классы я рассмотрю подробнее.
Функционально прочный модуль - это модуль, выполняющий (реализующий) одну какую-либо определенную функцию. При реализации этой функции такой модуль может использовать и другие модули. Такой класс программных модулей рекомендуется для использования.
Информационно
прочный модуль - это модуль, выполняющий
(реализующий) несколько операций (функций)
над одной и той же структурой данных (информационным
объектом), которая считается неизвестной
вне этого модуля. Для каждой из этих операций
в таком модуле имеется свой вход со своей
формой обращения к нему. Такой класс следует
рассматривать как класс программных
модулей с высшей степенью прочности.
Информационно прочный модуль может реализовывать,
например, абстрактный тип данных.
Сцепление модуля - это мера его зависимости по данным от других модулей. Характеризуется способом передачи данных. Чем слабее сцепление модуля с другими модулями, тем сильнее его независимость от других модулей. Для оценки степени сцепления был. предложен упорядоченный набор из шести видов сцепления модулей.
Худшим
видом сцепления модулей
Не рекомендуется использовать также сцепление по общей области - это такое сцепление модулей, когда несколько модулей используют одну и ту же область памяти.
Единственным
видом сцепления модулей, который
рекомендуется для
Рутинность
модуля - это его независимость от
предыстории обращений к нему. Модуль
называется рутинным, если результат
(эффект) обращения к нему зависит только
от значений его параметров (и не зависит
от предыстории обращений к нему). Модуль
называется зависящим
от предыстории, если результат (эффект)
обращения к нему зависит от внутреннего
состояния этого модуля, изменяемого в
результате предыдущих обращений к нему.
Не рекомендуется использовать зависящие
от предыстории (непредсказуемые) модули,
так как они провоцируют появление в программах
хитрых (неуловимых) ошибок. Поэтому более
приемлема следующая (более осторожная)
рекомендация:
- всегда следует использовать рутинный модуль, если это не приводит к плохим (не рекомендуемым) сцеплениям модулей;
- зависящие от предыстории модули следует использовать только в случае, когда это необходимо для обеспечения параметрического сцепления;
- в спецификации зависящего от предыстории модуля должна быть четко сформулирована эта зависимость таким образом, чтобы было возможно прогнозировать поведение (эффект выполнения) данного модуля при разных последующих обращениях к нему.
В
связи с последней
1.3 Методы модульного программирования
В качестве модульной структуры программы принято использовать древовидную структуру, включая деревья со сросшимися ветвями. В узлах такого дерева размещаются программные модули, а направленные дуги (стрелки) показывают статическую подчиненность модулей, т.е. каждая дуга показывает, что в тексте модуля, из которого она исходит, имеется ссылка на модуль, в который она входит. Другими словами, каждый модуль может обращаться к подчиненным ему модулям, т.е. выражается через эти модули. При этом модульная структура программы, в конечном счете, должна включать и совокупность спецификаций модулей, образующих эту программу. Спецификация программного модуля содержит:
- синтаксическую спецификацию его входов, позволяющую построить на используемом языке программирования синтаксически правильное обращение к нему (к любому его входу);
- функциональную спецификацию модуля (описание семантики функций, выполняемых этим модулем по каждому из его входов).
В
процессе разработки программы ее модульная
структура может по-разному
4.1. Метод восходящей разработки
Данный метод заключается в следующем. Сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модулей самого нижнего уровня (листья дерева модульной структуры программы), в таком порядке, чтобы для каждого программируемого модуля были уже запрограммированы все модули, к которым он может обращаться. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в принципе в таком же (восходящем) порядке, в каком велось их программирование. Такой порядок разработки программы на первый взгляд кажется вполне естественным: каждый модуль при программировании выражается через уже запрограммированные непосредственно подчиненные модули, а при тестировании использует уже отлаженные модули. Однако, современная технология не рекомендует такой порядок разработки программы. Во-первых, для программирования какого-либо модуля совсем не требуется наличия текстов используемых им модулей - для этого достаточно, чтобы каждый используемый модуль был лишь специфицирован (в объеме, позволяющем построить правильное обращение к нему), а для тестирования его возможно (и даже, как мы покажем ниже, полезно) используемые модули заменять их имитаторами (заглушками). Во-вторых, каждая программа в какой-то степени подчиняется некоторым внутренним для нее, но глобальным для ее модулей соображениям (принципам реализации, предположениям, структурам данных и т.п.), что определяет ее концептуальную целостность и формируется в процессе ее разработки. При восходящей разработке эта глобальная информация для модулей нижних уровней еще не ясна в полном объеме, поэтому очень часто приходится их перепрограммировать, когда при программировании других модулей производится существенное уточнение этой глобальной информации (например, изменяется глобальная структура данных). В-третьих, при восходящем тестировании для каждого модуля (кроме головного) приходится создавать ведущую программу (модуль), которая должна подготовить для тестируемого модуля необходимое состояние информационной среды и произвести требуемое обращение к нему. Это приводит к большому объему «отладочного» программирования и в то же время не дает никакой гарантии, что тестирование модулей производилось именно в тех условиях, в которых они будут выполняться в рабочей программе.
4.2. Метод нисходящей разработки
Метод нисходящей разработки заключается в следующем. Как и в предыдущем методе сначала строится модульная структура программы в виде дерева. Затем поочередно программируются модули программы, начиная с модуля самого верхнего уровня (головного), переходя к программированию какого-либо другого модуля только в том случае, если уже запрограммирован модуль, который к нему обращается. После того, как все модули программы запрограммированы, производится их поочередное тестирование и отладка в таком же (нисходящем) порядке. При этом первым тестируется головной модуль программы, который представляет всю тестируемую программу и поэтому тестируется при «естественном» состоянии информационной среды, при котором начинает выполняться эта программа. При этом те модули, к которым может обращаться головной, заменяются их имитаторами (так называемыми заглушками). Каждый имитатор модуля представляется весьма простым программным фрагментом, который, в основном, сигнализирует о самом факте обращения к имитируемому модулю, производит необходимую для правильной работы программы обработку значений его входных параметров (иногда с их распечаткой) и выдает, если это необходимо, заранее запасенный подходящий результат. После завершения тестирования и отладки головного и любого последующего модуля производится переход к тестированию одного из модулей, которые в данный момент представлены имитаторами, если таковые имеются. Для этого имитатор выбранного для тестирования модуля заменяется самим этим модулем и, кроме того, добавляются имитаторы тех модулей, к которым может обращаться выбранный для тестирования модуль. При этом каждый такой модуль будет тестироваться при «естественных» состояниях информационной среды, возникающих к моменту обращения к этому модулю при выполнении тестируемой программы. Таким образом, большой объем «отладочного» программирования при восходящем тестировании заменяется программированием достаточно простых имитаторов используемых в программе модулей. Кроме того, имитаторы удобно использовать для того, чтобы подыгрывать процессу подбора тестов путем задания нужных результатов, выдаваемых имитаторами. При таком порядке разработки программы вся необходимая глобальная информация формируется своевременно, т.е. ликвидируется весьма неприятный источник просчетов при программировании модулей. Некоторым недостатком нисходящей разработки, приводящим к определенным затруднениям при ее применении, является необходимость абстрагироваться от базовых возможностей используемого языка программирования, выдумывая абстрактные операции, которые позже нужно будет реализовать с помощью выделенных в программе модулей. Однако способность к таким абстракциям представляется необходимым условием разработки больших программных средств, поэтому ее нужно развивать.
4.3. Конструктивный и архитектурный подходы
Особенностью
рассмотренных методов
Конструктивный подход к разработке программы представляет собой модификацию нисходящей разработки, при которой модульная древовидная структура программы формируется в процессе программирования модулей. Разработка программы при конструктивном подходе начинается с программирования головного модуля, исходя из спецификации программы в целом. При этом спецификация программы принимается в качестве спецификации ее головного модуля, который полностью берет на себя ответственность за выполнение функций программы. В процессе программирования головного модуля, в случае, если эта программа достаточно большая, выделяются подзадачи (внутренние функции), в терминах которых программируется головной модуль. Это означает, что для каждой выделяемой подзадачи (функции) создается спецификация реализующего ее фрагмента программы, который в дальнейшем может быть представлен некоторым поддеревом модулей. Важно заметить, что здесь также ответственность за выполнение выделенной функции несет головной (может быть, и единственный) модуль этого поддерева, так что спецификация выделенной функции является одновременно и спецификацией головного модуля этого поддерева. В головном модуле программы для обращения к выделенной функции строится обращение к головному модулю указанного поддерева в соответствии с созданной его спецификацией. Таким образом, на первом шаге разработки программы (при программировании ее головного модуля) формируется верхняя начальная часть дерева, например, такая, которая показана на рис. 1.
Аналогичные действия производятся при программировании любого другого модуля, который выбирается из текущего состояния дерева программы из числа специфицированных, но пока еще не запрограммированных модулей. В результате этого производится очередное деформирование дерева программы.
Рисунок 1
Архитектурный подход к разработке программы представляет собой модификацию восходящей разработки, при которой модульная структура программы формируется в процессе программирования модуля. Но при этом ставится существенно другая цель разработки: повышение уровня используемого языка программирования, а не разработка конкретной программы. Это означает, что для заданной предметной области выделяются типичные функции, каждая из которых может использоваться при решении разных задач в этой области, и специфицируются, а затем и программируются отдельные программные модули, выполняющие эти функции. Так как процесс выделения таких функций связан с накоплением и обобщением опыта решения задач в заданной предметной области, то обычно сначала выделяются и реализуются отдельными модулями более простые функции, а затем постепенно появляются модули, использующие ранее выделенные функции. Такой набор модулей создается в расчете на то, что при разработке той или иной программы заданной предметной области в рамках конструктивного подхода могут оказаться приемлемыми некоторые из этих модулей. Это позволяет существенно сократить трудозатраты на разработку конкретной программы путем подключения к ней заранее заготовленных и проверенных на практике модульных структур нижнего уровня. Так как такие структуры могут многократно использоваться в разных конкретных программах, то архитектурный подход может рассматриваться как путь борьбы с дублированием в программировании. В связи с этим программные модули, создаваемые в рамках архитектурного подхода, обычно параметризуются для того, чтобы усилить применимость таких модулей путем настройки их на параметры.
4.4. Другие методы разработки структуры модульных программ и их общая классификация
В
классическом методе нисходящей разработки
рекомендуется сначала все
Все эти методы имеют еще различные разновидности в зависимости от того, в какой последовательности обходятся узлы (модули) древовидной структуры программы в процессе ее разработки. Это можно делать, например, по слоям (разрабатывая все модули одного уровня, прежде чем переходить к следующему уровню). При нисходящей разработке дерево можно обходить также в лексикографическом порядке (сверху вниз, слева направо). Возможны и другие варианты обхода дерева.. Сущность такого обхода заключается в следующем. В рамках конструктивного подхода сначала реализуются только те модули, которые необходимы для самого простейшего варианта программы, которая может нормально выполняться только для весьма ограниченного множества наборов входных данных, но для таких данных эта задача будет решаться до конца. Вместо других модулей, на которые в такой программе имеются ссылки, в эту программу вставляются лишь их имитаторы, обеспечивающие, в основном, сигнализацию о выходе за пределы этого частного случая. Затем к этой программе добавляются реализации некоторых других модулей (в частности, вместо некоторых из имеющихся имитаторов), обеспечивающих нормальное выполнение для некоторых других наборов входных данных. И этот процесс продолжается поэтапно до полной реализации требуемой программы. Таким образом, обход дерева программы производится с целью кратчайшим путем реализовать тот или иной вариант (сначала самый простейший) нормально действующей программы. В связи с этим такая разновидность конструктивной реализации получила название метода целенаправленной конструктивной реализации. Достоинством этого метода является то, что уже на достаточно ранней стадии создается работающий вариант разрабатываемой программы. Психологически это играет роль допинга, резко повышающего эффективность разработчика. Поэтому этот метод является весьма привлекательным.
Подводя итог сказанному, на рис. 2 представлена общая классификация рассмотренных методов разработки структуры программы.
Рисунок
2
1.4. Контроль структуры модульной программы
В завершении процесса модульного программирования следует этап контроля структуры программы. Для этого можно использовать три метода :
- статический контроль
- смежный контроль
- сквозной контроль
Статический контроль состоит в оценке структуры программы, насколько хорошо программа разбита на модули с учетом значений рассмотренных выше основных характеристик модуля.

- Модульное программирование на примере сортировки последовательностей
- Модульно обучение на уроках спецтехнологии
- Модульно-рейтингове навчання в школі
- Модульные учебные программы и принципы их построения
- Модульный подход в обучающем консультировании
- Модульный принцип организации производства: достоинства и недостатки
- Модульный принцип педагогического процесса в дошкольном образовательном учреждении
- Модульная технология обучения
- Модульное обучение
- Модульное обучение в школе
- Модульное программирование
- Модульное программирование
- Модульное программирование
- Модульное программирование