Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы и ответы к экзамену.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1.25 Mб
Скачать

Принципы эффективных алгоритмов.

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

  • «разделяй и властвуй»;

  • последовательных приближений;

  • наискорейшего спуска;

  • обратного прохода;

  • динамического программирования;

  • поиска с возвратом;

  • выделения подцелей;

  • моделирования;

  • «жадных» алгоритмов и др.

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

Правила оформления текстов программ.

Одним из важнейших факторов, влияющих на способность программы к развитию, является ее понимаемость. Одним из существенных факторов понимаемости программы, в свою очередь, является информативность исходного текста. Если исходный текст не является хорошо читаемым, то есть написан без соблюдения определенного стиля и системы и представляет собой "мешанину" операторов и знаков препинания, то вносить изменения в него очень сложно даже автору. Такая программа, безусловно, не является информативной. Сложности модификации значительно возрастают по прошествии времени и при необходимости работать с чужой программой. Рассмотрим ряд требований и рекомендаций, позволяющих выработать хороший стиль оформления программ, повышающий ее информативность. Изложение будем вести на примере языка C/C++, хотя все, сказанное ниже, относится к любому алгоритмическому языку.

Количество операторов в строке

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

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

Отступы

Правильное использование отступов являются ключевым методом обеспечения читаемости. Идея состоит в том, что отступы зрительно показывают подчиненность (иерархию) операторов. При этом директивы препроцессора (#include, #define и т.д.), описания классов, структур, типов, глобальных данных и определения функций всегда имеют наивысший приоритет, то есть начинаются с крайней левой позиции

Операторные скобки

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

Пробелы

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

Пустые строки

Использование пустых строк является важным средством для выделения участков программы. При этом имеет смысл отделять:

  • определения переменных

  • последовательности однотипных инструкций или директив

  • функции

  • любые логически завершенные блоки кода

Имена

Типичной ошибкой начинающих является стремление давать всем переменным неосмысленные однобуквенные имена, например m, n, a, s, p и т.п. Это глубоко порочная практика, поскольку при этом теряется сам смысл понятия имя. Однобуквенные имена принято давать только индексам. Исключением являются случаи, когда количество переменных в процедуре очень мало (порядка 1-3 переменных), и смысл их хорошо понятен из контекста или комментариев.

Комментарии

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

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

Архитектура ПО — определение, виды.

Архитектура программного обеспечения (англ. software architecture) — совокупность важнейших решений об организации программной системы. Архитектура включает:

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

  • соединение выбранных элементов структуры и поведения во всё более крупные системы;

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

Архитектура ПО обычно содержит несколько видов, которые аналогичны различным типам чертежей в строительстве зданий. В онтологии, установленной ANSI / IEEE 1471—2000, виды являются экземплярами точки зрения, где точка зрения существует для описания архитектуры с точки зрения заданного множества заинтересованных лиц.

Архитектурный вид состоит из 2 компонентов:

  • Элементы

  • Отношения между элементами

Архитектурные виды можно поделить на 3 основных типа:

  • Модульные виды (англ. module views) — показывают систему как структуру из различных программных блоков.

  • Компоненты-и-коннекторы (англ. component-and-connector views) — показывают систему как структуру из параллельно запущенных элементов (компонентов) и способов их взаимодействия (коннекторов).

  • Размещение (англ. allocation views) — показывает размещение элементов системы во внешних средах.

Примеры модульных видов:

  • Декомпозиция (англ. decomposition view) — состоит из модулей в контексте отношения «является подмодулем»

  • Использование (англ. uses view) — состоит из модулей в контексте отношения «использует» (т.е. один модуль использует сервисы другого модуля)

  • Вид уровней (англ. layered view) — показывает структуру, в которой связанные по функциональности модули объединены в группы (уровни)

  • Вид классов/обобщений (англ. class/generalization view) — состоит из классов, связанные через отношения «наследуется от» и «является экземпляром»

  • Примеры видов компонентов-и-коннекторов:

  • Процессный вид (англ. process view) — состоит из процессов, соединённых операциями коммуникации, синхронизации и/или исключения

  • Параллельный вид (англ. concurrency view) — состоит из компонентов и коннекторов, где коннекторы представляют собой «логические потоки»

  • Вид обмена данными (англ. shared-data (repository) view) — состоит из компонентов и коннекторов, которые создают, сохраняют и получают постоянные данные

  • Вид клиент-сервер (англ. client-server view) — состоит из взаимодействующих клиентов и серверов и коннектором между ними (например, протоколов и общих сообщений)

  • Примеры видов размещения:

  • Развертывание (англ. deployment view) — состоит из программных элементов, их размещения на физических носителях и коммуникационных элементов

  • Внедрение (англ. implementation view) — состоит из программных элементов и их соответствия файловым структурам в различных средах (разработческой, интеграционной и т.д.)

  • Распределение работы (англ. work assignment view) — состоит из модулей и описания того, кто ответственен за внедрение каждого из них

Хотя было разработано несколько языков для описания архитектуры программного обеспечения, в настоящий момент нет согласия по поводу того, какой набор видов должен быть принят в качестве эталона. В качестве стандарта «для моделирования программных систем (и не только)» был создан язык UML.