深入研究軟體開發最佳實務:對乾淨程式碼的反思
當開始研究良好的軟體開發實務時,我將「乾淨程式碼」(乾淨程式碼)想像為一組簡單的規則,以確保程式碼可讀。 在某種程度上,這種看法是正確的。然而,這些規則並不總是適用於所有類型的程式碼,而且僅僅透過閱讀書籍當然無法完全理解。
乾淨的程式碼:持續的旅程
最近,我重讀了 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中文網其他相關文章!