深入研究软件开发最佳实践:对干净代码的反思
当开始研究良好的软件开发实践时,我将“干净代码”(干净代码)想象为一组简单的规则,以确保代码可读。 在某种程度上,这种看法是正确的。然而,这些规则并不总是适用于所有类型的代码,并且仅仅通过阅读书籍当然无法完全理解。
干净的代码:持续的旅程
最近,我重读了 Robert C. Martin 的经典著作干净的代码,我的理解与六年前的第一次阅读有很大不同。 作为当时的一名大学生,提出的许多问题和解决方案并不完全清楚。 这是一个很大的误解:干净的代码不适合初学者。
“……如果你是一名医生,而一名病人仅仅因为时间太长而要求你停止洗手以准备手术怎么办?[...]程序员屈服于这种做法是不专业的伟大的管理者不了解生成混乱代码的风险。”
这篇文章重点介绍了我阅读中的相关要点,并分享了实践经验。
函数:单一职责
一个编写良好的函数应该有一个单一的职责:做一件事,做好它,仅此而已。 将多个职责分组为一个角色会使代码难以阅读、测试和维护。
具有多重职责的角色示例(保存并通知用户):
<code>function salvarUsuarioENotificar(usuario) { // Valida os dados do usuário if (!usuario.nome || !usuario.email) { throw new Error('Dados do usuário incompletos.') } // Salva no banco de dados bancoDeDados.salvar(usuario) // Envia um e-mail de boas-vindas emailService.enviarEmail(usuario.email, 'Bem-vindo!', 'Obrigado por se cadastrar!') }</code>
重构后,每个职责都有特定的角色:
<code>function validarUsuario(usuario) { if (!usuario.nome || !usuario.email) { throw new Error('Dados do usuário incompletos.') } } function salvarUsuario(usuario) { bancoDeDados.salvar(usuario) } function enviarEmailDeBoasVindas(usuario) { emailService.enviarEmail(usuario.email, 'Bem-vindo!', 'Obrigado por se cadastrar!') } function processarCadastroDeUsuario(usuario) { validarUsuario(usuario) salvarUsuario(usuario) enviarEmailDeBoasVindas(usuario) }</code>
现在每个函数都有一个职责,使代码更具可读性且更易于维护。
评论:优先考虑不言自明的名称
注释很有用,但优先考虑不言自明的名称以避免冗余。 明显的注释会污染代码。
不必要的评论示例:
<code>/** Dia do mês **/ private number diaDoMes;</code>
改进了名称更清晰且没有注释:
<code>private number diaDoMesAtual;</code>
对象和数据结构:封装和清晰度
良好的面向对象设计侧重于公开操作和隐藏实现细节。 这样可以促进封装,减少耦合,方便维护。
封装在类中的示例Circulo
:
<code>class Circulo implements Forma { private Ponto centro; private number raio; private number PI = 3.14159; public number calcularArea() { return PI * raio * raio; } }</code>
避免出于不同目的在不同范围内重复使用变量。 使用不同的变量可以提高清晰度。
错误处理:异常而不是多重检查
过去,错误处理是有限的。 如今,使用异常使代码更简洁、更具可读性。
具有多重验证的详细代码示例:
<code>function salvarUsuarioENotificar(usuario) { // Valida os dados do usuário if (!usuario.nome || !usuario.email) { throw new Error('Dados do usuário incompletos.') } // Salva no banco de dados bancoDeDados.salvar(usuario) // Envia um e-mail de boas-vindas emailService.enviarEmail(usuario.email, 'Bem-vindo!', 'Obrigado por se cadastrar!') }</code>
使用异常进行重构:
<code>function validarUsuario(usuario) { if (!usuario.nome || !usuario.email) { throw new Error('Dados do usuário incompletos.') } } function salvarUsuario(usuario) { bancoDeDados.salvar(usuario) } function enviarEmailDeBoasVindas(usuario) { emailService.enviarEmail(usuario.email, 'Bem-vindo!', 'Obrigado por se cadastrar!') } function processarCadastroDeUsuario(usuario) { validarUsuario(usuario) salvarUsuario(usuario) enviarEmailDeBoasVindas(usuario) }</code>
单元测试:清晰度和焦点
干净的测试必须清晰、简单且一致。 用很少的表达方式传达大量的信息。
测试的一般结构:构建、操作、验证。
课程:SRP(单一职责原则)
类的名称应该反映其职责。 班级规模应该小,目标单一。 SRP 确保每个类只有一个职责。
结论:干净的代码是一段旅程
干净的代码不是一下子就能学会的。这是一个持续的旅程,需要实践、反思和进化。 真正的技能来自于经验和看到改进的能力。 Kent Beck 的规则(测试、避免重复、清晰、最小化类和方法)是一个很有价值的指南。
以上是我对干净代码的理解是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!