12 architecture

33
Архітектура Програмного Забезпечення

Upload: eleksdev

Post on 10-May-2015

1.826 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 12 Architecture

Архітектура Програмного Забезпечення

Page 2: 12 Architecture

Архітектура визначає:

• Основні компоненти програми.

• Обов’язки кожного компонента.

Page 3: 12 Architecture

Приклад архітектури:

Page 4: 12 Architecture

Дизайн Класів

Page 5: 12 Architecture

Принципи дизайну класів• Хороші класи – класи, спроектовані за

принципами SOLID:

• Single Responsibility Principle• Open Closed Principle• Liskov Substitution Principle• Interface Segregation Principle• Dependency inversion principle

Page 6: 12 Architecture

Single Responsibility Principle (SRP)Принцип Єдиного Обов’язку

Клас має бути створений для виконання лише однієї задачі.

Page 7: 12 Architecture

public class Employee{

private String name;

public String GetName() { return name; }

public void PrintReport() //це не має входити в обовязки {

//робітника}

}

Page 8: 12 Architecture

Недоліки коду, показаного вище:1. Складність розуміння.2. Складність повторного використання.3. Складність підтримки коду.4. Ненадійність, велика ймовірність зміни класу,

при потребі зміни будь – яких аспектів системи

кому таке треба?

Page 9: 12 Architecture

Зв’язність (Cohesion)Зв’язність – міра взаємоповязаності всередині модуля (класу).

Клас з високою зв’язністю має чітко звязані між собою обовязки, він призначений для виконання однієї задачі.

Page 10: 12 Architecture

public class Employee { private String name;

public String GetName() { return name; } }

//клас Reporter друкує звіт про певного робітника. //кожен клас має свою зону відповідальності public class Reporter { public void PrintReport(Employee worker) { } }

Page 11: 12 Architecture

Переваги SRP

+ Запобігає дублюванню коду.

+ Мінімізує кількість коду, який потрібно змінити в разі змін потреб до програмного продукту.

+ Полегшує розуміння коду.

Page 12: 12 Architecture

Open Closed Principle (OSP)Принцип Відкритості/Закритості

Клас має бути відкритий для розширення, але закритий для змін.

Це означає, що нова поведінка в програмі повинна додаватись шляхом додавання нових сутностей, а не зміни старих.

Page 13: 12 Architecture

public enum MessageType { SMS, EMAIL };

 

public class Message{

private MessageType type;

  public MessageType GetMessageType() {

return type;}

}

  public class MessageSender{ 

private void sendSMS(Message msg){//... send message as SMS}

  private void sendEmail(Message msg){//... Send message as Email}

 

public void Send(Message msg){

if (msg.GetType() == MessageType.SMS)

sendSMS(msg);

else if (msg.GetType() == MessageType.EMAIL)

sendEmail(msg); }

  }

//!!! зверніть увагу на метод "Send" - тут визначення того, який метод викликати, //відбувається в залежності від значеня поля msg

Page 14: 12 Architecture
Page 15: 12 Architecture

Зв’язаність (Coupling)

Зв’язаність (залежність) – це характеристика класу, яка визначає ступінь взаємодії модуля (класу) з іншими модулями

Page 16: 12 Architecture

public class SMSMessage : IMessage { public void Send() { //...send SMS Message } } public class EmailMessage : IMessage { public void Send() { //...send Email Message } }

public class MessageSender{ private void SendMessage(IMessage msg) { msg.Send(); } }

//обидва класи (SMSMessage і EmailMessage) реалізують інтерфейс IMessage,//і тепер самі підкласи вирішують, який саме меод буде викликаний

Page 17: 12 Architecture
Page 18: 12 Architecture

Liskov Substitution Principle (LSP)Принцип підстановки Лісков

Об’єкти в ієрархії класів можуть бути замінені на їх підтипи без порушення

цілісності системи.

Page 19: 12 Architecture

Interface segregation principle (ISP)Принцип розділення інтерфейсу

Клієнти не повинні залежати від методів, які вони не використовують.

Даний принцип означає, що занадто великі інтерфейси необхідно розділяти на менші та специфічні, щоб їх клієнти знали лише про ті методи, що необхідні для них у роботі

Page 20: 12 Architecture

public interface IAnimal { void Eat(); void Fly(); void Bark(); }

public class Dog : IAnimal{ public void Eat() { //some realization }

public void Fly() {

throw new NotImplementedException(); }

public void Bark() { //some realization }}

public class Bird : IAnimal{ public void Eat() { //some realization }

public void Fly() { //some realization }

public void Bark() { throw new NotImplementedException(); }}

Page 21: 12 Architecture

public interface

IAnimal { void Eat(); }

public interfaceIFlyable

{ void Fly(); }

public interfaceIBarkable

{ void Bark(); }

public class Bird : IAnimal, IFlyable{ public void Eat() { // some realization }

public void Fly() { // some realization }}

public class Dog : IAnimal, IBarkable{ public void Eat() { // some realization }

public void Bark() { // some realization }}

Page 22: 12 Architecture

Dependency Inversion Principle (DIP)Принцип інверсії залежностей

• Модулі верхнього рівня не повинні залежати від модулів нижнього рівня. Обидва повинні залежати від абстракції.

• Абстракції не повинні залежати від деталей реалізацій. Деталі повинні залежати від абстракцій.

Page 23: 12 Architecture

Шаблони Проектування

Page 24: 12 Architecture

ЧИ БУЛА ЦЯ ЗАДАЧА ВИРІШЕНА ДО МЕНЕ?

Page 25: 12 Architecture

Патерни проектування - це готові прийоми вирішення задач проектування програмного забезпечення, які перевірені часом та практикою.

Інколи ми використовуємо патерни, навіть не задумуючись про це.

Література:

1. “Дизайн-патерни – просто як двері“ Андрій Будай2. “Head First Design Patterns” Freeman E.T., Freeman E. (є російський переклад)3. “Design Patterns: Elements of Reusable Object-Oriented Software” Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. (є російський переклад)

Page 26: 12 Architecture

Практика, практика і знову практика...

Page 27: 12 Architecture

Сінглтон (одинак)

Page 28: 12 Architecture

Одинак — шаблон проектування, який

- гарантує, що клас матиме тільки один екземпляр.

- забезпечує глобальну точку доступу до цього екземпляра.

Page 29: 12 Architecture

public class Singleton {

//статичний закритий обєкт private static Singleton instance;

  //конструктор закритий! private Singleton() { } //відкладена ініціалізація public static Singleton getInstance() { if (instance == null) instance = new Singleton();  return instance; } }

Page 30: 12 Architecture

Адаптер

Адаптує інтерфейс одного класу в інший, очікуваний клієнтом.

Page 31: 12 Architecture

Адаптер забезпечує роботу класів з несумісними інтерфейсами

Page 32: 12 Architecture

Адаптер public class Fish { public void swim() { /*some realization*/ } }

public class Hatchet { public void sink() { /*some realization*/ } }

public class HatchetToFishAdapter : Fish { private Hatchet hatchet;  public void swim() { hatchet.sink(); } }

Page 33: 12 Architecture

Дякую за увагу!