Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по программированию.docx
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
93.1 Кб
Скачать

Итерационная модель

Модель IID предполагает разбиение жизненного цикла проекта на последовательность итераций, каждая из которых напоминает «мини-проект», включая все процессы разработки в применении к созданию меньших фрагментов функциональности, по сравнению с проектом в целом. Цель каждой итерации — получение работающей версии программной системы, включающей функциональность, определённую интегрированным содержанием всех предыдущих и текущей итерации. Результат финальной итерации содержит всю требуемую функциональность продукта. Таким образом, с завершением каждой итерации продукт получает приращение — инкремент — к его возможностям, которые, следовательно, развиваются эволюционно. Итеративность, инкрементальность и эволюционность в данном случае есть выражение одного и то же смысла разными словами со слегка разных точек зрения[3].

Спиральная модель

Спиральная модель (англ. spiral model) была разработана в середине 1980-х годов Барри Боэмом. Она основана на классическом цикле Деминга PDCA (plan-do-check-act). При использовании этой модели ПО создается в несколько итераций (витков спирали) методом прототипирования.

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

На каждой итерации оцениваются:

  • риск превышения сроков и стоимости проекта;

  • необходимость выполнения ещё одной итерации;

  • степень полноты и точности понимания требований к системе;

  • целесообразность прекращения проекта.

  1. Парадигмы программирования

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

Важно отметить, что парадигма программирования не определяется однозначно языком программирования; практически все современные языки программирования в той или иной мере допускают использование различных парадигм (мультипарадигмальное программирование). Так на языке Си, который не является объектно-ориентированным, можно работать в соответствии с принципами объектно-ориентированного программирования, хотя это и сопряжено с определёнными сложностями; функциональное программирование можно применять при работе на любом императивном языке, в котором имеются функции (для этого достаточно не применять присваивание)[источник не указан 132 дня], и т. д.

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

  1. Структуры данных. Простые(базовые структуры) представление в памяти. Статические структуры данных. Полустатические структуры данных( стеки, деки, очереди, строки).Динамические структуры данных(линейные списки, графы, деревья).

Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.

Термин «структура данных» может иметь несколько близких, но тем не менее различных значений[1]:

  • Абстрактный тип данных;

  • Реализация какого-либо абстрактного типа данных;

  • Экземпляр типа данных, например, конкретный список;

  • В контексте функционального программирования — уникальная единица (англ. unique identity), сохранящаяся при изменениях. О ней неформально говорят как об одной структуре данных, несмотря на возможное наличие различных версий.

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

Любая структура данных представляется в памяти проименованная область памяти несущая в себе идендификатор и ссылку на адрес где Хранятся данные.

Статические структуры представляют собой структурированное множество примитивных, базовых, структур. Поскольку статические структуры отличаются отсутствием изменчивости, память для них выделяется автоматически - как правило, на этапе компиляции или при выполнении - в момент активизации того программного блока, в котором они описаны. Ряд языков программирования допускают размещение статических структур в памяти на этапе выполнения по явному требованию программиста, но и в этом случае объем выделенной памяти остается неизменным до уничтожения структуры. Каждую структуру данных характеризуют её логическим и физическим представлениями. Физическое представление обычно не соответствует логическому, и кроме того, может существенно различаться в разных программных системах.

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

Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last infirst out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.

Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.

Дек (deq - double ended queue,т.е очередь с двумя концами) - особый вид очереди в виде последовательного списка, в котором как включение, так и исключение элементов может осуществляться с любого из двух концов списка. Частный случай дека - дек с ограниченным входом и дек с ограниченным выходом. Логическая и физическая структуры дека аналогичны логической и физической структуре кольцевой FIFO-очереди. Однако, применительно к деку целесообразно говорить не о начале и конце, а о левом и правом конце.

О́чередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out). Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.

С точки зрения регулярного программирования строковый тип данных string относится к числу самых важных в С#. Этот тип определяет и поддерживает символьные строки. В целом ряде других языков программирования строка представляет собой массив символов. А в С# строки являются объектами. Следовательно, тип string относится к числу ссылочных.

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

Линейный однонаправленный список — это структура данных, состоящая из элементов одного типа, связанных между собой.

В информатике линейный список обычно определяется как абстрактный тип данных (АТД), формализующий понятие упорядоченнойколлекции данных.

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

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

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

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

  1. Методы разработки структуры программ

Метод восходящей разработки

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

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

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

Недостатки метода восходящей разработки заключаются в  следующем:

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

спецификаций на верхнем уровне;

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

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

Метод нисходящей разработки

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

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

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

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

заменяются их имитаторами (так называемыми «заглушками» [45]). Каждый имитатор модуля является простым  программным фрагментом, реализующим сам факт обращения к  данному модулю с необходимой для правильной работы программы обработкой значений его входных параметров и с выдачей, если это необходимо, подходящего результата. Далее производится

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

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

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

используемых в программе модулей.

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

Конструктивный подход

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

Архитектурный подход

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

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

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

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

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

 

  1. Модульное программирование. Характеристики модуля.

(связность, сцепление, сложность)

Модульное программирование основано на понятии модуля - логически взаимосвязанной совокупности функциональных элементов, оформленных в виде отдельных программных модулей.

Модуль характеризуют:

  1. один вход и один выход - на входе программный модуль получает определенный набор исходных данных, выполняет содержательную обработку и возвращает один набор результатных данных, т.е. реализуется стандартный принцип IPO (Input - Process - Output) - вход-процесс-выход;

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

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

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

  5. обозримый по размеру и сложности программный элемент.

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

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

  1. Структурные методы анализа и проектирования

Структурный системный анализ – анализ программных систем, основанный на принципах и идеях структурной методологии.

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

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

Нисходящее проектирование применимо к проектированию систем, программ, отдельного модуля, а также к проектированию структур данных.

Цель нисходящего проектирования:

  • систематизировать процесс проектирования;

  • создать модульный проект программы;

  • дать структуру для эффективного решения проблемы.

Структурное проектирование – состоит в детализации метода нисходящего проектирования.

  • Процесс декомпозиции в структурном проектировании основан на потоках данных в системе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]