"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Principio de responsabilidad única

Principio de responsabilidad única

Publicado el 2024-11-09
Navegar:875

Single Responsibility Principle

Cada componente de software debe tener una sola responsabilidad

El componente de software puede ser clase, método o módulo

Ejemplo, una navaja suiza es una herramienta multipropósito que viola el principio de responsabilidad única del desarrollo de software; en cambio, una navaja es un buen ejemplo que sigue la responsabilidad única (ya que solo se puede usar para cortar, a diferencia de la navaja suiza). que puede usarse para cortar, abrir latas, como llave maestra, tijeras,etc)

Dado que el cambio es constante ya sea en el mundo real o en el desarrollo de software, la definición del Principio de Responsabilidad Única también cambia en consecuencia

Cada componente de software debe tener una y solo una razón para cambiar


Hay tres razones por las cuales se pueden producir cambios en la siguiente clase Empleado

  1. Cambio en atributo de Empleado
  2. Cambio en la base de datos
  3. Cambio en el cálculo de impuestos
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;
    }

}

Dado que el SRP (Principio de Responsabilidad Única) recomienda solo un motivo de cambio en la clase, tendremos que hacer algunas modificaciones en la clase Empleado


Cambios por SRP

Ahora, solo hay una razón por la cual se puede producir un cambio en la clase Empleado

Motivo del cambio: Cambio en el atributo del empleado

/**
 * 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;
    }

}

Además, solo hay una razón por la cual se puede producir un cambio en la clase EmployeeRepository

Motivo del cambio: Cambio en la base de datos

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();
        }
}

}

Finalmente, solo hay una razón por la cual se puede producir un cambio en la clase TaxCalculator

Motivo del cambio: Cambio en el cálculo del impuesto

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
        }
    }
}

Nota: Las 3 clases ahora siguen el principio de responsabilidad única, por lo que siguen ambas definiciones

Al crear clases o cualquier componente de software, tenga en cuenta: Apunte a una alta cohesión y un acoplamiento flexible

Cada componente de software debe tener una sola responsabilidad y
Cada componente de software debe tener una y solo una razón para cambiar

Declaración de liberación Este artículo se reproduce en: https://dev.to/prashantrmishra/single-responsibility-principle-m8n?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3