dir.by  
  Search  
Programming, development, testing
Паттерны, шаблоны проектирования | принципы ООП | рефакторинг кода
Single Responsibility Principle (Принцип единственной обязанности) SOLID проектирование
  Looked at 5017 times    
 Single Responsibility Principle (Принцип единственной обязанности) SOLID проектирование 
last updated: 18 October 2018
Класс должен иметь только одну ответственность, одно назначение (класс выполняет лишь одну задачу).

Принцип единственной ответственности означает что каждый объект должен иметь одну ответственность и эта ответственность должна быть полностью инкапсулирована в класс. Все его поведения должны быть направлены исключительно на обеспечение этой ответственности.
Рассмотрим пример Книга
Напишем класс Book
  C#     Создаем новое C# консольное приложение... и напишем код
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
     // класс Book
     class Book
     {
          // информация о книге
          public string BookName { get; set; }
          public string AuthorName { get; set; }
          public string Content { get; set; }

          // отображение книги
          public void Show(IDevice device)
          {
               string text = String.Format("Название:{0}, автор:{1}, текст:{2}", BookName, AuthorName, Content);
               device.Display(text);
          }
     }

     // интерфейс IDevice
     interface IDevice
     {
          void Display(string data);
     }

     // класс WindowsConsole реализует интерфейс IDevice
     class WindowsConsole : IDevice
     {
          public void Display(string text)
          {
               Console.WriteLine(text);
          }
     }

     // главный класс программы
     class Program
     {
          static void Main(string[] args)
          {
               // создаем книгу
               Book book1 = new Book();

               // заполняем книгу
               book1.BookName = "Властелин Колец";
               book1.AuthorName = "Толкин";
               book1.Content = "Когда-то давным давно жили эльфы... Эльфы пили молоко и кушали сыр...";

               // показываем книгу на экране
               IDevice device = new WindowsConsole();
               book1.Show(device);
               // на экране увидим
               // Название:Властелин Колец, автор:Толкин, текст:Когда-то давным давно жили эльфы... Эльфы пили молоко и кушали сыр...
          }
     }
}
В примере класс Book выполняет 2 задачи:

Задача 1. Представление данных о книге (название книги, имя автора, текст книги).
За это отвечают свойства Book.BookName, Book.AuthorName, Book.Content

Задача 2. Отображение книги на устройстве IDevice.
За это отвечает метод Book.Show(IDevice device)

2 задачи нарушают Принцип единственной обязанности.
Исправим пример Book, чтобы соответствовал Принципу единственной обязанности
Разделим класс Book на два класса:
класс Book
класс BookDisplay
  C#  
using System;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
     // класс Book
     class Book
     {
          // информация о книге
          public string BookName { get; set; }
          public string AuthorName { get; set; }
          public string Content { get; set; }
     }

     // класс BookDisplay
     class BookDisplay
     {
          // отображение книги
          public void Show(Book book, IDevice device)
          {
               string text = String.Format("Название:{0}, автор:{1}, текст:{2}", book.BookName, book.AuthorName, book.Content);
               device.Display(text);
          }
     }

     // интерфейс IDevice
     interface IDevice
     {
          void Display(string data);
     }

     // класс WindowsConsole реализует интерфейс IDevice
     class WindowsConsole : IDevice
     {
          public void Display(string text)
          {
               Console.WriteLine(text);
          }
     }

     // главный класс программы
     class Program
     {
          static void Main(string[] args)
          {
               Book book1 = new Book();

               // заполняем книгу
               book1.BookName = "Властелин Колец";
               book1.AuthorName = "Толкин";
               book1.Content = "Когда-то давным давно жили эльфы... Эльфы пили молоко и кушали сыр...";

               // показываем книгу на экране
               IDevice device = new WindowsConsole();
               BookDisplay bookDisplay = new BookDisplay();
               bookDisplay.Show(book1, device);
               // на экране увидим
               // Название:Властелин Колец, автор:Толкин, текст:Когда-то давным давно жили эльфы... Эльфы пили молоко и кушали сыр...
          }
     }
}
Сейчас в примере:
Класс Book выполняет 1 задачу это представление данных о книге.
Класс BookDisplay выполняет 1 задачу это отображение книги Book на устройстве IDevice.

Итог!
Класс Book соответствует Принципу единственной обязанности
Класс BookDisplay соответствует Принципу единственной обязанности
Принцип единственной обязанности в библиотеке C#
В библиотеке C# есть класс ArrayList (массив элементов, которые можно добавлять, удалять, перебирать).
То есть класс ArrayList выполняет 1 задачу по работе с элементами и соответствует Принципу единственной обязанности.
Принципу единственной обязанности соответствуют все классы коллекций в C#...
 
← Previous topic
Что такое SOLID ?
 
Next topic →
Open/Closed Principle (Принцип открытости/закрытости) SOLID проектирование
 
Your feedback ... Comments ...
   
Your Name
Your comment (www links can only be added by a logged-in user)

  Объявления  
  Объявления  
 
Введение
Что такое подкласс или дочерний класс или наследник класса? Что такое родительский класс ?
Принципы ООП
Что такое Объектно-ориентированное программирование? Принципы: абстрагирование, инкапсуляция, наследование, полиморфизм
Рефакторинг кода
Что такое рефакторинг кода ?
Шаблоны проектирования
Порождающие паттерны
Фабричный метод (Factory Method) это порождающий шаблон проектирования
Абстрактная фабрика (Abstract Factory) это порождающий шаблон проектирования
Одиночка (Singleton) это порождающий шаблон проектирования
Прототип (Prototype) это порождающий шаблон проектирования
Строитель (Builder) это порождающий шаблон проектирования

Паттерны поведения
Стратегия (Strategy) это поведенческий шаблон проектирования
S.O.L.I.D. (5 принципов проектирования программы)
Что такое SOLID ?
Single Responsibility Principle (Принцип единственной обязанности) SOLID проектирование
Open/Closed Principle (Принцип открытости/закрытости) SOLID проектирование

  Ваши вопросы присылайте по почте: info@dir.by  
Яндекс.Метрика