Каков пример принципа единой ответственности?

Может ли кто-нибудь дать мне пример принципа единой ответственности? Я пытаюсь понять, что на практике означает, что у класса есть одна ответственность, поскольку я боюсь, что я, вероятно, ежедневно нарушаю это правило.

Ответ 1

Ознакомьтесь с подробное описание.

Если вы не попросите что-то более конкретное, вам будет сложно помочь больше.

Единая ответственность - это понятие класса, выполняющего одну конкретную вещь (ответственность) и не пытающегося сделать больше, чем нужно, что также называется высокой сплоченностью.

Классы не часто начинаются с Low Cohesion, но, как правило, после нескольких выпусков и разных разработчиков, добавляющих на них, внезапно вы заметите, что это стало монстром или классом Бога, как его называют некоторые. Поэтому класс должен быть реорганизован.

Сложно подумать о хорошем примере, но в последнее время я могу подумать, что это класс, который управляет различными этапами обработки пакетов, типа Chain of Responsibility. Первоначальное намерение этого класса состояло в том, чтобы сохранить список этапов и организовать для них вызов packetProcess(). Что ж, все закончилось тем, что все добавили что-либо, связанное с этапами обработки (поскольку класс менеджера был простым местом для доступа к этапам) к этому классу менеджера, особенно к конфигурации этапа. В классе менеджера больше не было единой ответственности, но вместо этого он также отвечал за вызовы на этапы изменения конфигурации: таким образом, Cohesion была уменьшена.

В итоге нам пришлось реорганизовать класс менеджера, вырвать всю конфигурацию сцены и поместить его в factory, оставив менеджером делать то, что он должен был делать.

Ответ 2

Самый эффективный способ разбить приложения на создание классов GOD. Это классы, которые отслеживают много информации и имеют несколько обязанностей. Одно изменение кода, скорее всего, затронет другие части класса и, следовательно, косвенно всех других классов, которые его используют. Это, в свою очередь, приводит к еще большему обслуживанию, поскольку никто не смеет делать какие-либо изменения, кроме добавления в него новых функций.

Следующий пример - это класс TypeScript, который определяет Person, этот класс не должен включать проверку электронной почты, поскольку это не связано с поведением человека:

class Person {
    public name : string;
    public surname : string;
    public email : string;
    constructor(name : string, surname : string, email : string){
        this.surname = surname;
        this.name = name;
        if(this.validateEmail(email)) {
          this.email = email;
        }
        else {
            throw new Error("Invalid email!");
        }
    }
    validateEmail(email : string) {
        var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
        return re.test(email);
    }
    greet() {
        alert("Hi!");
    }
}

Мы можем улучшить класс выше, удалив ответственность за проверку электронной почты из класса Person и создав новый класс электронной почты, который будет иметь эту ответственность:

class Email {
    public email : string;
    constructor(email : string){
        if(this.validateEmail(email)) {
          this.email = email;
        }
        else {
            throw new Error("Invalid email!");
        }        
    }
    validateEmail(email : string) {
        var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
        return re.test(email);
    }
}

class Person {
    public name : string;
    public surname : string;
    public email : Email;
    constructor(name : string, surname : string, email : Email){
        this.email = email;
        this.name = name;
        this.surname = surname;
    }
    greet() {
        alert("Hi!");
    }
}

Удостовериться, что у класса есть одна ответственность, он по умолчанию также легче видеть, что он делает, и как вы можете расширять/улучшать его.

Ответ 3

Принцип единой ответственности (SRP) гласит, что класс или метод должен делать только одно дело и не должен делать ничего связанного. Класс должен иметь только одну причину для изменения.

Типичным примером может служить класс EmailSender:

  • Это должно быть просто связано с отправкой электронной почты.
  • это не должно отвечать за загрузку содержимого электронной почты из базы данных или даже форматирование отправляемого содержимого электронной почты.

Здесь есть статья об этом.

Ответ 4

У класса должна быть только одна причина для изменения.

Этот принцип гласит, что если у нас есть две причины для изменения для класса, мы должны разделить функциональность в двух классах. Каждый класс будет отвечать только одной ответственности, и если в будущем нам нужно сделать одно изменение, мы собираемся сделать это в классе, который его обрабатывает.

Если есть две причины для изменения, возможно, что две разные команды могут работать по одному и тому же коду по двум причинам. Каждый из них должен будет развернуть свое решение, которое в случае скомпилированного языка (например, С++, С# или Java) может привести к несовместимым модулям с другими командами или другими частями приложения.

Этот принцип тесно связан с понятиями сцепления и сцепления. Связывание относится к тому, как неразрывно связаны различные аспекты приложения, в то время как сплоченность относится к тому, насколько тесно связаны содержимое конкретного класса или пакета. Все содержимое одного класса тесно связаны друг с другом, поскольку сам класс является [отдельной единицей] [1], которая должна быть полностью использована или вообще не использоваться.

Мое сообщение в блоге об этом:

http://javaexplorer03.blogspot.in/2016/12/single-responsibility-principle.html