Princípio de Responsabilidade Única C#

Resumo : neste tutorial, você aprenderá como usar o Princípio de Responsabilidade Única do C# para desenvolver aplicativos de software que sejam mais fáceis de manter e escalonáveis.

Introdução ao princípio de responsabilidade única do C#

O Princípio de Responsabilidade Única (SRP) é o primeiro princípio dos cinco princípios SOLID:

O Princípio da Responsabilidade Única afirma que um módulo de software deve ter uma única responsabilidade , ou seja, deve ter um e apenas um motivo para mudar .

Em C#, um módulo de software pode ser uma classe ou um método de uma classe. A responsabilidade refere-se ao propósito ou preocupação que uma classe tem em uma aplicação.

Por ter uma responsabilidade única, uma classe se torna mais coesa e mais fácil de manter. Também torna a aplicação mais flexível, uma vez que as alterações numa responsabilidade não afetam outras responsabilidades.

Por exemplo, uma classe responsável por representar dados deveria ter apenas a responsabilidade de mantê-los. Ele não deve ser responsável por salvar os dados em um banco de dados ou realizar qualquer outra tarefa não relacionada.

Ao separar essas responsabilidades em classes separadas, o aplicativo se torna mais fácil de manter e estender.

Exemplo de Princípio de Responsabilidade Única em C#

Suponha que você precise criar um programa para gerenciar faturas:

public class Invoice
{
    public int InvoiceNo {  get; set; }
    public DateOnly IssuedDate { get; set; }
    public string? Customer { get; set; }
    public decimal Amount { get; set; }
    public string? Description { get; set;}

    public void Save()
    {
        Console.WriteLine($"Saved the invoice #{InvoiceNo}");
    }

}

class Program
{
    public static void Main(string[] args)
    {
        // create a new invoice
        var invoice = new Invoice
        {
            InvoiceNo = 1,
            Customer = "John Doe",
            IssuedDate = new DateOnly(2023, 4, 1),
            Description = "Website Design",
            Amount = 1000
        };

        invoice.Save();

    }
}Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina uma Invoiceclasse que possua propriedades InvoiceNo, Customer, IssuedDate, Descriptione Amount. A Invoiceclasse também possui o Save()método que salva uma fatura em um banco de dados:

public class Invoice
{
    public int InvoiceNo {  get; set; }
    public DateOnly IssuedDate { get; set; }
    public string? Customer { get; set; }
    public decimal Amount { get; set; }
    public string? Description { get; set;}

    public void Save()
    {
        Console.WriteLine($"Saved the invoice #{InvoiceNo}");
    }

}Linguagem de código:  C#  ( cs )

Para fins de demonstração, o Save()método exibe uma mensagem no console em vez de salvar uma fatura em um banco de dados real.

Segundo, crie uma fatura no Main()método da Programclasse e chame o Save()método para salvar a fatura:

class Program
{
    public static void Main(string[] args)
    {
        // create a new invoice
        var invoice = new Invoice
        {
            InvoiceNo = 1,
            Customer = "John Doe",
            IssuedDate = new DateOnly(2023, 4, 1),
            Description = "Website Design",
            Amount = 1000
        };

        invoice.Save();

    }
}Linguagem de código:  C#  ( cs )

Inicialmente, a Invoiceclasse parece boa. Mas quando o programa crescer, você perceberá que a Invoiceturma tem múltiplas responsabilidades.

A Invoiceclasse não apenas representa os dados da fatura, mas também é responsável por salvá-la no armazenamento. Isto viola o princípio da responsabilidade única, pois a Invoiceclasse deve ter uma responsabilidade única.

Vamos refatorar a classe Invoice para seguir o princípio da responsabilidade única.

Refatorando a classe Invoice para seguir o princípio de responsabilidade única

Primeiro, crie uma classe separada chamada InvoiceRepositorypara salvar a fatura e mover o Save()método de Invoiceclasse para InvoiceRepositoryclasse:

class InvoiceRepository
{
    public void Save(Invoice invoice)
    {
        Console.WriteLine($"Saved the invoice #{invoice.InvoiceNo}");
    }
}Linguagem de código:  C#  ( cs )

Agora, a Invoiceclasse tem uma única responsabilidade que representa apenas os dados da fatura. Além disso, o InvoiceRepositoryé o único responsável por guardar a fatura.

public class Invoice
{
    public int InvoiceNo { get;set; }
    public DateOnly IssuedDate { get; set; }
    public string? Customer { get; set;}
    public decimal Amount { get; set; }
    public string? Description { get; set;}
}Linguagem de código:  C#  ( cs )

Segundo, crie uma fatura e salve-a em um banco de dados chamando o método Save()da InvoiceRepositoryclasse:

class Program
{
    public static void Main(string[] args)
    {
        // create a new invoice
        var invoice = new Invoice
        {
            InvoiceNo = 1,
            Customer = "John Doe",
            IssuedDate = new DateOnly(2023, 4, 1),
            Description = "Website Design",
            Amount = 1000
        };

        // save the invoice to a storage
        var invoiceRepository = new InvoiceRepository();
        invoiceRepository.Save(invoice);
    }
}Linguagem de código:  C#  ( cs )

Junte tudo.

public class Invoice
{
    public int InvoiceNo { get;set; }
    public DateOnly IssuedDate { get; set; }
    public string? Customer { get; set;}
    public decimal Amount { get; set; }
    public string? Description { get; set;}
}

class InvoiceRepository
{
    public void Save(Invoice invoice)
    {
        Console.WriteLine($"Saved the invoice #{invoice.InvoiceNo}");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        // create a new invoice
        var invoice = new Invoice
        {
            InvoiceNo = 1,
            Customer = "John Doe",
            IssuedDate = new DateOnly(2023, 4, 1),
            Description = "Website Design",
            Amount = 1000
        };

        // save the invoice to a storage
        var invoiceRepository = new InvoiceRepository();
        invoiceRepository.Save(invoice);
    }
}Linguagem de código:  C#  ( cs )

Resumo

  • O Princípio da Responsabilidade Única afirma que um módulo deve ter apenas um motivo para mudar.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *