«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Принцип единой ответственности

Принцип единой ответственности

Опубликовано 9 ноября 2024 г.
Просматривать:977

Single Responsibility Principle

Каждый программный компонент должен иметь только одну и одну ответственность

Программный компонент может быть классом, методом или модулем

Например, швейцарский армейский нож — это многоцелевой инструмент, который нарушает принцип единой ответственности при разработке программного обеспечения. Вместо этого нож является хорошим примером, который следует единой ответственности (поскольку его можно использовать только для резки, в отличие от швейцарского армейского ножа). который можно использовать для резки, открытия консервных банок, в качестве отмычки, ножниц и т. д.)

Поскольку изменения происходят постоянно, будь то в реальном мире или при разработке программного обеспечения, определение принципа единой ответственности также меняется соответствующим образом

Каждый программный компонент должен иметь одну и только одну причину для изменения


Существует три причины, по которым могут произойти изменения в приведенном ниже классе «Сотрудник»

  1. Изменение атрибута сотрудника
  2. Изменение в базе данных
  3. Изменение в расчете налога
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * Employee class has details of employee
 * This class is responsible for saving employee details, getting tax of
 * employee and getting
 * details of employee like name, id, address, contact, etc.
 */
public class Employee {
    private String employeeId;
    private String employeeName;
    private String employeeAddress;
    private String contactNumber;
    private String employeeType;

    public void save() {
        String insert = MyUtil.serializeIntoString(this);
        Connection connection = null;
        Statement statement = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc://mysql://localhost:8080/MyDb", "root", "password");
            statement = connection.createStatement();
            statement.execute("insert into employee values ("   insert   ")");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void calculateTax() {
        if (this.getEmployeeType().equals("fulltime")) {
            // tax calculation for full time employee
        } else if (this.getEmployeeType().equals("contract")) {
            // tax calculation for contract type employee
        }
    }

    public String getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public String getEmployeeAddress() {
        return employeeAddress;
    }

    public void setEmployeeAddress(String employeeAddress) {
        this.employeeAddress = employeeAddress;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }

    public String getEmployeeType() {
        return employeeType;
    }

    public void setEmployeeType(String employeeType) {
        this.employeeType = employeeType;
    }

}

Поскольку SRP (принцип единой ответственности) рекомендует только одну причину для изменения в классе, нам придется внести некоторые изменения в класс «Сотрудник»


Изменения по рекомендованной розничной цене

Теперь есть только одна причина, по которой могут произойти изменения в классе сотрудников

Причина изменения: Изменение атрибута «Сотрудник»

/**
 * Employee class has details of employee
 */
public class Employee {
    private String employeeId;
    private String employeeName;
    private String employeeAddress;
    private String contactNumber;
    private String employeeType;

    public void save() {
       new EmployeeRepository().save(this);
    }

    public void calculateTax() {
       new TaxCalculator().calculateTax(this);
    }

    public String getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(String employeeId) {
        this.employeeId = employeeId;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public String getEmployeeAddress() {
        return employeeAddress;
    }

    public void setEmployeeAddress(String employeeAddress) {
        this.employeeAddress = employeeAddress;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }

    public String getEmployeeType() {
        return employeeType;
    }

    public void setEmployeeType(String employeeType) {
        this.employeeType = employeeType;
    }

}

Кроме того, существует только одна причина, по которой могут произойти изменения в классе WorkerRepository

Причина изменения: Изменение базы данных

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class EmployeeRepository {

    public void save(Employee employee) {
         String insert = MyUtil.serializeIntoString(employee);
        Connection connection = null;
        Statement statement = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc://mysql://localhost:8080/MyDb", "root", "password");
            statement = connection.createStatement();
            statement.execute("insert into employee values ("   insert   ")");

        } catch (Exception e) {
            e.printStackTrace();
        }
}

}

Наконец, есть только одна причина, по которой могут произойти изменения в классе TaxCalculator

Причина изменения: Изменение расчета налога

public class TaxCalculator {

    public void calculateTax(Employee employee) {
        if (employee.getEmployeeType().equals("fulltime")) {
            // tax calculation for full time employee
        } else if (employee.getEmployeeType().equals("contract")) {
            // tax calculation for contract type employee
        }
    }
}

Примечание: все три класса теперь следуют принципу единой ответственности, то есть соответствуют обоим определениям

При создании классов или любого программного компонента имейте в виду: Стремитесь к высокой связности и слабой связи

Каждый программный компонент должен иметь только одну и одну ответственность и
Каждый программный компонент должен иметь одну и только одну причину для изменения

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/prashantrmishra/single-responsibility-principle-m8n?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3