"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Princípio de Responsabilidade Única

Princípio de Responsabilidade Única

Publicado em 2024-11-09
Navegar:223

Single Responsibility Principle

Cada componente de software deve ter apenas uma responsabilidade

O componente de software pode ser classe, método ou módulo

Exemplo, um canivete suíço é uma ferramenta multifuncional que viola o princípio de responsabilidade única do desenvolvimento de software; em vez disso, um canivete é um bom exemplo que segue a responsabilidade única (já que só pode ser usado para cortar, ao contrário do canivete suíço que pode ser usado para cortar, abrir latas, como chave mestra, tesoura, etc)

Como a mudança é constante, seja no mundo real ou no desenvolvimento de software, a definição do Princípio da Responsabilidade Única também muda de acordo

Cada componente de software deve ter um e apenas um motivo para mudar


Existem três razões pelas quais a mudança pode ocorrer na classe abaixo Funcionário

  1. Alteração no atributo Funcionário
  2. Alteração no banco de dados
  3. Alteração no cálculo do imposto
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;
    }

}

Como o SRP (Princípio da Responsabilidade Única) recomenda apenas um motivo para mudança na classe, teremos que fazer algumas modificações na classe Employee


Alterações por SRP

Agora, há apenas um motivo pelo qual a mudança pode ocorrer na classe Employee

Motivo da alteração: Alteração no atributo do funcionário

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

}

Além disso, há apenas um motivo pelo qual a mudança pode ocorrer na classe EmployeeRepository

Motivo da mudança: Mudança no banco de dados

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, há apenas um motivo pelo qual a mudança pode ocorrer na classe TaxCalculator

Motivo da alteração: Alteração no cálculo do imposto

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: Todas as 3 classes agora seguem o Princípio da Responsabilidade Única, seguindo assim ambas as definições

Ao criar classes ou qualquer componente de software, tenha em mente: Busque alta coesão e baixo acoplamento

Cada componente de software deve ter apenas uma responsabilidade e
Cada componente de software deve ter um e apenas um motivo para mudar

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/prashantrmishra/single-responsibility-principle-m8n?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3