一.概述
SOLID五大原则使我们能够管理解决大多数软件设计问题。由Robert C. Martin在20世纪90年代编写了这些原则。这些原则为我们提供了从紧耦合的代码和少量封装转变为适当松耦合和封装业务实际需求的结果方法。使用这些原则,我们可以构建一个具有整洁,可读且易于维护的代码应用程序。
SOLID缩写如下:
1.单一责任原则SRP
一个类承担的责任在理想情况下应该是多少个呢?答案是一个。这个责任是围绕一个核心任务构建,不是简化的意思。通过暴露非常有限的责任使这个类与系统的交集更小。
(1) 演示:违反了单一责任原则,原因是:顾客类中承担了太多无关的责任。
/// <summary> /// 顾客类所有实现 /// </summary> public class Cliente { public int ClienteId { get; set; } public string Nome { get; set; } public string Email { get; set; } public string CPF { get; set; } public DateTime DataCadastro { get; set; } public string AdicionarCliente() { //顾客信息验证 if (!Email.Contains("@")) return "Cliente com e-mail inválido"; if (CPF.Length != 11) return "Cliente com CPF inválido"; //保存顾客信息 using (var cn = new SqlConnection()) { var cmd = new SqlCommand(); cn.ConnectionString = "MinhaConnectionString"; cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO CLIENTE (NOME, EMAIL CPF, DATACADASTRO) VALUES (@nome, @email, @cpf, @dataCad))"; cmd.Parameters.AddWithValue("nome", Nome); cmd.Parameters.AddWithValue("email", Email); cmd.Parameters.AddWithValue("cpf", CPF); cmd.Parameters.AddWithValue("dataCad", DataCadastro); cn.Open(); cmd.ExecuteNonQuery(); } //发布邮件 var mail = new MailMessage("empresa@empresa.com", Email); var client = new SmtpClient { Port = 25, DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false, Host = "smtp.google.com" }; mail.Subject = "Bem Vindo."; mail.Body = "Parabéns! Você está cadastrado."; client.Send(mail); return "Cliente cadastrado com sucesso!"; } }
(2) 解决方案,使用单一责任原则,每个类只负责自己的业务。
/// <summary> /// 顾客实体 /// </summary> public class Cliente { public int ClienteId { get; set; } public string Nome { get; set; } public string Email { get; set; } public string CPF { get; set; } public DateTime DataCadastro { get; set; } /// <summary> /// 顾客信息验证 /// </summary> /// <returns></returns> public bool IsValid() { return EmailServices.IsValid(Email) && CPFServices.IsValid(CPF); } } /// <summary> /// 保存顾客信息 /// </summary> public class ClienteRepository { /// <summary> /// 保存 /// </summary> /// <param name="cliente">要保存的顾客实体</param> public void AdicionarCliente(Cliente cliente) { using (var cn = new SqlConnection()) { var cmd = new SqlCommand(); cn.ConnectionString = "MinhaConnectionString"; cmd.Connection = cn; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO CLIENTE (NOME, EMAIL CPF, DATACADASTRO) VALUES (@nome, @email, @cpf, @dataCad))"; cmd.Parameters.AddWithValue("nome", cliente.Nome); cmd.Parameters.AddWithValue("email", cliente.Email); cmd.Parameters.AddWithValue("cpf", cliente.CPF); cmd.Parameters.AddW