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:
- Princípio de Responsabilidade Única (SRP)
- Princípio Aberto-Fechado (OCP)
- Princípio de Substituição de Liskov (LSP)
- Princípio de segregação de interface (ISP)
- Princípio de Inversão de Dependência (DIP)
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 Invoice
classe que possua propriedades InvoiceNo
, Customer
, IssuedDate
, Description
e Amount
. A Invoice
classe 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 Program
classe 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 Invoice
classe parece boa. Mas quando o programa crescer, você perceberá que a Invoice
turma tem múltiplas responsabilidades.
A Invoice
classe 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 Invoice
classe 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 InvoiceRepository
para salvar a fatura e mover o Save()
método de Invoice
classe para InvoiceRepository
classe:
class InvoiceRepository
{
public void Save(Invoice invoice)
{
Console.WriteLine($"Saved the invoice #{invoice.InvoiceNo}");
}
}
Linguagem de código: C# ( cs )
Agora, a Invoice
classe 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 InvoiceRepository
classe:
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.