Программное обеспечение
<<  Качество программных средств Технология разработки программного обеспечения  >>
Диаграмма классов
Диаграмма классов
Общая структура паттерна Abstract Factory
Общая структура паттерна Abstract Factory
Полная диаграмма классов
Полная диаграмма классов
Пример программы
Пример программы
Применение паттерна Фабрика к классу SomeApp
Применение паттерна Фабрика к классу SomeApp
Диаграмма классов
Диаграмма классов
Технология разработки программного обеспечения
Технология разработки программного обеспечения
Технология разработки программного обеспечения
Технология разработки программного обеспечения
Технология разработки программного обеспечения
Технология разработки программного обеспечения
Диаграмма классов модели конвейера по производству автомобилем
Диаграмма классов модели конвейера по производству автомобилем
Структура паттерна Builder
Структура паттерна Builder
Класс JuggedArray
Класс JuggedArray
Класса-конвейер JuggedArrayConverter
Класса-конвейер JuggedArrayConverter
Полный вариант диаграммы классов конвертера массивов
Полный вариант диаграммы классов конвертера массивов
Технология разработки программного обеспечения
Технология разработки программного обеспечения
Пример использования паттерна Monostate
Пример использования паттерна Monostate
Технология разработки программного обеспечения
Технология разработки программного обеспечения
Картинки из презентации «Технология разработки программного обеспечения» к уроку информатики на тему «Программное обеспечение»

Автор: Анатолий. Чтобы познакомиться с картинкой полного размера, нажмите на её эскиз. Чтобы можно было использовать все картинки для урока информатики, скачайте бесплатно презентацию «Технология разработки программного обеспечения.pptx» со всеми картинками в zip-архиве размером 4710 КБ.

Технология разработки программного обеспечения

содержание презентации «Технология разработки программного обеспечения.pptx»
Сл Текст Сл Текст
1Технология разработки программного 65структуру создаваемого продукта (или
обеспечения (вторая часть) Порождающие создать новый продукт). продукт
шаблоны проектирования ПО. проф. каф. ОСУ конструируется через абстрактный интерфейс
Тузовский А.Ф. Лекция 6. класса Builder, для добавления нового
21. Порождающие паттерны. Порождающие продукта достаточно определить новый вид
паттерны проектирования абстрагируют строителя (т.е. реализовать новый подкласс
процесс создания объектов класса. Они класса Builder). Повышение модульности за
помогают сделать систему независимой от счет разделения распорядителя и строителя.
способа создания, композиции, и Каждый строитель имеет весь необходимый
представления объектов. Позволяют ответить код для пошагового построения продукта.
на вопрос: кто, когда и как создает Поэтому он может использоваться разными
объекты в системе. Abstract Factory распорядителями для построения вариантов
(Абстрактная фабрика) Buildеr (Строитель) продукта из одних и тех же частей.
Factory Method (Фабричный метод) Prototype Пошаговое построение продукта позволяет
(Прототип) Singleton (Одиночка). обеспечить более пристальный контроль над
31.1. Паттерн Abstract Factory процессом конструирования в отличие от
(Абстрактная фабрика). Название паттерна других порождающих паттернов, которые
Abstract Factory / Абстрактная фабрика создают продукт мгновенно.
другие названия: Toolkit / Инструментарий 66Пример использования паттерна.
Factory/Фабрика Цель паттерна предоставить Требуется разработать программный модуль
интерфейс для проектирования и реализации для работы с двумерными массивами
семейства, взаимосвязанных и действительных чисел. Строки массивов
взаимозависимых объектов, не указывая могут иметь различную длину. Цель –
конкретных классов, объекты которых будут преобразование массивов в различные
создаваться. форматы. Например: текстовый файл;
4Пояснение. В соответствии с принцип XML-файл.
инверсии зависимости (DIP) следует 67Класс JuggedArray. Определим класс
использовать зависимости от абстрактных JuggedArray (зубчатый массив) с
классов и избегать зависимостей от минимальными возможностями нужными для
конкретных классов, особенно когда решения поставленной задачи при
последние изменчивы. Нарушение принципа необходимости интерфейс можно сделать
DIP: Circle c = new Circle(origin, 1); более дружественным.
Здесь Circle – конкретный класс, значит, 68Количество различных форматов заранее
модули, которые создают экземпляры Circle, не известно может изменяться в процессе
обязательно нарушают DIP. Любой код, в работы над проектом. Клиентский код,
котором используется ключевое слово new, использующий данный модуль, должен иметь
не согласуется с принципом DIP. возможность динамически (на этапе
5Часто нарушение принципа DIP выполнения) выбирать формат, в который
практически безвредно. Чем выше будет конвертирован массив.
вероятность того, что конкретный класс 69Класса-конвейер JuggedArrayConverter.
будет изменяться, тем вероятнее, что 70Класс массива JuggedArray. Public
зависимость от него приведет к class juggedarray { private double [] []
неприятностям. если конкретный класс не array; public juggedarray (double [] []
склонен к изменениям, то ничего страшного array) // конструктор { this.Array =
в зависимости от него нет. Например: array; } public double this [int row, int
создание объектов типа string не вызывает col] { // индексатор get {return
у меня беспокойства. Зависимость от класса array[row] [col];} set {array[row][col] =
string вполне безопасна, потому что в value;} } public int rowcount() { return
обозримом будущем этот класс не изменится. array.Length; } public int rowsize (int
6При активной разработки приложения row) { return array[row].Length; } }.
многие конкретные классы часто изменяются 71Диаграмма классов предложенной
– зависимость от них может стать реализации.
источником проблем. Лучше зависеть от 72Алгоритм пошагового конвертирования
абстрактного интерфейса, тогда программа массива. Конвертирование массива определим
будем изолированы от большинства в классе JuggedArrayConverter
изменений. Паттерн Abstract Factory (класса-строитель) В методе Convert()
позволяет создавать конкретные объекты, не задается общее описание алгоритма
выходя за рамки зависимости от пошагового конвертирования массива
абстрактного интерфейса. Он очень полезен выполнение конкретных шагов построения
на тех этапах разработки приложения когда обеспечивает экземпляр класса-строителя.
конкретные классы еще очень изменчивы. Все методы класса-строителя можно
7Когда следует испрользовать паттерн определить как абстрактные нужно
Abstract Factory. Система не должна учитывать, что при реализации конкретных
зависеть от того, как в ней создаются и строителей некоторые из этих методов могут
компонуются объекты; объекты, входящие в быть не реализованы.
семейство, должны использоваться вместе; 73Методы класса JuggedArrayBuilder.
система должна конфигурироваться одним из Почти все методы сделает конкретными, но с
семейств объектов; надо предоставить пустой реализацией. Определим их как
интерфейс библиотеки, не раскрывая её виртуальные (virtual). Абстрактным (без
внутреннюю реализацию. реализации) сделаем только метод Resuit()
8Пример – игра «Супер Ралли» (гонка на в связи с необходимостью его реализации в
автомобилях). Одно из требований: игрок каждом конкретном строителе.
должен иметь возможность выбирать себе 74Абстрактный класс-строитель. public
автомобиль для участия в гонках. Каждый из abstract class JuggedArrayBuilder { public
автомобилей состоит из специфического virtual void Initialize () {} public
набора составляющих: двигатель, колес, virtual void Start() {} public virtual
кузов, коробка передач, бензобак void StartRow() {} public virtual void
определяют возможности автомобиля Addltem(double item) {} public virtual
(скорость, маневренность, устойчивость к void FinishRow() {} public virtual void
повреждениям, длительность непрерывной Finish() {} public abstract object Result
гонки без перезаправки и д.р.). Может быть (); }.
много разных типов автомобилей. Их 75Реализация алгоритма конвертирования
количество может изменяться динамически массива класса JuggedArrayBuilder. Public
(например, в зависимости от опыта игрока). object convert () { builder.Initialize();
Клиентский код, выполняющий // инициализировать построение
конфигурирование автомобиля специфичным builder.Start(); // начать построение for
семейством составляющих, не должен (int r = 0; г < this.Array.Rowcount ()
зависеть от типа выбранного автомобиля. ; ++r) { builder.Startrow(); // начать
9Предлагаемая реализации. Создается новую строку массив for (int с = 0; с <
интерфейс ФабрикаСоставляющих – this.Array.Rowsize(r); ++c) {
предназначен для создания конкретных builder.Addltern(array[r, c]); // добавить
классов (фабрик), которые будут создавать элемент массива } builder.Finishrow(); //
семейства составляющих для каждого завершить строку массива }
конкретного типа автомобиля. Методы этого builder.Finish(); // завершить построение
класса должны возвращать ссылки на return builder.Result(); // получить
абстрактные составляющие, что позволит в результат построения }.
конкретных классах-фабриках, создавать 76Создадим строитель для конвертирования
конкретные составляющие (подклассы массива в текст Текст потом, например,
абстрактных составляющих). можно сохранить в текстовый файл. Формат
10Диаграмма классов. текстового представления отдельные строки
11Клиентский код, который «собирает» массива должны разделяться символом «\n»;
автомобиль из деталей, использует элементы строки отделяются между собой
интерфейсную ссылку ФабрикаСоставляющих, пробелом.
методы данного интерфейса возвращают 77Класс TextJuggedArrayBuilder. Public
ссылки на абстрактные составляющие. Можно class textjuggedarraybuilder :
передавать клиенту объект конкретной juggedarraybuilder { private stringbuilder
фабрики, которая создает семейство text = null; public override void
объектов конкретных составляющих. initialize () { text = new
12Общая структура паттерна Abstract stringbuilder(); } public override void
Factory. addltem(double item) { text.Append(item);
13Участники паттерна Abstract Factory. text.Append(" "} ; } public
Интерфейс AbstractFactory — абстрактная override void finishrow() {
фабрика Предоставляет общий интерфейс для text.Appendline(); } public override
создания семейства продуктов. Класс object result() { return text; } } //
ConcreteFactory — конкретная фабрика методы start() и startrow() не
Реализует интерфейс AbstractFactory и реализованы.
создает семейство конкретных продуктов. 78Класс XmlJuggedArrayBuilder. public
Метод интерфейса AbstractProdact — class XmlJuggedArrayBuilder :
абстрактный продукт Предоставляет JuggedArrayBuilder { private StringBuilder
интерфейс абстрактного продукта, ссылку на xml = null; public override void
который возвращают методы фабрик. Метод Initialize() { xml = new StringBuilder ()
класса ConcreteProdact — конкретный ; } public override void Start() {
продукт Реализует конкретный тип продукта, xml.AppendLine("<JuggedArray>&q
который создается конкретной фабрикой. ot;);
14Отношения между участниками. Клиент xml.AppendLine("<rows>");
знает только о существовании абстрактной } public override void StartRow()
фабрики и абстрактных продуктов. Для {xml.AppendLine("<row>");}
создания семейства конкретных продуктов public override void Addltem(double item)
клиент конфигурируется соответствующим { xml.Append("<item>");
экземпляром конкретной фабрики. Методы xml.Append(item);
конкретной фабрики создают экземпляры xml.Append("</item>"};
конкретных продуктов, возвращая их в виде xml.AppendLine(); } public override void
ссылок на соответствующие абстрактные FinishRow() {
продукты. xml.AppendLine("</row>");
15Достоинства использования паттерна. } public override void Finish() {
Позволяет изолировать конкретные классы xml.AppendLine("</rows>");
продуктов. Клиент знает о существовании xml.AppendLine("</JuggedArray>&
только абстрактных продуктов, что ведет к uot;); } public override object Result() {
упрощению его архитектуры. Упрощает замену return xml;} }.
семейств продуктов. Для использования 79Полный вариант диаграммы классов
другого семейства продуктов достаточно конвертера массивов.
конфигурировать клиентский код 80Программа - клиент. static void
соответствующий конкретной фабрикой. Дает Main(string[ ] args) { JuggedArray array =
гарантию сочетаемости продуктов. Так как new JuggedArray (// определяем массив new
каждая конкретная фабрика создает группу double [ ] [ ] { new double[] {11, 12, 13,
продуктов, то она и следит за обеспечением 14, 15}, new double[] (21, 22, 23}, new
их сочетаемости. double[] {31, 32, 33, 34} }; // создаем
16Недостаток использовани паттерна. конвертер JuggedArrayConverter converter =
Трудно поддерживать новые виды продуктов, new JuggedArrayConverter ();
которые содержат, другой состав компонент. converter.Array = array; // задаем массив
Для добавления нового продукта необходимо Console.WriteLine ( "Текстовое
изменять всю иерархию фабрик, а также представление массива:") ; // задаем
клиентский код. конвертер строителем текстового
17Практический пример использования представления converter.Builder = new
паттерна. Задача – разработать ПО для TextJuggedArrayBuilder () ; object
магазина компьютерной техники. Одно из textArray = converter.Convert (); //
требований – быстрое создание конфигурации проводим конвертацию Console .WriteLine
системного блока. Предположим, что в (textArray) ; // выводим результат на
состав конфигурации системного блока консоль
входят: бокс (Box); процессор (Processor); Console.WriteLine("Xml-представление
системная плата (MainBoard); жесткий диск массива:") ; // задаем конвертер
(Hdd); оперативная память (Memory). строителем XML-представления
18Допустим, что программа должна converter.Builder = new
создавать шаблоны типичных конфигураций XmlJuggedArrayBuilder(); object xmlArray =
двух типов: домашняя конфигурация; офисная converter.Convert(); // проводим
конфигурация. Для всех этих конфигураций конвертацию Console.WriteLine(xmlArray);
определим абстрактный класс. Конкретные // выводим результат на консоль }.
модели составляющих будем определять путем 81
наследования от абстрактного базового 82Преимущества шаблона Builder.
класса, Клиентский код не зависит от конкретного
19Класс персонального компьютера Рс. строителя; есть возможность определить
Класс, представляющий конфигурацию произвольное число строителей без
системного блока: public class Pc { public модификации классов juggedarray и
Box Box { get; set; } public Processor juggedarrayconverter.
Processor { get; set; } public MainBoard 831.3. Паттерны Singleton (Одиночка) и
MainBoard { get; set; } public Hdd Hdd { Monostate (Моносостояние). Обычно между
get; set; } public Memory Memory { get; классами и их объектами существует
set; } }. отношение один-ко-многим, можно создавать
20Интерфейс фабрики создания много экземпляров одного класса. Объекты
конфигурации системного блока. создаются, когда они требуются, и
Ответственность за их создание заданной уничтожаются, когда перестают быть
конфигурации надо возложить на один необходимыми. Однако у некоторых классов
класс-фабрику. Эта фабрика должна должен быть только один объект. создается
реализовать интерфейс IPcFactory . Методы в начале работы программы уничтожен при ее
это интерфейса возвращают ссылки на классы завершении. Такие объекты могут быть:
абстрактных продуктов. public interface корневыми объектами приложения – из них
IPcFactory { Box CreateBox ( ) ; Processor можно добраться до других объектов
CreateProcessor ( ) ; MainBoard системы. фабриками, порождающими другие
CreateMainBoard ( ) ; Hdd CreateHddO ; объекты. менеджерами, которые следят за
Memory CreateMemory ( ) ; }. другими объектами.
21Для создания компонентов конфигураций 84Во всех случаях требуется только один
определяем классы конкретных фабрик такой объект наличие нескольких их
HomePcFactory OfficePcFactory. В каждом из объектов – серьезная логическая ошибка.
create-методов этих классов создается Если есть более одного корня, то доступ к
объект конкретного класса продукта, объектам приложения может зависеть от
соответствующего типу конфигурации. выбранного корня. Программисты, не знающие
22Класс HomePcFactory. Фабрика для о наличии нескольких корней, могут, не
создания "домашней" конфигурации сознавая того, видеть лишь подмножество
системного блока ПК public class всех объектов приложения. Если существует
HomePcFactory : IPcFactory { public Box несколько фабрик, то может быть потерян
CreateBox() { return new SilverBox(); } контроль над созданными объектами. При
public Processor CreateProcessor() {return наличии нескольких менеджеров операции,
new IntelProcessor(); } public MainBoard предполагавшиеся последовательными, могут
CreateMainBoard() { return new оказаться параллельными.
MSIMainBord(); } public Hdd CreateHddO { 85Может показаться, что вводить
return new SamsungHDD(); } public Memory специальные механизмы обеспечения
CreateMemory() { return new Ddr2Memory();} единственности таких объектов –
}. излишество. В конце концов, на этапе
23Класс OfficePcFactory. Фабрика для инициализации приложения можно просто
создания "офисной" конфигурации создать по одному экземпляру каждого, и
системного блока ПК public class дело с концом. Такой шаблон иногда
OfficePcFactory : IPcFactory { public Box называется «Просто создай одного».
CreateBox() {return new BlackBoxf); } 86Паттерн Одиночка (Singleton). Одиночка
public Processor CreateProcessor() { (Singleton) – очень простой паттерн.
return new AmdProcessor();} public public class Singleton { private static
MainBoard CreateMainBoard() {return new Singleton theInstance = null; private
AsusMainBord(); } public Hdd CreateHdd{) Singleton() {} public static Singleton
{return new LGHDD ();} public Memory Instance { get { if (theInstance == null)
CreateMemory() { return new DdrMemory(); } theInstance = new Singleton();
}. theInstance; } } }.
24Класс PcConfigurator. Ответственен за 87Реализация класса Singleton. public
создание объекта типа Рс выбранного типа class Singleton { private static Singleton
public class PcConfigurator { public theInstance = null; private Singleton() {}
IPcFactory PcFactory { get; set; } public public static Singleton Instance { get {
void Configure(Pc pc) { pc.Box = if (theInstance == null) theInstance = new
PcFactory.CreateBox(); pc. MainBoard = Singleton(); theInstance; } } }.
PcFactory.CreateMainBoard(); pc.Hdd = 88Пример класса. Описание класса public
PcFactory.CreateHdd() ; pc.Memory = class Singleton{ private static Singleton
PcFactory.CreateMemory(); pc.Processor = instance; private Singleton() { } public
PcFactory.CreateProcessor(); } }. static Singleton Instance { get { if
25Полная диаграмма классов. (instance == null) {instance = new
26Класс PcConfigurator принимает Singleton(); } return instance; } } public
экземпляр конкретной фабрики и с помощью String DataItem { get; set; } }
её методов создает составляющие Использование класса Singleton single =
персонального компьютера. PcConfigurator Singleton.Instance; single.DataItem =
работает с интерфейсной ссылкой IPcFactory "value";
и ничего не знает о конкретных фабриках 89Достоинства. Применимость к любому
конфигураций и конкретных составляющих. классу. Любой класс можно преобразовать в
Cила абстрактной фабрики конкретную Одиночку, если сделать его конструкторы
фабрику можно определять на этапе закрытыми и добавить соответствующие
выполнения программы клиентский код не статические методы и переменную-член.
зависит от конкретных фабрик или Может быть создан путем наследования. Имея
конкретных продуктов. некоторый класс, можно создать его
27Паттерн Factory (Фабрика). В подкласс, который будет Одиночкой.
соответствии с принцип инверсии Отложенное вычисление. Если Одиночка не
зависимости следует использовать используется, то он и не создается.
зависимости от абстрактных классов и 90Недостатки. Уничтожение не определено.
избегать зависимостей от конкретных Не существует приемлемого способа
классов, особенно когда последние уничтожить или «списать» Одиночку. Даже
изменчивы. Следующий фрагмент кода если добавить метод, обнуляющий переменную
нарушает принцип DIP: Circle c = new theInstance, другие модули могут хранить у
Circle(origin, 1); Здесь Circle – себя ссылку на Одиночку. При последующих
конкретный класс, значит, модули, которые обращениях к Instance будет создан новый
создают экземпляры Circle, обязательно экземпляр, что приведет к образованию двух
нарушают DIP. Любой код, в котором одновременно существующих экземпляров. Эта
используется ключевое слово new, не проблема особенно остро стоит в языке C++,
согласуется с принципом DIP. где экземпляр может быть уничтожен, что
28Достаточно часто нарушение принципа приведет к разыменованию уже не
DIP практически безвредно. Чем выше существующего объекта. Не наследуется.
вероятность того, что конкретный класс Класс, производный от Одиночки, сам не
будет изменяться, тем вероятнее, что является Одиночкой. Если необходимо, чтобы
зависимость от него приведет к он был Одиночкой, придется добавить
неприятностям. Но если конкретный класс не статический метод и переменную-член.
склонен к изменениям, то ничего страшного Эффективность. Каждое обращение к свойству
в зависимости от него нет. Так, создание Instance приводит к выполнению предложения
объектов типа string не вызывает у меня if. Для большинства обращений это
беспокойства. Зависимость от класса string предложение бесполезно. Непрозрачность.
вполне безопасна, потому что в обозримом Пользователи Одиночки знают, с чем имеют
будущем этот класс не изменится. дело, потому что вынуждены обращаться к
29Однако, во время активной разработки свойству Instance.
приложения многие конкретные классы часто 91Пример использования шаблона Одиночка.
изменяются, поэтому зависимость от них Предположим, что имеется веб-приложение,
может стать источником проблем. Лучше позволяющее пользователям входить в
зависеть от абстрактного интерфейса, тогда защищенные области сервера. В таком
программа будем изолированы от большинства приложении будет какая-то БД, которая
изменений. Паттерн Factory (Фабрика) содержит описания пользователей: имена,
позволяет создавать конкретные объекты, не пароли другие атрибуты. Доступ к базе
выходя за рамки зависимости от данных выполняется с помощью специального
абстрактного интерфейса. Он очень полезен API.
на тех этапах разработки приложения когда 92Варианты реализации. Можно было бы в
конкретные классы еще очень изменчивы. каждом модуле, которому необходимо читать
30Пример программы. Имеется класс и изменять данные о пользователях,
SomeApp, зависящий от интерфейса Shape. обращаться к базе напрямую. Недостаток:
SomeApp обращается к экземплярам Shape вызовы стороннего API будут разбросаны по
исключительно через интерфейс Shape и не всему коду, это затрудняет следованию
пользуется методами, специфичными для соглашения о доступе и структуре
классов Square или Circle. К сожалению, программы.
SomeApp также создает экземпляры Square и 93Лучше воспользоваться паттерном Fa?ade
Circle и, следовательно, зависит от этих (Фасад) и создать класс UserDatabase,
конкретных классов. предоставляющий методы для чтения и
31Применение паттерна Фабрика к классу изменения объектов User. Это частный
SomeApp. Интерфейс ShapeFactory, в котором случай шаблона Фасад , называемый шаблоном
объявлены два метода: MakeSquare() Шлюз (Gateway). Методы обращаются к
возвращает экземпляр Square, MakeCircle() стороннему API доступа к базе данных,
возвращает экземпляр Circle. В обоих осуществляя отображение между объектами
случаях возвращаемое значение имеет тип User и таблицами базы. Внутри класса
Shape. UserDatabase можно обеспечить соглашения о
32public interface ShapeFactory { Shape структуре и порядке доступа. Например,
MakeCircle(); Shape MakeSquare(); } public можно гарантировать, что не будет
class ShapeFactoryImplementation : добавлена запись User, в которой поле
ShapeFactory { public Shape MakeCircle() { username пусто. Или упорядочить обращения
return new Circle(); } public Shape к записи User, так, чтобы никакие два
MakeSquare() { return new Square(); } }. модуля не могли одновременно читать и
33Этот прием полностью решает проблему изменять ее.
зависимости от конкретных классов. Код 94Решение на основе паттерна Singleton
приложения не зависит от Circle и Square, (Одиночка). Создается класс с именем
но может успешно создавать объекты обоих UserDatabaseSource, который реализует
классов. Он манипулирует этими объектами интерфейс UserDatabase. В коде свойства
через интерфейс Shape и никогда не Instance нет традиционного предложения if,
вызывает методов, специфичных только для защищающего от многократного создания.
Square или Circle. Проблема зависимости от Вместо этого используется механизм
конкретного класса перенесена в другое статической инициализации, имеющийся в
место. .NET.
34Экземпляр ShapeFactoryImplementation 95Интерфейс UserDatabase и класс
где-то должен создаваться. Но больше ни в UserDatabaseSource. public interface
одном месте объекты Square и Circle UserDatabase { User ReadUser(string
напрямую не создаются. Экземпляр userName); void WriteUser(User user); }
ShapeFactoryImplementation, обычно public class UserDatabaseSource :
создается в головной программе или в UserDatabase { private static UserDatabase
специальном методе инициализации, который theInstance = new UserDatabaseSource();
вызывается из Main. public static UserDatabase Instance { get
35Проблема зависимости. В описанном { return theInstance; } } private
варианте паттерна Фабрика имеется UserDatabaseSource() { } public User
проблема. В интерфейсе ShapeFactory ReadUser(string userName) { // Реализация
объявлены методы для всех классов, } public void WriteUser(User user) { //
производных от Shape. Это приводит к Реализация } }.
зависимости по именам, усложняющей 96Такое использование паттерна Одиночка
добавление новых подклассов Shape. При распространено чрезвычайно широко.
добавлении каждого нового подкласса нужно Гарантируется, что весь доступ к базе
также добавить новый метод в интерфейс данных производится через единственный
ShapeFactory. придется заново экземпляр UserDatabaseSource. При этом в
откомпилировать и развернуть все клиенты UserDatabaseSource очень легко вставлять
ShapeFactory. различные проверки, счетчики блокировки,
36Можно избавиться от этой проблемы, которые обеспечивают выполнение требуемых
частично пожертвовав безопасностью типов. соглашений о порядке доступа и структуре
Вместо того чтобы вводить в ShapeFactory кода.
по одному методу для каждого подкласса 97Паттерн Monostate (Моносостояние ).
Shape, можно оставить всего один метод, Паттерн Monostate (Моносостояние)
принимающий строку. [Test] public void предлагает другой способ обеспечения
TestCreateCircle() { Shape s = единственности. public class Monostate {
factory.Make(“Circle”); Assert.IsTrue(s is private static int itsX; public int X {
Circle); }. get { return itsX; } set { itsX = value; }
37В этом случае в классе } }.
ShapeFactoryImplementation нужно будет 98Тесты для проверки. using
использовать цепочку предложений if/else, NUnit.Framework; [TestFixture] public
в которых входной аргумент анализируется class TestMonostate { [Test] public void
на предмет выбора подходящего подкласса TestInstance() { Monostate m = new
Shape. public interface ShapeFactory { Monostate(); for (int x = 0; x < 10;
Shape Make(string name); } public class x++) { m.X = x; Assert.AreEqual(x, m.X); }
ShapeFactoryImplementation : ShapeFactory }. [Test] public void
{ public Shape Make(string name) { TestInstancesBehaveAsOne() { Monostate m1
if(name.Equals(“Circle”)) return new = new Monostate(); Monostate m2 = new
Circle(); else if(name.Equals(“Square”)) Monostate(); for (int x = 0; x < 10;
return new Square(); else throw new x++) { m1.X = x; Assert.AreEqual(x, m2.X);
Exception(“ShapeFactory не может создать: } } }.
{0}”, name); } }. 99Если заменить в этих тестах все
38Опасность. При неправильном написания предложения new Monostate на вызовами
названия фигуры клиент получит ошибку на Singleton.Instance, то тесты все равно
этапе выполнения, а не компиляции. Такие прошли бы успешно. Таким образом, тесты
ошибки времени выполнения будут обнаружены описывают поведение Одиночки, не налагая
заранее если пишутся автономные тесты и ограничения на единственность экземпляра!
применяете методику разработки через Каким образом два экземпляра могут вести
тестирование. себя так, будто это единственный объект?
39 Да просто это означает, что у них одни и
40Взаимозаменяемые фабрики. Большое те же переменные-члены. А добиться этого
достоинство фабрик – возможность подменять можно, сделав все переменные-члены
одну реализацию фабрики другой. Это статическими.
позволяет подставлять в приложение 100Реализация класса Monostate. public
различные семейства объектов. Например, class Monostate { private static int itsX;
пишется приложение, которое должно public int X { get { return itsX; } set {
адаптироваться к нескольким реализациям itsX = value; } } }.
базы данных. Допустим, что можно либо 101Пример класса. Описание класса public
работать с плоскими файлами, либо купить class Singleton{ private static Singleton
адаптер к СУБД Oracle. Чтобы изолировать instance; private Singleton() { } public
приложение от реализации базы данных, static Singleton Instance { get { if
можно воспользоваться паттерном Proxy (instance == null) {instance = new
(Заместитель). А для создания экземпляров Singleton(); } return instance; } } public
заместителей можно применить фабрики. String DataItem { get; set; } }
41Диаграмма классов. Есть две реализации Использование класса Singleton single =
интерфейса EmployeeFactory. одна создает Singleton.Instance; single.DataItem =
объекты-заместители для работы с плоскими "value";
файлами, другая – для работы с Oracle. 102Описание класса public class Monostate
Приложение не знает о том, какая { private static string dataItem; public
реализация используется. string DataItem { get { return dataItem; }
42 set { dataItem = value; } } public
43 Monostate() { } } Использование класса var
44 single = new Monostate(); single.DataItem
45 = "value";
46Важность фабрик. Строгая интерпретация 103Сколько бы экземпляров класса
принципа DIP означала бы, что нужно Monostate ни создать, все они ведут себя
создавать фабрику для любого изменчивого так, как будто являются одним и тем же
класса. При этом паттерн Фабрика выглядит объектом. Можно даже уничтожить все
очень соблазнительно. Поэтому разработчики текущие экземпляры, не потеряв при этом
могут поддаться искушению использовать данных. Различие между паттернами
фабрики по умолчанию. Но этой крайность, Singleton и Monostate – это различие между
которая не рекомендуется. Рекомендуется их поведением и структурой.
использовать только при возникновении 104Паттерн Singleton навязывает структуру
настоятельной необходимости. единственности, не позволяя создать более
47Когда использовать Фабрику. Если нужно одного экземпляра. Паттерн Monostate,
применить паттерн Заместитель, возможно, напротив, навязывает поведение
имеет смысл завести и фабрику для создания единственности, не налагая структурных
сохраняемых объектов. Если в процессе ограничений. Это различие станет понятным,
автономного тестирования возникает если заметить, тесты для паттерна
ситуация, когда нужно подменить создателя Monostate проходят и для класса Singleton,
объектов. Но пока полезность фабрики не однако у класса Monostate нет ни малейшей
стала очевидной следует обходиться без надежды пройти тесты для Singleton.
нее. 105Достоинства. Прозрачность –
48Фабрики привносят сложность, которой пользователь работает точно так же, как с
часто можно избежать, особенно на ранних обычным объектом, ничего не зная о том,
стадиях проектирования. Если использовать что это «моносостояние». Допускает
их к часто, то развитие дизайна может наследование. Подклассы моносостояния
сильно осложниться. Для создания всего также обладают этим свойством. Более того,
одного содержательного класса придется все его подклассы являются частями одного
вводить целых четыре сущности: два и того же моносостояния, так как разделяют
интерфейса, представляющих сам новый класс одни и те же статические переменные-члены.
и его фабрику, и два конкретных класса, Полиморфизм Т.к. методы моносостояния не
реализующих эти интерфейсы. статические, их можно переопределять в
49Выводы. Шаблон Фабрика – это мощный производных классах. Т.е. подклассы могут
инструмент. Она может оказаться ценным реализовывать различное поведение при
инструментом, обеспечивающим согласование одном и том же наборе статических
с принципом DIP, (позволяет модулям переменных-членов. Точно определенные
верхнего уровня создавать экземпляры моменты создания и уничтожения. Т.к.
классов, не становясь зависимыми от переменные-члены моносостояния
конкретных реализаций этих классов). дают статические, то моменты их создания и
возможность подменять целые семейства уничтожения точно определены.
реализаций групп классов. Но Фабрики 106Недостатки. Невозможность
вносят сложность, без которой часто можно преобразования. Класс, не являющийся
обойтись. Повсеместное их применение редко моносостоянием, невозможно превратить в
бывает оптимальным курсом. моносостояние с помощью наследования.
501.2. Паттерн Buildеr (Строитель). Эффективность. Будучи настоящим объектом,
Название паттерна Buildеr / Строитель. моносостояние может многократно
Цель паттерна отделяет процесс построения создаваться и уничтожаться. Иногда это
сложного объекта от его представления – в обходится дорого. Постоянное присутствие.
результате одного и того же процесса Переменные-члены моносостояния занимают
создания получаются разные представления место в памяти, даже если объект никогда
объекта. клиентский код может порождать не используется. Локальность. Паттерн
сложный объект, определит для него не Моносостояние не может гарантировать
только тип, но и внутреннее содержимое. единственность в нескольких экземплярах
клиент не обязан знать о деталях CLR или на нескольких компьютерах.
конструирования объекта. 107Пример использования паттерна
51Паттерн Buildеr следует использовать Monostate. Рассмотрим реализацию простого
когда... Общий алгоритм построения конечного автомата (КА), описывающего
сложного объекта не должен зависеть от работу турникета в метро . Первоначально
специфики каждого из его шагов. В турникет находится в состоянии Locked
результате одного и того же алгоритма (Закрыт). Если опустить монету, турникет
конструирования надо получить различные перейдет в состояние Unlocked, откроет
продукты. дверцы, сбросит сигнал тревоги (если он
52Пояснение причины возникновения был включен) и поместит монету в
паттерна. В качестве примера, рассмотрим монетоприемник. Если в этот момент
конвейер выпуска автомобилей. Смысл пользователь пройдет через турникет, тот
конвейера – пошаговое построение сложного вернется в состояние Locked и закроет
продукта (например, автомобиля). При этом: дверцы.
конвейер определяет общую 108Существуют два аномальных условия.
последовательность шагов (т.е. алгоритм) Если пользователь опускает несколько
построения. специфика каждого шага монет, прежде чем пройти, то лишние монеты
определяется моделью собираемого возвращаются, а дверцы остаются открытыми.
автомобиля. Если пользователь пытается пройти, не
53Разделение построения на общий заплатив, то раздается сигнал тревоги и
алгоритм построения и специфические дверцы остаются закрытыми.
операции на каждом шаге позволяет 109
значительно экономить: на одном и том же 110Реализация моносостояния Turnstile.
конвейере могут выпускаться автомобили public int Refunds { get { return
разных моделей с различными itsRefunds; } } public void Deposit() {
характеристиками. itsCoins++; } public void Refund() {
54С общей технологической точки зрения, itsRefunds++; } } internal class Locked :
конвейер по сборке автомобилей включает Turnstile { public override void Coin() {
следующие этапы: Сборка кузова. Установка itsState = UNLOCKED; Lock(false);
двигателя. Установка колес. Покраска. Alarm(false); Deposit(); } public override
Подготовка салона. Технические детали void Pass() { Alarm(true); } } internal
процессов, происходящих на каждом шаге, class Unlocked : Turnstile { public
известны уже конкретной технологии override void Coin() { Refund(); } public
производства модели автомобиля. override void Pass() { Lock(true);
55Пусть завод может производить itsState = LOCKED; } }. public class
автомобили следующих моделей: автомобили Turnstile { private static bool isLocked =
класса «мини», спортивные автомобили, true; private static bool isAlarming =
внедорожники. В таком случае для компании false; private static int itsCoins = 0;
не составит проблем дополнить набор private static int itsRefunds = 0;
выпускаемых моделей новыми образцами без protected static readonly Turnstile LOCKED
изменений общего конвейерного цикла. = new Locked(); protected static readonly
56Рассмотрим ОО программирование. Turnstile UNLOCKED = new Unlocked();
Определим класс Конвейер, который будет protected static Turnstile itsState =
прототипом реального конвейера будет LOCKED; public void reset() { Lock(true);
определять общую последовательность шагов Alarm(false); itsCoins = 0; itsRefunds =
создания. Метод Собрать() этого класса 0; itsState = LOCKED; } public bool
будет исполнять процесс построения Locked() { return isLocked; } public bool
посредством выполнения этих шагов без Alarm() { return isAlarming; } public
зависимости от технических деталей virtual void Coin() { itsState.Coin(); }
реализации каждого шага. Ответственность public virtual void Pass() {
за реализацию шагов построения возложена itsState.Pass(); } protected void
на абстрактный класс, который назовем Lock(bool shouldLock) { isLocked =
ТехнологияМодели. shouldLock; } protected void Alarm(bool
57В результате применения конкретных shouldAlarm) { isAlarming = shouldAlarm; }
подклассов класса ТехнологияМодели можно public int Coins { get { return itsCoins;
получать на выходе разные модели } }.
автомобилей, т.е. экземпляры разных 111
классов автомобилей. В данном случае 112Полезные особенности паттерна
определим такие подклассы класса Monostate (Моносостояние). Использованы
ТехнологияМодели: ТехнологияМиниАвто, возможность создавать полиморфные
ТехнологияСпортивныйАвто, подклассы и то, что подклассы сами
ТехнологияВнедорожныйАвто. являются моносостояниями. Кроме того,
58Каждая из этих технологий видно, насколько трудно бывает превратить
соответственно предусматривает выпуск объект-моносостояние в объект, таковым не
таких моделей автомобилей: МиниАвто, являющийся. Структура решения существенно
СпортивныйАвто, ВседорожныйАвто. опирается на то, что Turnstile –
59Для начала производства автомобиля моносостояние. Если бы потребуется
необходимо задать конкретную технологию применить этот КА к управлению несколькими
для конвейера и вызвать метод Собрать(). турникетами, код придется сильно
После завершения процесса сборки готовый переработать.
автомобиль можно получить у объекта 113Полезные особенности паттерна
технологии с помощью метода Monostate (Моносостояние). Может
ПолучитьРезультат(). возникнуть вопрос в связи с необычным
60Диаграмма классов модели конвейера по использованием наследования в этом
производству автомобилем. примере. То, что классы Unlocked и Locked
61Преимущества паттерна. 1) конкретная сделаны производными от Turnstile,
технология построения создается по общему представляется нарушением принципов ООП.
шаблону, реализуя действия, которые он Но поскольку Turnstile – моносостояние, то
определяет; 2) общий алгоритм процесса не существует его отдельных экземпляров.
построения не зависит от деталей, Поэтому Unlocked и Locked – это не
специфических для конкретной технологии; самостоятельные классы, а части абстракции
есть возможность без опасности увеличения Turnstile. Они имеют доступ к тем же
сложности структуры модели реализовать под переменным и методам, что и Turnstile.
общий алгоритм большое количество 114Выводы по шаблонам Singleton и
конкретных технологий. Monostate. Часто бывает необходимо
62Структура паттерна Builder. обеспечить единственность объекта
63Участники паттерна. Director некоторого класса. Шаблоны Singleton и
(Конвейер) – распорядитель Определяет Monostate принципиально различным способом
общий алгоритм конструирования, используя решают эту задачу. Паттерн Singleton
для реализации отдельных шагов возможности опирается на использование закрытых
класса Builder. Builder (ТехнологияМодели) конструкторов, статической
— строитель Обеспечивает интерфейс для переменной-члена и статического метода,
пошагового конструирования сложного которые совместно ограничивают количество
объекта (продукта) из частей. создаваемых экземпляров. В паттерне
ConcreteBuilder (ТехнологпяМиниАвто и др.) Monostate все переменные-члены просто
— конкретный строитель Реализует шаги сделаны статическими.
построения сложного объекта, определенные 115Выводы по шаблонам Singleton и
в базовом классе Builder. Создает Monostate (2). Шаблон Singleton лучше
результат построения (Product) и следит за применять, когда уже есть некоторый класс
пошаговым конструированием. Определят и тогда обеспечить единственность
интерфейс для доступа к результату экземпляра можно, создав его подкласс,
конструирования Product (МиниАвто и др.) — если не против обращения к свойству
продукт Сложный объект, который получается Instance для получения доступа к этому
в результате конструирования. экземпляру. Шаблон Monostate удобнее когда
64Отношения между участниками. Клиент единичный объект класса желательно сделать
конфигурирует распорядителя (Director) незаметным для пользователей или когда
экземпляром конкретного строителя. необходимо полиморфное поведение
Распорядитель вызывает методы строителя единственного объекта.
для конструирования частей продукта. 116Паттерн Null-объект.
Конкретный строитель создает продукт и 117
следит за его конструированием. Конкретный 118
строитель представляет интерфейс для 119
доступа к продукту. 120
65Результаты использования паттерна. 121
Есть возможность изменять внутреннею 122
Технология разработки программного обеспечения.pptx
http://900igr.net/kartinka/informatika/tekhnologija-razrabotki-programmnogo-obespechenija-134851.html
cсылка на страницу

Технология разработки программного обеспечения

другие презентации на тему «Технология разработки программного обеспечения»

«Программное обеспечение компьютера 10 класс» - Операционная система. Разработка современного ПО требует очень высокой квалификации от программистов. Сервисные программы. Интерактивный режим. Прикладное ПО. Подразделение. Инструментарий программирования. Программное обеспечение компьютера постоянно пополняется, развивается, совершенствуется. Главной частью системного программного обеспечения является операционная система (ОС).

«Программное обеспечение ПК» - Математические пакеты для сложных инженерных расчетов. ПО высокого уровня. Человек. Низкоуровневое ПО. Обучающие программы для самообразования или в учебном процессе. Устройства компьютера. Системы программирования являются инструментами создания прикладных программ. Программное обеспечение компьютера.

«Классификация программного обеспечения» - Стоимость уникального программного обеспечения обычно очень велика. Например бухгалтерские программы. Где начинающему программисту взять нужные программы? Что такое пакеты прикладных программ ? Вот поэтому-то я и собрал здесь ссылки на крупнейшие программные архивы. По способу выполнения работы компилятор и интерпретатор существенно различаются.

«Программное обеспечение компьютера» - Существует много языков программирования: Бейсик; Паскаль; Фортран; Си; ... Системы программирования — инструмент для работы программиста. Инструментальное ПО. Программное обеспечение. Компьютер. Вся информация хранится в файлах, которые образуют файловую систему компьютера. Системное. Операционная система.

«Программное обеспечение для компьютера» - Текстовые редакторы Интегрированные среды разработки SDK Компиляторы Интерпретаторы Линковщики Парсеры и генераторы парсеров (см. Прикладные программы, непосредственно обеспечивающие выполнение необходимых пользователям работ; Общение человека с компьютером стало простым, наглядным, понятным. Все программы, работающие на компьютере, можно условно разделить на три категории:

«Разработка программ» - Средства разработки программ на ассемблере. Выполняет трансляцию программа tasm.exe (tasm32.exe). Привести пример разработки программы, выполнив последовательно все этапы. Сохранить файл с расширением - asm, например, LR1.ASM. 3. Порядок действий при создании программы на ассемблере: 2. Программное обеспечение для разработки программ на ассемблере.

Программное обеспечение

33 презентации о программном обеспечении
Урок

Информатика

130 тем
Картинки
900igr.net > Презентации по информатике > Программное обеспечение > Технология разработки программного обеспечения