7. public class Employee
{
private String name;
public String GetName()
{
return name;
}
public void PrintReport() //це не має входити в обовязки
{
//робітника
}
}
8. Недоліки коду, показаного вище:
1.
2.
3.
4.
Складність розуміння.
Складність повторного використання.
Складність підтримки коду.
Ненадійність, велика ймовірність зміни класу,
при потребі зміни будь – яких аспектів системи
кому таке треба?
9. Зв’язність (Cohesion)
Зв’язність – міра взаємоповязаності всередині
модуля (класу).
Клас з високою зв’язністю має чітко звязані між
собою обовязки, він призначений для виконання
однієї задачі.
10. public class Employee
{
private String name;
public String GetName()
{
return name;
}
}
//клас Reporter друкує звіт про певного робітника.
//кожен клас має свою зону відповідальності
public class Reporter
{
public void PrintReport(Employee worker)
{
}
}
11. Переваги SRP
+ Запобігає дублюванню коду.
+ Мінімізує кількість коду, який потрібно змінити в
разі змін потреб до програмного продукту.
+ Полегшує розуміння коду.
12. Open Closed Principle (OSP)
Принцип Відкритості/Закритості
Клас має бути відкритий для розширення,
але закритий для змін.
Це означає, що нова поведінка в програмі
повинна додаватись шляхом додавання нових
сутностей, а не зміни старих.
13. 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
16. 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,
//і тепер самі підкласи вирішують, який саме меод буде викликаний
17.
18. Liskov Substitution Principle (LSP)
Принцип підстановки Лісков
Об’єкти в ієрархії класів можуть бути
замінені на їх підтипи без порушення
цілісності системи.
19. Interface segregation principle (ISP)
Принцип розділення інтерфейсу
Клієнти не повинні залежати від методів,
які вони не використовують.
Даний принцип означає, що занадто
великі інтерфейси необхідно розділяти на
менші та специфічні, щоб їх клієнти знали лише
про ті методи, що необхідні для них у роботі
20. public interface IAnimal
{
void Eat();
void Fly();
void Bark();
}
public class Dog : IAnimal
{
public void Eat()
{ //some realization }
public class Bird : IAnimal
{
public void Eat()
{ //some realization }
public void Fly()
{
throw new NotImplementedException();
}
public void Fly()
{ //some realization }
public void Bark()
{
throw new NotImplementedException();
}
public void Bark()
{ //some realization }
}
}
21. public interface
IAnimal
{
void Eat();
}
public interface
IFlyable
{
void Fly();
}
public class Bird : IAnimal, IFlyable
{
public void Eat()
{
// some realization
}
public class Dog : IAnimal, IBarkable
{
public void Eat()
{
// some realization
}
public void Fly()
{
// some realization
}
}
public interface
IBarkable
{
void Bark();
}
public void Bark()
{
// some realization
}
}
22. Dependency Inversion Principle (DIP)
Принцип інверсії залежностей
• Модулі верхнього рівня не повинні залежати від
модулів нижнього рівня. Обидва повинні
залежати від абстракції.
• Абстракції не повинні залежати від деталей
реалізацій. Деталі повинні залежати від
абстракцій.
25. Патерни проектування - це готові прийоми
вирішення задач проектування програмного
забезпечення, які перевірені часом та практикою.
Інколи ми використовуємо патерни, навіть не
задумуючись про це.
Література:
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. (є російський переклад)
32. Адаптер
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();
}
}