O Princípio da Responsabilidade Única, é um dos cinco princípios do SOLID, um conjunto de diretrizes que visam melhorar a qualidade e a manutenibilidade do código em programação orientada a objetos. O SRP estabelece que uma classe deve ter uma única responsabilidade e motivo para mudar. Em outras palavras, uma classe deve ter apenas uma razão para ser alterada.
Um exemplo que viola o SRP em Swift seria o seguinte:
class User {
var name: String
var email: String
init(name: String, email: String) {
self.name = name
self.email = email
}
func saveToDatabase() {
// Lógica para salvar o usuário no banco de dados
}
func sendEmail() {
// Lógica para enviar um e-mail para o usuário
}
}
Neste exemplo, a classe User está lidando com duas responsabilidades distintas: salvar o usuário no banco de dados e enviar e-mails. Isso viola o SRP, porque se houver mudanças nas regras de envio de e-mails, por exemplo, a classe User precisará ser modificada, mesmo que a mudança não esteja diretamente relacionada à sua representação e armazenamento.
Exemplo corrigido que não viola o SRP
class User {
var name: String
var email: String
init(name: String, email: String) {
self.name = name
self.email = email
}
}
class UserRepository {
func saveUser(_ user: User) {
// Lógica para salvar o usuário no banco de dados
}
}
class EmailService {
func sendEmail(to recipient: String, subject: String, body: String) {
// Lógica para enviar um e-mail
}
}
Neste exemplo, a classe User tem a única responsabilidade de representar um usuário. As responsabilidades de salvar o usuário no banco de dados e enviar e-mails foram movidas para as classes UserRepository e EmailService, respectivamente. Isso adere ao SRP, facilitando a manutenção e evitando que mudanças em uma área afetem indevidamente as outras.
O Princípio Aberto-Fechado é outro princípio do SOLID e sugere que as entidades de software, como classes, módulos ou funções, devem ser abertas para extensão, mas fechadas para modificação**.** Isso significa que você deve ser capaz de adicionar novos comportamentos ou funcionalidades a um sistema sem modificar o código existente.
Um exemplo que viola o OCP em Swift seria o seguinte:
class Shape {
var type: String
init(type: String) {
self.type = type
}
func area() -> Double {
fatalError("Subclasses must implement this method")
}
}
Neste exemplo, a classe Shape é uma classe base para várias formas geométricas. No entanto, se você quiser adicionar um novo tipo de forma, precisará modificar a classe Shape e criar uma nova implementação para o método area(), violando o OCP.
Exemplo corrigido que segue o OCP:
protocol Shape {
func area() -> Double
}
class Circle: Shape {
var radius: Double
init(radius: Double) {
self.radius = radius
}
func area() -> Double {
return Double.pi * radius * radius
}
}
class Rectangle: Shape {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
func area() -> Double {
return width * height
}
}