Технологичность программных продуктов стиль оформления программы правила оформления модулей

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

Стиль оформления программы включает:

— правила именования объектов программы (переменных, функций, типов данных и т.п.);

— правила оформления модулей;

— стиль оформления текстов модулей.

Правила именования объектов программы. При выборе имен программных объектов следует придерживаться следующих принципов:

o имя объекта должно соответствовать его содержанию, например,MaxItem – максимальный элемент, NextItem – следующий элемент,Sum – сумма;

o если позволяет язык программирования, можно использовать символ подчеркивания для визуального разделения имен, состоящих из нескольких слов, например, Max _ Item, Next ­­_ Item;

o следует избегать близких по написанию имен, например, Index иInDec.

Правила оформления модулей. Каждый модуль должен иметь имя (заголовок), которое, как минимум, содержит:

Оформление электронной модели изделия по ГОСТ 2.052-2015. Инженерная практика, часть 20

o название модуля;

o краткое описание его назначения;

o краткое описание входных и выходных параметров с указанием единиц измерения;

o список используемых (вызываемых) модулей;

o краткое описание алгоритма (метода) и/или ограничений;

o ФИО автора программы;

o идентифицирующую информацию (номер версии и/или дату последней корректировки).

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

Для таких языков, как Pascal, C++ и Java, использование отступов позволяет прояснить структуру программы: обычно дополнительный отступ обозначает вложение операторов языка. Пример:

if a[i, j]> amax then amax:=a[i, j];

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

Pascal является одним из самых распространенных в мире АЯ высокого уровня. Основы языка разработаны Никлаусом Виртом (Швейцария) в 1971 г. (Язык назван в честь французского математика и философа Блеза Паскаля.) В настоящее время Object Pascal составляет основу среды объектного визуального программирования и проектирования Delphi, с помощью которой разрабатывается значительная часть ПО во всем мире.

Разработчик среды фирма BorlandSoftware Corporation. Последние версии этого языка по своим возможностям приближаются к C ++. В то же время Pascal имеет более простой и ясный синтаксис и в отличие от языка C является строго типизированным языком. Это позволяет минимизировать число ошибок и повысить скорость разработки приложений.

Object Pascal – полноценный ООЯзык, поддерживающий все основные концепции ООП: инкапсуляцию, наследование и полиморфизм. В отличие от C ++ в Object Pascal не поддерживается множественное наследование. Хотя Object Pascal можно считать более простым, чем C ++, тем не менее, для его эффективного использования требуется относительно высокая квалификация программиста.

Встраиваем экспертную систему в программу на С // Демо-занятие курса «Программист С»

Система визуального программирования Delphi позволяет в полной мере реализовать современные концепции программирования, включая ОО Подход, визуальные средства RAD, основанные на компонентной архитектуре, использование компиляции, возможность работы с БД универсальными методами.

Используемый в Delphi язык Object Pascal является ОО и обладает встроенной обработкой исключительных ситуаций. Компонентная архитектура Delphi является прямым развитием поддерживаемой объектной модели. Все компоненты являются объектными типами (классами), обладающими возможностью неограниченного наследования.

Интегрированная среда разработки Delphi включает в себя четыре основные части: главное окно, инспектор объектов, редактор форм и редактор кода.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

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

Понятие технологичности программного обеспечения.

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

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

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

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

Стиль программирования, под которым понимают стиль оформления программ и их «структурность», также существенно влияет на читаемость программного кода и количество ошибок программирования.

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

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

Модули и их свойства.

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

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

· процедурный (или структурный — по названию подхода);

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

Читайте также:
Установка а0 сметной программы

Результатом объектной декомпозиции явл-я совок-ть объектов, кот затем реализуют как переменные некоторых специально разрабатываемых типов (классов), представляющих собой совокупность полей данных и методов, работающих с этими полями.

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

Модули. Модуль- автономно компилируемая прог-я единица. «модуль»: 1) когда размер программ был сравнительно невелик, и все подпрограммы компилировались отдельно, модцль — подпрограмма, т.е. последовательность связанных фрагментов программы, обращение к которой выполняется по имени. 2), когда размер программ значительно вырос, появилась возможность создавать библиотеки ресурсов: констант, переменных, описаний типов, классов и подпрограмм, «модуль» — автономно компилируемый набор программных ресурсов.

Данные модуль может получать и/или возвращать через общие области памяти или параметры.

Первоначально к модулям (подпрограммы) предъявлялись следующие требования:

-отдельная компиляция; -одна точка входа; -одна точка выхода;

-соответствие принципу вертикального управления;

-возможность вызова других модулей;

-небольшой размер (до 50-60 операторов языка);

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

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

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

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

· меньше вероятность появления новых ошибок при исправлении старых или внесении изменений в программу, т. е. вероятность появления «волнового» эффекта;

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

=> уменьшение зависимости модулей улучшает технологичность проекта. Степень независимости модулей (как подпрограмм, так и библиотек) оценивают двумя критериями: сцеплением и связностью.

Сцепление модулей.

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

пять типов сцепления модулей: 1по данным; 2по образцу; 3по управлению;

4по общей области данных; 5по содержимому.

Сцепление по данным — модули обмениваются данными, представленными скалярными значениями. При небольшом кол-ве передаваемых пар-ов этот тип обеспечивает наилучшие технологические характеристики ПО.

Например, функция Мах предполагает сцепление по данным через параметры скалярного типа:

Function Max(a, b: integer):integer;

if a>b then Max:=a else Max: =b;

Сцепление по образцу — модули обмениваются данными, объединенными в структуры. обеспечивает неплохие хар-ки, но они хуже, чем у предыдущего типа, тк конкретные передаваемые данные «спрятаны» в структуры, и потому уменьшается «прозрачность» связи м/у модулями. Кроме того, при изменении структуры передаваемых данных необходимо модифицировать все использующие ее модули.

Так, функция MaxEl,предполагает сцепление по образцу (параметр а – открытый массив).

Function МахEl(а:array of integer):integer;

Begin MaxEl: =a[0]; for i:=l to High(a) do if a[i]>MaxEl

then MaxEl: =a[i]; end;

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

Например, функция MinMax предполагает сцепление по управлению, тк значение параметра flag влияет на логику программы: if функция MinMax получает значение пар-ра flag, = true, то возвращает максимальное значение из двух, а если false, то минимальное:

Function MinMax(a, b:integer; flag:boolean):integer;

if (a>b) and (flag) then MinMax: =a

else MinMax: =b; end;

Сцепление по общей области данных — модули работают с общей областью данных. Этот тип считается недопустимым, тк:

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

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

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

Например, функция МахА, использующая глобальный массив А, сцеплена с основной программой по общей области:

Function MaxA:integer;

Begin МахА: =a[Low(a)];

for i:= Low(a)+1 to High(a) do

if a[i]>MaxA then MaxA:=a[i]; end;

«подпрограммы с памятью», действия которых зависят от истории вызовов, используют сцепление по общей области, что делает их работу в общем случае непредсказуемой. Именно этот вар-т исп-т стат-ие переменные С и C++.

В случае сцепления по содержимому один модуль содержит обращения к внутренним компонентам другого (передает управление внутрь, читает и/или изменяет внутренние данные или сами коды), что полностью противоречит блочно-иерархическому подходу. Отдельный модуль в этом случае уже не является блоком («черным ящиком»): его содержимое должно учитываться в процессе разработки другого модуля. Современные универсальные языки (Pascal), данного типа сцепления в явном виде не поддерживают, но для языков низкого уровня, (Ассемблер), такой вид сцепления остается возможным.

Читайте также:
В какой программе удобнее всего рисовать блок схемы

модули сцепляются м/у собой нес-ми способами. => кач-во ПО принято определять по типу сцепления с худшими характеристиками.

Связность модулей.

Связность –мера прочности соединения функциональных и информационных объектов внутри одного модуля. виды связности (в порядке убывания уровня):

При функциональной связности все объекты модуля пред-ны для выполнения одной функции (рис.а): операции, объединяемые для выполнения одной функции, или данные, связанные с одной функцией. Модуль, элементы кот связаны функц-о, имеет четко определенную цель, при его вызове выполняется одна задача(подпрограмма поиска минимального элемента массива). Такой модуль имеет макс связность, => хорошие технологические кач-ва: простота тестирования, модификации и сопровождения. Именно с этим связано одно из требований структурной декомпозиции «один модуль – одна функция».

При последовательной связности функций выход одной функции служит исходными данными для другой функции (рис. 2.1, б)., такой модуль имеет одну точку входа, т.е. реализует одну подпрограмму, выполняющую две функции. данные, используемые послед-ми ф-ми, также связаны последовательно. Модуль с последовательной связностью функций можно разбить на два или более модулей, как с последовательной, так и с функциональной связностью. Такой модуль выполняет нес-ко ф-ий, =>, его технологичность хуже: сложнее организовать тестирование, при выполнении модификации мысленно приходится разделять функции модуля.

Информационно связанными считают функции, обрабатывающие одни и те же данные (рис. 2.1, в). При использовании структурных языков программирования раздельное выполнение функций можно осуществить только, если каждая функция реализуется своей подпрограммой. Несмотря на объединение неск-их ф-ий, информационно связанный модуль имеет неплохие показатели технологичности.

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

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

Временная связность — функции выполняются // или в течение некоторого периода времени (рис. 2.1, д). Временная связность данных означает, что они используются в некотором временном интервале( вр-ю связность имеют фу-и, выполняемые при инициализации некоторого процесса). Отличие: действия, реализуемые такими функциями, обычно могут выполняться в любом порядке.

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

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

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

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

Дата добавления: 2018-02-15 ; просмотров: 2647 ; Мы поможем в написании вашей работы!

Источник: studopedia.net

2.5. Стиль оформления программы

С точки зрения технологичности хорошим считают стиль оформления программы, облегчающий ее восприятие как самим автором, так и другими программистами, которым, возможно, придется ее проверять или модифицировать. «Помните, программы читаются людьми», призывал Д. Ван Тассел, автор одной из известных монографий, посвященной проблемам программирования [60]. Именно исходя из того, что любую программу неоднократно придется просматривать, следует придерживаться хорошего стиля написания программ.

Стиль оформления программы включает: • правила именования объектов программы (переменных, функций, типов, данных и т. п.); • правила оформления модулей; • стиль оформления текстов модулей. Правила именования объектов программы. При выборе имен программных объектов следует придерживаться следующих правил: • имя объекта должно соответствовать его содержанию, например: MaxItem — максимальный элемент; NextItem — следующий элемент; • если позволяет язык программирования, можно использовать символ «_» для визуального разделения имен, состоящих из нескольких слов, например: Max_Item, Next_Itetm; необходимо избегать близких по написанию имен, например: Index и InDec. Правила оформления модулей. Каждый модуль должен предваряться заголовком, который, как минимум, содержит: • название модуля; • краткое описание его назначения; • краткое описание входных и выходных параметров с указанием единиц измерения; • список используемых (вызываемых) модулей; • краткое описание алгоритма (метода) и/или ограничений; • ФИО автора программы; • идентифицирующую информацию (номер версии и/или дату последней корректировки). Например:

Стиль оформления текстов модулей. Стиль оформления текстов модулей определяет использование отступов, пропусков строк и комментариев, облегчающих понимание программы. Как правило, пропуски строк и комментарии используют для визуального разделения частей модуля, например: <проверка количества отрезков и выход, если отрезки не заданы>ifn S: = 0; for i: = 0 to n-l do S: = S + Len [i]; Для таких языков, как Pascal, C++ и Java, использование отступов позволяет прояснить структуру программы: обычно дополнительный отступ обозначает вложение операторов языка, например: аmах: = а[1,1]; for i: = l to n do for j: = l to т do ifa[i,j]>amax then amax: = a [i,j]; Несколько сложнее дело обстоит с комментариями. Опыт показывает, что переводить с английского языка каждый оператор программы не нужно: любой программист, знающий язык программирования, на котором написана программа, без труда прочитает тот или иной оператор. Комментировать следует цели выполнения тех или иных действий, а также группы операторов, связанные общим действием, т. е. комментарии должны содержать некоторую дополнительную (неочевидную) информацию, например: <проверка условия и выход, если условие не выполняется>ifn

Читайте также:
Где найти программу паскаль
mov AX, 0 ; обнуляем сумму mov CX, п ; загружаем счетчик цикла mov BX, 0 ; смещение первого элемента массива

; тело цикла

cycle: add AX, a [BX] ; добавляем элемент
add BX, 2 ; определяем адрес следующего
loop cycle ; цикл на n повторений

; выход из цикла при обнулении счетчика

2.6. Эффективность и технологичность

Традиционно эффективными считают программы, требующие минимального времени выполнения и/или минимального объема оперативной памяти. Особые требования к эффективности программного обеспечения предъявляют при наличии ограничений (на время реакции системы, на объем оперативной памяти и т. п.).

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

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

И тем более не следует «платить» за увеличение эффективности снижением технологичности разрабатываемого программного обеспечения. Исключения возможны лишь при очень жестких требованиях и наличии соответствующего контроля за качеством. Частично проблему эффективности программ решают за программиста компиляторы.

Средства оптимизации, используемые компиляторами, делят на две группы: • машинно-зависимые , т. е. ориентированные на конкретный машинный язык, выполняют оптимизацию кодов на уровне машинных команд, например, исключение лишних пересылок, использование более эффективных команд и т. п.; • машинно-независимые выполняют оптимизацию на уровне входного языка, например, вынесение вычислений константных (независящих от индекса цикла) выражений из циклов и т. п. Естественно, нельзя вмешаться в работу компилятора, но существует много возможностей оптимизации программы на уровне команд. Способы экономии памяти.

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

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

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

Избежать копирования иногда удается, если передавать данные «по ссылке», но как неизменяемые (описанные const). В последнем случае в стеке размещается только адрес данных, например: Type Mas.4iv = array [I.. 100] of real; function Summa (Const a:Massiv; . ). Способы уменьшения времени выполнения. Как уже упоминалось выше, для уменьшения времени выполнения в первую очередь необходимо анализировать циклические участки программы с большим количеством повторений. При их написании необходимо по возможности: • выносить вычисление константных, т. е. не зависящих от параметров цикла, выражений из

циклов; • избегать «длинных» операций умножения и деления, заменяя их сложением, вычитанием и сдвигами; • минимизировать преобразования типов в выражениях; • оптимизировать запись условных выражений — исключать лишние проверки; • исключать многократные обращения к элементам массивов по индексам (особенно многомерных, так как при вычислении адреса элемента используются операции умножения на значение индексов) — первый раз прочитав из памяти элемент массива, следует запомнить его в скалярной переменной и использовать в нужных местах; • избегать использования различных типов в выражении и т. п. Рассмотрим следующие примеры. Пример 2.2. Пусть имеется цикл следующей структуры (Pascal): for y: = 0 to 99 do for x: = 0 to 99 do a [320*x+y]: = S [k,l]; В этом цикле операции умножения и обращения к элементу S[k] выполняются 10000 раз. Оптимизируем цикл, используя, что 320 = 2 8 + 2 6 :

skl: =S [k,l];
for x: = 0 to 99 do (меняем циклы местами>
begin

i:= x shl 8 + x shl 6; for y; = 0 to 99 do a [i+y]: =skl; end; . В результате вместо 10000 операций умножения будут выполняться 200 операций сдвига, а их время приблизительно сравнимо со временем выполнения операции сложения. Обращение к элементу массива S[k] будет выполнено один раз. Пример 2.3.

Пусть имеется цикл, в теле которого реализовано сложное условие: for k: = 2 to n do begin ifx[k] > yk then S: = S+y[k]-x [k]; if (x [k]< = yk) and (y[k]yk then S:=S+y[k]-x[k] else ify[k]

Источник: studfile.net

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