Шаблон Indirection (перенаправление) - решает проблему прямой связности, решением является введение промежуточного объекта для обеспечения связи между другими компонентами или службами, которые не связаны между собой напрямую. Классы: Adapter, Facade, Observer. Цель: обеспечить слабую связность за счёт отделения друг от друга основных компонентов. Шаблон Polymorphysm (полиморфизм) - решает проблему обработки альтернативных вариантов поведения на основе типа, решать эту проблему нужно с использованием полиморфных операций, а не с помощью проверки типа и условной логики. Кроме того, с помощью полиморфизма легко создавать общие компоненты; как результат, получаем следующие преимущества: 1) впоследствии можно легко расширять систему, добавляя новые вариации; 2) новые вариации можно вводить без модификации клиентской части программы. Шаблон Protected Variations (защищённые вариации) - описывает ключевой принцип, на основе которого реализуются механизмы и шаблоны программирования и проектирования с целью обеспечения гибкости и защиты системы от влияния внешних систем. Инкапсуляция данных, интерфейсы, полиморфизм, перенаправление - все эти принципы реализуются в рамках данного шаблона. Существует много принципов проектирования, которые являются проявлением этого шаблона, например: 1) проектирование на основе данных; 2) поиск служб; 3) проектирование на основе интерпретатора; 4) рефлексивное проектирование или проектирование на метауровне; 5) унифицированный доступ. Неизменным остаётся базовый принцип шаблона - обеспечивать устойчивость интерфейса. Надёжность программного обеспечения Методы увеличения надёжности Основными методами увеличения надёжности являются: 1) предотвращение ошибок; 2) определение погрешности ошибок. Рекомендации для снижения вероятности возникновения ошибок: 1) не использовать методы с большой вероятностью ошибок (напр., использование указателей); 2) использовать принцип ограниченного доступа, т. е. инкапсуляция, разделение памяти и т. д.; 3) использовать языки-компиляторы с проверкой соответствия типов; 4) использовать языки высокого уровня; 5) строго определять интерфейс; 6) уделять внимание исключениям, таким как пустые множества, пустые циклы, нулевые значения, неинициированные переменные и пр. методы; 7) использовать готовые компоненты; 8) минимизировать различия между моделью и реализацией. Наиболее опасные техники программирования: 1) использование команды GOTO; 2) использование чисел с плавающей точкой; 3) использование указателей; 4) параллельные вычисления; 5) использование рекуррентных соотношений; 6) использование динамического распределения памяти; 7) процедуры и функции, которые выполняют различные задачи, которые зависят от параметров и внешних условий; 8) использование сложных присвоений без скобок; 9) обработка данных многими процессами без синхронизации в виде блокировок, транзакций и пр. Базовые принципы кодирования: 1) единые соглашения об именовании переменных; 2) имя переменной должно точно и полностью раскрывать суть того, что она представляет; 3) легче всего отлаживать программу с переменными, которые имеют длину от 10 до 16 символов; 4) при написании программ соблюдаем соглашения, которые являются традиционными для данного языка программирования. Оформление программы Цель: точно и последовательно изображать логическую структуру кода, улучшить читабельность программ, оформление должно выдерживать изменения. Хорошее оформление показывает логическую структуру программы. Форматирование индивидуальных выражений: 1) длина каждого оператора не должна превышать 80 символов; 2) для улучшения читабельности желательно увеличивать количество пробелов; 3) выравнивание группы связанных присваиваний; 4) выравнивание перенесённых строк; 5) использовать одно предложение на строку; 6) избегать посторонних эффектов; 7) форматирование описаний данных; 8) использование одного описания на строку; 9) переменные упорядочиваются по типу; 10) звёздочка пишется возле типа данных; 11) отделение процедур; 12) отделение тела процедуры; 13) модуль программы должен храниться в отдельном файле.