Принцип единой ответственности - Трудно увидеть пример? - PullRequest
4 голосов
/ 30 сентября 2010

Я только что прочитал о Принципе единой ответственности, и в какой-то момент Роберт К. Мартин заявляет, что иногда трудно понять, что класс несет более одной ответственности.

Может ли кто-нибудь привести примертакой класс?

Ответы [ 2 ]

4 голосов
/ 30 сентября 2010

Рассмотрим HTTP-класс, который имеет методы

  • Получить (URL-адрес)
  • SendRequest (запрос строки)

Оба эти метода связаны с HTTP. Однако Get и SendRequest имеют различных уровней абстракции . Get может фактически использовать SendRequest для отправки запроса GET. Следовательно, SendRequest должен относиться к низкоуровневому классу HTTP, а Get - к высокоуровневому классу HTTP, который использует низкоуровневый класс.

2 голосов
/ 30 сентября 2010

Забавно, потому что другой пользователь StackOverflow показывает такой пример пару часов назад в своем вопросе .

Рассмотрим этот класс:

[Serializable]
class MyClass
{
  //Serializable fields
  public void Save()
  {
     //Saving data into file
  }

  public void Load()
  {
    //Loading data from file
  }
}

Этот класс (MyClass) имеет несколько отдельных ролей:

  1. Этот класс является сериализуемым

  2. Этот класс может сохранять свое состояние в некотором хранилище

Во многих случаях это не очень хорошая идея, потому что мы не можем легко повторно использовать эту сериализуемую сущность, когда хотим изменить наше постоянное хранилище с простого двоичного файла на файл XML или на удаленное хранилище.(например, через WCF).

Вы можете создать подклассы, что-то вроде MyClassWCFSaver, но даже в этом случае намного проще использовать сериализуемый класс MyClass и независимую иерархию MyClassSavers (с несколькими различными подклассами для xml, двоичного илиХранилища WCF)

Кстати, поэтому во многих ORM мы часто отличаем сущности от хранилища (см. Шаблон хранилища ).

...