SlideShare a Scribd company logo
1 of 58
Download to read offline
УК 03.001.01-2011
Учебный курс. Обучение. ООП.
Базовые понятия
Объектно-ориентированное программирование (ООП) –
это методология программирования, основанная на
представлении программы в виде совокупности объектов,
каждый из которых является экземпляром определенного
класса, а классы образуют иерархию наследования.
(КН 02.002-1995, стр. 52)
• Основным элементом абстракции являются объекты
• Каждый объект является экземпляром определенного
класса
• Классы образуют иерархию наследования
Ключевые характеристики ООП
Абстракция выделяет существенные характеристики
некоторого объекта, отличающие его от всех других видов
объектов и, таким образом, четко определяет его
концептуальные границы с точки зрения наблюдателя.
(КН 02.002-1995, стр. 55)
• Внешнее поведение
• Барьер абстракции
• Неоднозначность выделения абстракции
• Абстракция и объект реального мира – не одно и тоже
(пример: вещественные числа и числа с плавающей
точкой)
• Задача: является ли квадрат прямоугольником?
Инкапсуляция – это процесс отделения друг от друга
элементов объекта, определяющих его устройство и
поведение; инкапсуляция служит для того, чтобы
изолировать контрактные обязательства абстракции от их
реализации.
(КН 02.002-1995, стр. 63)
• Сокрытие данных лишь частный случай инкапсуляции
• Поведение представляется только с помощью методов
• Задача о множествах объектов
Модульность – это свойство системы, которая может была
разложена на внутренне связные, но слабо связанные
между собой модули.
(КН 02.002-1995, стр. 69)
• Что первично класс или модуль?
Иерархия – это упорядочивание абстракций, расположение
их по уровням.
(КН 02.002-1995, стр. 71)
• “is a” (наследование)
• “part of” (агрегация, композиция)
Принципы ООП
Открыто-замкнутый принцип
• Инкрементная разработка;
• Количество строк кода, которые пишет программист, в
единицу времени ограничено;
• Если изменяется существующий код, то, скорее всего,
прироста функционала не происходит;
• Повторное использование.
Программная сущность (класс, модуль, функция и т.д.)
должна быть открыта для расширения, но закрыта для
модификаций.
(СТ 02.003-1995, стр. 1)
Наследование ООП позволяет задавать фиксированную абстракцию, но
описывающую неограниченную группу возможных поведений.
Поведение – это то, как объект действует и реагирует; поведение
выражается в терминах состояния объекта и передачи сообщений.
(КН 02.002-1995, стр. 96)
Необходимо избегать конструкций, которые создают закрытое
множество поведений:
• switch (ПР 02.001)
• Цепочка if/else (ПР 02.002)
• Информация о типе во время выполнения (ПР 02.003)
• Перечислимые типы (ПР 02.004)
• Дублирование кода (ПР 01.001)
• Все поля должны быть private (ПР 02.005)
• Избегать использование глобальных переменных (ПР 01.002)
Пример 1: Геометрические фигуры
class Shape
{
private ShapeType itsType;
private void DrawSquare();
private void DrawCircle();
public static void DrawAllShapes(Shape[] list)
{
for(Shape s : list)
{
switch (s.itsType)
{
case square:
DrawSquare();
break;
case circle:
DrawCircle();
break;
}
}
}
}
interface Shape
{
void Draw();
}
class ShapeUtils
{
public static void DrawAllShapes(Shape[] list)
{
for(Shape s: list)
{
s.Draw();
}
}
}
class Square implements Shape
{
public void Draw()
{
}
}
Пример 2: Рубрикатор
switch (article.Rubric)
{
case Auto:
case Realty:
filterPanels.Add(ucSearchOptions);
break;
case Job:
switch (article.TypeID)
{
case Resume:
filterPanels.Add(ucSeniorityPanel);
filterPanels.Add(ucPricePanel);
filterPanels.Add(ucWorkSchedulePanel);
break;
case Vacancy:
filterPanels.Add(ucSeniorityPanel);
filterPanels.Add(ucPricePanel);
filterPanels.Add(ucWorkSchedulePanel);
break;
case Education:
filterPanels.Add(ucPricePanel);
break;
}
break;
}
siteRubricHelper.SetFilterOptions(panel);
public interface IRubricHelper
{
void SetFilterOptions(FilterPanel panel);
}

public class DefaultRubricHelper implements IRubricHelper
{
private FilterOptions ucSearchOptions;
public void SetFilterOptions(FilterPanel panel)
{
panel.Add(ucSearchOptions);
}
}
Стратегическая замкнутость
•
•
•
•

Замкнутость не может быть 100%
Замкнутость должна быть стратегической
Проектирование ради стратегической замкнутости
Паттерны проектирования – типовые примеры,
обеспечивающие определенные виды замкнутости
Принцип подстановки Б. Лисков
Метод, получающий по ссылке объект, должен
использовать этот объект без точного знания того,
объектом какого класса в иерархии наследования он
является.
(СТ 02.004-1995, стр. 2)
Пример 3: RTTI
void Draw(Shape s)
{
if (s instanceof Point)
{
DrawPoint(s as Point);
}
else if (s instanceof Circle)
{
DrawCircle(s as Circle);
}
else if(s instanceof Square)
{
DrawSquare(s as Square);
}
}
Пример 4: Rectangle и Square
class Rectangle
{
private double height;
private double width;
public double getHeight() { return height; }
public void setHeight(int value) { height = value; }
public double getWidth() { return width; }
public void setWidth(int value) { width = value; }
}
….
void f(Rectangle r)
{
r.setHeight (5);
r.setWidth (4);
Debug.Assert(r.getHeight() * r.getWidth() == 20);
}

class Square extends Rectangle
{
public void setHeight(int value)
{
super.setHeight(value);
super.setWidth(value);
}
public void setWidth(int value)
{
super.setHeight(value);
super.setWidth(value);
}
}
• Построенные абстракции нельзя проверить на
корректность сами по себе. Такую проверку можно
выполнить лишь в контексте клиентов, использующих
данные абстракции.
• Заранее построить очень гибкую модель “про запас”
нельзя!
• Лучше использовать прототипирование
Прототип – самый простой вариант чего-либо, но
содержащий самый сложный компонент.
Принцип обращения зависимостей
Программа Copy
void Copy()
{
int ch;
while ((ch = Keyboard()) != EOF)
{
WritePrinter(c);
}
}

enum OutputDevice
{
printer,
disk
};
void Copy(OutputDevice dev)
{
int c;
while ((c = ReadKeyboard()) != EOF)
{
if (dev == printer)
WritePrinter(c);
else
WriteDisk(c);
}
}
interface IReader
{
int Read();
}
interface IWriter
{
void Write(char) = 0;
}
…
void Copy(IReader r, IWriter w)
{
int c;
while((c=r.Read()) != EOF)
w.Write(c);
}
…
Схема зависимостей
• Высокоуровневые модули не должны зависеть от
низкоуровневых модулей. И те, и те должны зависеть
от абстракций.
• Абстракции не должны зависеть от деталей. Детали
должны зависеть от абстракций.
(СТ 02.005-1995, 6)
СЛОИ
Пример 5: Лампочка
class Lamp
{
public void TurnOn() {…}
public void TurnOff() {…}
}

class Button
{
private Lamp lamp;
public Button(Lamp lamp) {this.lamp = lamp;}
public void Detect()
{
if(GetPhisicalState())
{
lamp.TurnOn();
}
else
{
lamp.TurnOff();
}
}
}
interface IButtonClient
{
void TurnOn();
void TurnOff();
}

class Lamp
{
public void SwitchOn() {…}
public void SwitchOff() {…}
}

class Button
{
private IButtonClient client;
public Button(IButtonClient client)
{
this.client = client;
}
public void Detect()
{
if (GetPhisicalState())
{
client.TurnOn();
}
else
{
client.TurnOff();
}
}
}

class LampAdapter implements IButtonClient
{
private Lamp lamp;
public LampAdapter(Lamp lamp)
{
this.lamp = lamp;
}
public void TurnOn()
{
lamp.SwitchOn();
}
public void TurnOff()
{
lamp.SwitchOff();
}
}
• Сторонний код должен быть скрыт за обертками,
реализующими собственные интерфейсы (ПР 04.001)
• Обертки можно строить к старому наследуемому коду
• Переписывание не всегда самый лучший путь
Принцип соответствия интерфейсов
interface IButtonClient
{
void TurnOn();
void TurnOff();
}
Interface ITimerClient
{
void OnTimeout();
}
class Lamp implements IButtonCLient, ITimerClient
{
public void TurnOn() {…}
public void TurnOff() {…}
public void OnTimeout() {…}
}

class Button
{
private IButtonClient;
public Button(IButtonClient client) {…}
public void Detect() {…}
}

class Timer
{
private ITimerClient client;
public void Timeout()
{
…
client.OnTimeout();
…
}
}
class EmergencyLamp extends Lamp
{
public override void OnTimeout()
{
// нельзя включать и отключать по таймеру,
// поэтому пустая реализация
}
}

class Lamp implements IButtonClient
{
…
}
class ButtonToTimerClientAdapter implements ITimerClient
{
// см. пример адаптера для IButtonClient
}
Interface IEmergencyClient
{
void OnAlert();
}
class ButtonToEmergencyClientAdapter implements
IEmergencyClient
{
// см. пример адаптера для IButtonClient
}
• ITimerClient, IEmergencyClient, IButtonCLient – это разные
множества объектов, но которые частично пересекаются
• Жирные интерфейсы сигнализируют об ошибках в
проектировании
• Жирных интерфейсов следует избегать (ПР 02.006)
Исключение: применение паттерна Compositor
Клиенты не должны зависеть от тех интерфейсов,
которые они не используют
(СТ 02.006-1996, стр. 5)
• Абстракции нельзя проверить сами по себе, вне контекста
использования!!!
• Часто программисты делают предложения по
функционалу, основываясь на текущих возможностях
реализации
• Подход к программированию: программный код как
результат решения конкретной задачи
• Подход к программированию: писать программный код
как набор инструментов для решения задач
DI контейнеры как
расширяемые фабрики
package examples.di;
public interface Greeting
{
String greet();
}
package examples.di.impl;
import examples.di.Greeting;
public class GreetingImpl implements Greeting
{
public String greet()
{
return "Hello World!";
}
}
package examples.di;
public interface GreetingClient
{
void execute();
}
package examples.di.impl;
import examples.di.Greeting;
import examples.di.GreetingClient;
public class GreetingClientImpl implements GreetingClient
{
private Greeting greeting;
public GreetingClientImpl(Greeting greeting) { this.greeting = greeting; }
public void execute() { System.out.println(greeting.greet()); }
}
package examples.di.main;
import examples.di.Greeting;
import examples.di.impl.GreetingClientImpl;
import examples.di.impl.GreetingImpl;
public class GreetingMain
{
public static void main(String[] args)
{
Greeting greeting = new GreetingImpl();
GreetingClientImpl greetingClient = new GreetingClientImpl(greeting);
greetingClient.execute();
}
}
package examples.di.main;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
import examples.di.GreetingClient;
public class GreetingMain3
{
private static final String PATH = "examples/di/dicon/GreetingMain3.dicon";
public static void main(String[] args)
{
S2Container container = S2ContainerFactory.create(PATH);
GreetingClient greetingClient = new GreetingClientImpl(
container.getComponent("greeting”)
);
greetingClient.execute();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC"-//SEASAR//DTD S2Container 2.3//EN"
"http://www.seasar.org/dtd/components23.dtd">
<components>
<include path="aop.dicon"/>
<component name="greeting” class="examples.di.impl.GreetingImpl">
<aspect>aop.traceInterceptor</aspect>
</component>
</components>
package examples.di.impl;
import examples.di.Greeting;
import examples.di.GreetingClient;
public class GreetingClientImpl implements GreetingClient
{
private Greeting greeting;
public GreetingClientImpl()
{
S2Container container = S2ContainerFactory.create(PATH);
this.greeting = container.getComponent("greeting”);
}
public void execute() { System.out.println(greeting.greet()); }
}
Принцип единой ответственности
Должна быть ровно одна причина для изменения класса
• Классы должны быть компактными (ПР 02.007)
• Следует избегать глубоких иерархий классов (ПР 02.008)
Компоновка программы
• Разделяй и властвуй
• Структурирование
• Разная структура для разных объемов
• План выполнения запросов
• Объявления
Модули
Каков критерий разбиения программы на модули?
Взаимосвязи между модулями? Принцип организации
взаимосвязей?
Что первично: классы или модули?
Каким программным конструкциям соответствуют модули?
Какие цели преследуют модули?
Принципы сцепления модулей
Принцип эквивалентности единиц повторного
использования и релиза
Единица повторного использования является единицей
релиза. Только компоненты, которые реализуются через
систему управления проектами, могут быть
эффективно повторно использованы. Такой единицей
является модуль.
(СТ 02.007-1996, стр. 4)
Обобщенный принцип повторного использования
Классы, входящие в состав модуля повторно используются
все вместе. Если Вы повторно используете один, то Вам
доступны все остальные.
(СТ 02.007-1996, стр. 5)
Обобщенный принцип замкнутости
Классы, входящие в состав пакета, должны быть закрыты
по отношению к одним и тем же изменениям.
Изменение, влияющее на пакет, оказывает воздействие
на все классы, входящие в этот пакет (на затрагивая
другие пакеты)
(СТ 02.007-1996, стр. 6)
• В .Net модулем является сборка
• Разнесение классов по модулям нетривиальная задача
• Методы разнесения классов по модулям носит
динамический характер
• Сначала создаются классы, затем выделяются модули
• Движущая сила: смещения акцента от возможности
разработки до возможности повторного использования
• Один класс в одном файле (ПР 05.001)
Принципы связывания пакетов
Принцип ациклических зависимостей.
Граф зависимостей между модулями должен быть
ациклическим
(СТ 02.007-1996, стр. 6)
Пример 5: Ациклический граф
Пример 6: Циклический граф
Интеграционная штурмовщина
•
•
•
•

Еженедельный билд
Не успеваем вовремя его собрать, протестировать
Большие накладные расходы на сборку билда
Увеличиваются сроки между билдами

• Модули можно разрабатывать независимо друг от друга
• Релиз системы состоит из набора модулей, каждый из
которых имеет свою версию
• Product Manager
Стабильность
• Какие цели преследуют модули?
• Пример: программа копирования
• “Хорошая” зависимость – это зависимость от чего-то, что
не слишком часто меняется
• Как измерить насколько зависимость хорошая?
Стабильность – способность системы функционировать,
не изменяя собственную структуру и находиться в
равновесии в течение определенного промежутка
времени.
(Wikipedia.org)
Принцип стабильных зависимостей
Модули должны зависеть только от более стабильных
модулей.
(СТ 02.008-1996, стр. 8)
• Дизайн системы не может быть полностью стабильным

• Принцип обобщенной замкнутости
• Принцип единственной ответственности
Метрики стабильности
• Центростремительная связность (Ca) – количество
классов за пределами модуля, которые зависят от
классов внутри модуля
• Центробежная связность (Ce) – количество классов
внутри модуля, которые зависят от классов за
пределами модуля
• Коэффициент нестабильности (I): I = Ce/(Ce+Ca)
– I = 0 – максимально стабильный пакет
– I = 1 – максимально нестабильный пакет
Принцип стабильных абстракций
Модули, которые максимально стабильны должны быть
максимально абстрактны. Нестабильные модули
должны быть конкретны. Абстрактность модуля
должна быть обратно пропорциональна
нестабильности.
(СТ 02.008-1996, стр. 11)
Абстрактность модуля = Абстрактные классы и
интерфейсы/Общее число классов и интерфейсов
Итоги
• Изменения через написание нового без переписывания
старого
• Полностью от переписывания отказаться нельзя, поэтому
важно проектировать систему
• Цель проектирования – управлять замкнутостью
• Проектирование предшествует программированию
• Сначала классы, а потом модули
• Нет интеграционной штурмовщине
• Важно правильно разбивать систему на модули
• Интерфейсы рулят
• Проектирование
– Design Patterns
– Прототипирование как средство уменьшения рисков

• Существующий код
– Рефакторинг
– Фасады
– Автоматическое тестирование
Что дальше
•
•
•
•

Контрактная модель программирования
Design Patterns
Рефакторинг
Автоматическое тестирование
Вопросы?

More Related Content

What's hot

C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Anton Moiseenko
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.Igor Shkulipa
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Javametaform
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6Technopark
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Anton Moiseenko
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 

What's hot (11)

C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.Java Core. Lecture# 2. Classes & objects.
Java Core. Lecture# 2. Classes & objects.
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
Массивы в Java
Массивы в JavaМассивы в Java
Массивы в Java
 
ООП Лекция №1
ООП Лекция №1ООП Лекция №1
ООП Лекция №1
 
C++ осень 2013 лекция 6
C++ осень 2013 лекция 6C++ осень 2013 лекция 6
C++ осень 2013 лекция 6
 
Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.Java Core. Lecture# 3. Part# 1. Abstract classes.
Java Core. Lecture# 3. Part# 1. Abstract classes.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 

Viewers also liked

ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011etyumentcev
 
Esame Elective Patagonia EMBA Pelliciardi Fabio
Esame Elective Patagonia EMBA Pelliciardi FabioEsame Elective Patagonia EMBA Pelliciardi Fabio
Esame Elective Patagonia EMBA Pelliciardi FabioFabio Pelliciardi
 
3.內湖花市
3.內湖花市3.內湖花市
3.內湖花市淑貞 陳
 
Proyecto tic la esperanza
Proyecto tic la esperanzaProyecto tic la esperanza
Proyecto tic la esperanzaMauricio Lopez
 
Article Internet En Zonas Aisladas (15)
Article   Internet En Zonas Aisladas (15)Article   Internet En Zonas Aisladas (15)
Article Internet En Zonas Aisladas (15)gamyexample2161
 
ук 03.007.02 2011
ук 03.007.02 2011ук 03.007.02 2011
ук 03.007.02 2011etyumentcev
 
Silabus mat kelas x wajib (2013)
Silabus mat kelas x wajib (2013)Silabus mat kelas x wajib (2013)
Silabus mat kelas x wajib (2013)risninawafiqoh
 
ук 03.006.02 2011
ук 03.006.02 2011ук 03.006.02 2011
ук 03.006.02 2011etyumentcev
 
ук 03.005.02 2011
ук 03.005.02 2011ук 03.005.02 2011
ук 03.005.02 2011etyumentcev
 
1 bimestre
1 bimestre1 bimestre
1 bimestremtavo159
 
ук 03.009.01 2011
ук 03.009.01 2011ук 03.009.01 2011
ук 03.009.01 2011etyumentcev
 
ук 03.005.03 2011
ук 03.005.03 2011ук 03.005.03 2011
ук 03.005.03 2011etyumentcev
 
The Workspace of Tomorrow
The Workspace of TomorrowThe Workspace of Tomorrow
The Workspace of TomorrowUXC Connect
 
Isttm hyd ir v2.0
Isttm hyd ir v2.0Isttm hyd ir v2.0
Isttm hyd ir v2.0kongara
 

Viewers also liked (20)

ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
 
EPITELIOS DIAPORAMA
EPITELIOS DIAPORAMAEPITELIOS DIAPORAMA
EPITELIOS DIAPORAMA
 
Esame Elective Patagonia EMBA Pelliciardi Fabio
Esame Elective Patagonia EMBA Pelliciardi FabioEsame Elective Patagonia EMBA Pelliciardi Fabio
Esame Elective Patagonia EMBA Pelliciardi Fabio
 
Presentación1
Presentación1Presentación1
Presentación1
 
3.內湖花市
3.內湖花市3.內湖花市
3.內湖花市
 
Proyecto tic la esperanza
Proyecto tic la esperanzaProyecto tic la esperanza
Proyecto tic la esperanza
 
Article Internet En Zonas Aisladas (15)
Article   Internet En Zonas Aisladas (15)Article   Internet En Zonas Aisladas (15)
Article Internet En Zonas Aisladas (15)
 
трпо
трпотрпо
трпо
 
ук 03.007.02 2011
ук 03.007.02 2011ук 03.007.02 2011
ук 03.007.02 2011
 
Silabus mat kelas x wajib (2013)
Silabus mat kelas x wajib (2013)Silabus mat kelas x wajib (2013)
Silabus mat kelas x wajib (2013)
 
ук 03.006.02 2011
ук 03.006.02 2011ук 03.006.02 2011
ук 03.006.02 2011
 
ук 03.005.02 2011
ук 03.005.02 2011ук 03.005.02 2011
ук 03.005.02 2011
 
Bearings
BearingsBearings
Bearings
 
JUnit & AssertJ
JUnit & AssertJJUnit & AssertJ
JUnit & AssertJ
 
1 bimestre
1 bimestre1 bimestre
1 bimestre
 
ук 03.009.01 2011
ук 03.009.01 2011ук 03.009.01 2011
ук 03.009.01 2011
 
ук 03.005.03 2011
ук 03.005.03 2011ук 03.005.03 2011
ук 03.005.03 2011
 
The Workspace of Tomorrow
The Workspace of TomorrowThe Workspace of Tomorrow
The Workspace of Tomorrow
 
10
1010
10
 
Isttm hyd ir v2.0
Isttm hyd ir v2.0Isttm hyd ir v2.0
Isttm hyd ir v2.0
 

Similar to ук 03.001.02 2011

Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программированияConstantin Kichinsky
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real worldEPAM
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
javascript
javascriptjavascript
javascriptsovest
 
javascript_part1
javascript_part1javascript_part1
javascript_part1sovest
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 

Similar to ук 03.001.02 2011 (20)

Refactoring
RefactoringRefactoring
Refactoring
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Cтиль программирования
Cтиль программированияCтиль программирования
Cтиль программирования
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
javascript
javascriptjavascript
javascript
 
javascript_part1
javascript_part1javascript_part1
javascript_part1
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Tdd php
Tdd phpTdd php
Tdd php
 

More from etyumentcev

Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016
Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016
Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016etyumentcev
 
Платформа SmartActors
Платформа SmartActorsПлатформа SmartActors
Платформа SmartActorsetyumentcev
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?etyumentcev
 
Программирование глазами математика
Программирование глазами математикаПрограммирование глазами математика
Программирование глазами математикаetyumentcev
 
Большие данные: как могут навредить и ка могут помочь?
Большие данные: как могут навредить и ка могут помочь?Большие данные: как могут навредить и ка могут помочь?
Большие данные: как могут навредить и ка могут помочь?etyumentcev
 
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...etyumentcev
 
матлогика для программистов
матлогика для программистовматлогика для программистов
матлогика для программистовetyumentcev
 
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповetyumentcev
 
Как 7 студентов и филолог делали сложный проект
Как 7 студентов и филолог делали сложный проектКак 7 студентов и филолог делали сложный проект
Как 7 студентов и филолог делали сложный проектetyumentcev
 
разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4etyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1etyumentcev
 
высокопроизводиетльные системы без доп затрат
высокопроизводиетльные системы без доп затратвысокопроизводиетльные системы без доп затрат
высокопроизводиетльные системы без доп затратetyumentcev
 
зачем нужны системы управления проектами
зачем нужны системы управления проектамизачем нужны системы управления проектами
зачем нужны системы управления проектамиetyumentcev
 
введение в Sql
введение в Sqlвведение в Sql
введение в Sqletyumentcev
 
почему буксует тайм менеджмент
почему буксует тайм менеджментпочему буксует тайм менеджмент
почему буксует тайм менеджментetyumentcev
 
ук 03.011.01 2011
ук 03.011.01 2011ук 03.011.01 2011
ук 03.011.01 2011etyumentcev
 
ук 03.010.01 2011
ук 03.010.01 2011ук 03.010.01 2011
ук 03.010.01 2011etyumentcev
 
ук 03.002.01 2011
ук 03.002.01 2011ук 03.002.01 2011
ук 03.002.01 2011etyumentcev
 

More from etyumentcev (20)

Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016
Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016
Об опыте применения jsonb в реальных проектах. Выступление на PgConf.Russia 2016
 
Платформа SmartActors
Платформа SmartActorsПлатформа SmartActors
Платформа SmartActors
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
Программирование глазами математика
Программирование глазами математикаПрограммирование глазами математика
Программирование глазами математика
 
Большие данные: как могут навредить и ка могут помочь?
Большие данные: как могут навредить и ка могут помочь?Большие данные: как могут навредить и ка могут помочь?
Большие данные: как могут навредить и ка могут помочь?
 
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
 
матлогика для программистов
матлогика для программистовматлогика для программистов
матлогика для программистов
 
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принципов
 
Как 7 студентов и филолог делали сложный проект
Как 7 студентов и филолог делали сложный проектКак 7 студентов и филолог делали сложный проект
Как 7 студентов и филолог делали сложный проект
 
разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4разработка серверов и серверных приложений лекция №4
разработка серверов и серверных приложений лекция №4
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1разработка серверов и серверных приложений лекция №1
разработка серверов и серверных приложений лекция №1
 
высокопроизводиетльные системы без доп затрат
высокопроизводиетльные системы без доп затратвысокопроизводиетльные системы без доп затрат
высокопроизводиетльные системы без доп затрат
 
зачем нужны системы управления проектами
зачем нужны системы управления проектамизачем нужны системы управления проектами
зачем нужны системы управления проектами
 
введение в Sql
введение в Sqlвведение в Sql
введение в Sql
 
почему буксует тайм менеджмент
почему буксует тайм менеджментпочему буксует тайм менеджмент
почему буксует тайм менеджмент
 
ук 03.011.01 2011
ук 03.011.01 2011ук 03.011.01 2011
ук 03.011.01 2011
 
ук 03.010.01 2011
ук 03.010.01 2011ук 03.010.01 2011
ук 03.010.01 2011
 
ук 03.002.01 2011
ук 03.002.01 2011ук 03.002.01 2011
ук 03.002.01 2011
 

ук 03.001.02 2011

  • 3. Объектно-ориентированное программирование (ООП) – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования. (КН 02.002-1995, стр. 52) • Основным элементом абстракции являются объекты • Каждый объект является экземпляром определенного класса • Классы образуют иерархию наследования
  • 4. Ключевые характеристики ООП Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя. (КН 02.002-1995, стр. 55) • Внешнее поведение • Барьер абстракции • Неоднозначность выделения абстракции • Абстракция и объект реального мира – не одно и тоже (пример: вещественные числа и числа с плавающей точкой) • Задача: является ли квадрат прямоугольником?
  • 5. Инкапсуляция – это процесс отделения друг от друга элементов объекта, определяющих его устройство и поведение; инкапсуляция служит для того, чтобы изолировать контрактные обязательства абстракции от их реализации. (КН 02.002-1995, стр. 63) • Сокрытие данных лишь частный случай инкапсуляции • Поведение представляется только с помощью методов • Задача о множествах объектов
  • 6. Модульность – это свойство системы, которая может была разложена на внутренне связные, но слабо связанные между собой модули. (КН 02.002-1995, стр. 69) • Что первично класс или модуль? Иерархия – это упорядочивание абстракций, расположение их по уровням. (КН 02.002-1995, стр. 71) • “is a” (наследование) • “part of” (агрегация, композиция)
  • 8.
  • 9. Открыто-замкнутый принцип • Инкрементная разработка; • Количество строк кода, которые пишет программист, в единицу времени ограничено; • Если изменяется существующий код, то, скорее всего, прироста функционала не происходит; • Повторное использование. Программная сущность (класс, модуль, функция и т.д.) должна быть открыта для расширения, но закрыта для модификаций. (СТ 02.003-1995, стр. 1)
  • 10. Наследование ООП позволяет задавать фиксированную абстракцию, но описывающую неограниченную группу возможных поведений. Поведение – это то, как объект действует и реагирует; поведение выражается в терминах состояния объекта и передачи сообщений. (КН 02.002-1995, стр. 96) Необходимо избегать конструкций, которые создают закрытое множество поведений: • switch (ПР 02.001) • Цепочка if/else (ПР 02.002) • Информация о типе во время выполнения (ПР 02.003) • Перечислимые типы (ПР 02.004) • Дублирование кода (ПР 01.001) • Все поля должны быть private (ПР 02.005) • Избегать использование глобальных переменных (ПР 01.002)
  • 11. Пример 1: Геометрические фигуры class Shape { private ShapeType itsType; private void DrawSquare(); private void DrawCircle(); public static void DrawAllShapes(Shape[] list) { for(Shape s : list) { switch (s.itsType) { case square: DrawSquare(); break; case circle: DrawCircle(); break; } } } }
  • 12. interface Shape { void Draw(); } class ShapeUtils { public static void DrawAllShapes(Shape[] list) { for(Shape s: list) { s.Draw(); } } } class Square implements Shape { public void Draw() { } }
  • 13. Пример 2: Рубрикатор switch (article.Rubric) { case Auto: case Realty: filterPanels.Add(ucSearchOptions); break; case Job: switch (article.TypeID) { case Resume: filterPanels.Add(ucSeniorityPanel); filterPanels.Add(ucPricePanel); filterPanels.Add(ucWorkSchedulePanel); break; case Vacancy: filterPanels.Add(ucSeniorityPanel); filterPanels.Add(ucPricePanel); filterPanels.Add(ucWorkSchedulePanel); break; case Education: filterPanels.Add(ucPricePanel); break; } break; }
  • 14. siteRubricHelper.SetFilterOptions(panel); public interface IRubricHelper { void SetFilterOptions(FilterPanel panel); } public class DefaultRubricHelper implements IRubricHelper { private FilterOptions ucSearchOptions; public void SetFilterOptions(FilterPanel panel) { panel.Add(ucSearchOptions); } }
  • 15. Стратегическая замкнутость • • • • Замкнутость не может быть 100% Замкнутость должна быть стратегической Проектирование ради стратегической замкнутости Паттерны проектирования – типовые примеры, обеспечивающие определенные виды замкнутости
  • 16. Принцип подстановки Б. Лисков Метод, получающий по ссылке объект, должен использовать этот объект без точного знания того, объектом какого класса в иерархии наследования он является. (СТ 02.004-1995, стр. 2)
  • 17. Пример 3: RTTI void Draw(Shape s) { if (s instanceof Point) { DrawPoint(s as Point); } else if (s instanceof Circle) { DrawCircle(s as Circle); } else if(s instanceof Square) { DrawSquare(s as Square); } }
  • 18. Пример 4: Rectangle и Square class Rectangle { private double height; private double width; public double getHeight() { return height; } public void setHeight(int value) { height = value; } public double getWidth() { return width; } public void setWidth(int value) { width = value; } } …. void f(Rectangle r) { r.setHeight (5); r.setWidth (4); Debug.Assert(r.getHeight() * r.getWidth() == 20); } class Square extends Rectangle { public void setHeight(int value) { super.setHeight(value); super.setWidth(value); } public void setWidth(int value) { super.setHeight(value); super.setWidth(value); } }
  • 19. • Построенные абстракции нельзя проверить на корректность сами по себе. Такую проверку можно выполнить лишь в контексте клиентов, использующих данные абстракции. • Заранее построить очень гибкую модель “про запас” нельзя! • Лучше использовать прототипирование Прототип – самый простой вариант чего-либо, но содержащий самый сложный компонент.
  • 20. Принцип обращения зависимостей Программа Copy void Copy() { int ch; while ((ch = Keyboard()) != EOF) { WritePrinter(c); } } enum OutputDevice { printer, disk }; void Copy(OutputDevice dev) { int c; while ((c = ReadKeyboard()) != EOF) { if (dev == printer) WritePrinter(c); else WriteDisk(c); } }
  • 21. interface IReader { int Read(); } interface IWriter { void Write(char) = 0; } … void Copy(IReader r, IWriter w) { int c; while((c=r.Read()) != EOF) w.Write(c); } …
  • 23. • Высокоуровневые модули не должны зависеть от низкоуровневых модулей. И те, и те должны зависеть от абстракций. • Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. (СТ 02.005-1995, 6)
  • 25. Пример 5: Лампочка class Lamp { public void TurnOn() {…} public void TurnOff() {…} } class Button { private Lamp lamp; public Button(Lamp lamp) {this.lamp = lamp;} public void Detect() { if(GetPhisicalState()) { lamp.TurnOn(); } else { lamp.TurnOff(); } } }
  • 26. interface IButtonClient { void TurnOn(); void TurnOff(); } class Lamp { public void SwitchOn() {…} public void SwitchOff() {…} } class Button { private IButtonClient client; public Button(IButtonClient client) { this.client = client; } public void Detect() { if (GetPhisicalState()) { client.TurnOn(); } else { client.TurnOff(); } } } class LampAdapter implements IButtonClient { private Lamp lamp; public LampAdapter(Lamp lamp) { this.lamp = lamp; } public void TurnOn() { lamp.SwitchOn(); } public void TurnOff() { lamp.SwitchOff(); } }
  • 27. • Сторонний код должен быть скрыт за обертками, реализующими собственные интерфейсы (ПР 04.001) • Обертки можно строить к старому наследуемому коду • Переписывание не всегда самый лучший путь
  • 28. Принцип соответствия интерфейсов interface IButtonClient { void TurnOn(); void TurnOff(); } Interface ITimerClient { void OnTimeout(); } class Lamp implements IButtonCLient, ITimerClient { public void TurnOn() {…} public void TurnOff() {…} public void OnTimeout() {…} } class Button { private IButtonClient; public Button(IButtonClient client) {…} public void Detect() {…} } class Timer { private ITimerClient client; public void Timeout() { … client.OnTimeout(); … } }
  • 29. class EmergencyLamp extends Lamp { public override void OnTimeout() { // нельзя включать и отключать по таймеру, // поэтому пустая реализация } } class Lamp implements IButtonClient { … } class ButtonToTimerClientAdapter implements ITimerClient { // см. пример адаптера для IButtonClient } Interface IEmergencyClient { void OnAlert(); } class ButtonToEmergencyClientAdapter implements IEmergencyClient { // см. пример адаптера для IButtonClient }
  • 30. • ITimerClient, IEmergencyClient, IButtonCLient – это разные множества объектов, но которые частично пересекаются • Жирные интерфейсы сигнализируют об ошибках в проектировании • Жирных интерфейсов следует избегать (ПР 02.006) Исключение: применение паттерна Compositor
  • 31. Клиенты не должны зависеть от тех интерфейсов, которые они не используют (СТ 02.006-1996, стр. 5)
  • 32. • Абстракции нельзя проверить сами по себе, вне контекста использования!!! • Часто программисты делают предложения по функционалу, основываясь на текущих возможностях реализации • Подход к программированию: программный код как результат решения конкретной задачи • Подход к программированию: писать программный код как набор инструментов для решения задач
  • 33. DI контейнеры как расширяемые фабрики package examples.di; public interface Greeting { String greet(); } package examples.di.impl; import examples.di.Greeting; public class GreetingImpl implements Greeting { public String greet() { return "Hello World!"; } }
  • 34. package examples.di; public interface GreetingClient { void execute(); } package examples.di.impl; import examples.di.Greeting; import examples.di.GreetingClient; public class GreetingClientImpl implements GreetingClient { private Greeting greeting; public GreetingClientImpl(Greeting greeting) { this.greeting = greeting; } public void execute() { System.out.println(greeting.greet()); } }
  • 35. package examples.di.main; import examples.di.Greeting; import examples.di.impl.GreetingClientImpl; import examples.di.impl.GreetingImpl; public class GreetingMain { public static void main(String[] args) { Greeting greeting = new GreetingImpl(); GreetingClientImpl greetingClient = new GreetingClientImpl(greeting); greetingClient.execute(); } }
  • 36. package examples.di.main; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; import examples.di.GreetingClient; public class GreetingMain3 { private static final String PATH = "examples/di/dicon/GreetingMain3.dicon"; public static void main(String[] args) { S2Container container = S2ContainerFactory.create(PATH); GreetingClient greetingClient = new GreetingClientImpl( container.getComponent("greeting”) ); greetingClient.execute(); } }
  • 37. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC"-//SEASAR//DTD S2Container 2.3//EN" "http://www.seasar.org/dtd/components23.dtd"> <components> <include path="aop.dicon"/> <component name="greeting” class="examples.di.impl.GreetingImpl"> <aspect>aop.traceInterceptor</aspect> </component> </components>
  • 38. package examples.di.impl; import examples.di.Greeting; import examples.di.GreetingClient; public class GreetingClientImpl implements GreetingClient { private Greeting greeting; public GreetingClientImpl() { S2Container container = S2ContainerFactory.create(PATH); this.greeting = container.getComponent("greeting”); } public void execute() { System.out.println(greeting.greet()); } }
  • 39. Принцип единой ответственности Должна быть ровно одна причина для изменения класса • Классы должны быть компактными (ПР 02.007) • Следует избегать глубоких иерархий классов (ПР 02.008)
  • 40. Компоновка программы • Разделяй и властвуй • Структурирование • Разная структура для разных объемов • План выполнения запросов • Объявления
  • 41. Модули Каков критерий разбиения программы на модули? Взаимосвязи между модулями? Принцип организации взаимосвязей? Что первично: классы или модули? Каким программным конструкциям соответствуют модули? Какие цели преследуют модули?
  • 42. Принципы сцепления модулей Принцип эквивалентности единиц повторного использования и релиза Единица повторного использования является единицей релиза. Только компоненты, которые реализуются через систему управления проектами, могут быть эффективно повторно использованы. Такой единицей является модуль. (СТ 02.007-1996, стр. 4)
  • 43. Обобщенный принцип повторного использования Классы, входящие в состав модуля повторно используются все вместе. Если Вы повторно используете один, то Вам доступны все остальные. (СТ 02.007-1996, стр. 5) Обобщенный принцип замкнутости Классы, входящие в состав пакета, должны быть закрыты по отношению к одним и тем же изменениям. Изменение, влияющее на пакет, оказывает воздействие на все классы, входящие в этот пакет (на затрагивая другие пакеты) (СТ 02.007-1996, стр. 6)
  • 44. • В .Net модулем является сборка • Разнесение классов по модулям нетривиальная задача • Методы разнесения классов по модулям носит динамический характер • Сначала создаются классы, затем выделяются модули • Движущая сила: смещения акцента от возможности разработки до возможности повторного использования • Один класс в одном файле (ПР 05.001)
  • 45. Принципы связывания пакетов Принцип ациклических зависимостей. Граф зависимостей между модулями должен быть ациклическим (СТ 02.007-1996, стр. 6)
  • 48.
  • 49. Интеграционная штурмовщина • • • • Еженедельный билд Не успеваем вовремя его собрать, протестировать Большие накладные расходы на сборку билда Увеличиваются сроки между билдами • Модули можно разрабатывать независимо друг от друга • Релиз системы состоит из набора модулей, каждый из которых имеет свою версию • Product Manager
  • 50. Стабильность • Какие цели преследуют модули? • Пример: программа копирования • “Хорошая” зависимость – это зависимость от чего-то, что не слишком часто меняется • Как измерить насколько зависимость хорошая? Стабильность – способность системы функционировать, не изменяя собственную структуру и находиться в равновесии в течение определенного промежутка времени. (Wikipedia.org)
  • 51. Принцип стабильных зависимостей Модули должны зависеть только от более стабильных модулей. (СТ 02.008-1996, стр. 8) • Дизайн системы не может быть полностью стабильным • Принцип обобщенной замкнутости • Принцип единственной ответственности
  • 52. Метрики стабильности • Центростремительная связность (Ca) – количество классов за пределами модуля, которые зависят от классов внутри модуля • Центробежная связность (Ce) – количество классов внутри модуля, которые зависят от классов за пределами модуля • Коэффициент нестабильности (I): I = Ce/(Ce+Ca) – I = 0 – максимально стабильный пакет – I = 1 – максимально нестабильный пакет
  • 53. Принцип стабильных абстракций Модули, которые максимально стабильны должны быть максимально абстрактны. Нестабильные модули должны быть конкретны. Абстрактность модуля должна быть обратно пропорциональна нестабильности. (СТ 02.008-1996, стр. 11) Абстрактность модуля = Абстрактные классы и интерфейсы/Общее число классов и интерфейсов
  • 54.
  • 55. Итоги • Изменения через написание нового без переписывания старого • Полностью от переписывания отказаться нельзя, поэтому важно проектировать систему • Цель проектирования – управлять замкнутостью • Проектирование предшествует программированию • Сначала классы, а потом модули • Нет интеграционной штурмовщине • Важно правильно разбивать систему на модули • Интерфейсы рулят
  • 56. • Проектирование – Design Patterns – Прототипирование как средство уменьшения рисков • Существующий код – Рефакторинг – Фасады – Автоматическое тестирование
  • 57. Что дальше • • • • Контрактная модель программирования Design Patterns Рефакторинг Автоматическое тестирование