소프트웨어 개발 모범 사례 살펴보기: 클린 코드에 대한 고찰
좋은 소프트웨어 개발 방식에 대한 연구를 시작할 때 저는 "클린 코드"(클린 코드)를 읽기 쉬운 코드를 보장하기 위한 간단한 규칙 집합으로 상상했습니다. 부분적으로 이러한 인식은 정확합니다. 그러나 이러한 규칙은 모든 유형의 코드에 항상 적용되는 것은 아니며 책을 읽는 것만으로는 완전히 이해되지 않습니다.
클린 코드: 지속적인 여정
최근에 로버트 C. 마틴(Robert C. Martin)의 고전 클린 코드를 다시 읽었는데, 6년 전 처음 읽었을 때와 이해가 많이 달랐습니다. 당시 대학생으로서 제시된 문제와 해결책 중 상당수는 완전히 명확하지 않았습니다. 이것은 큰 오해입니다. 클린 코드는 초보자를 위한 것이 아닙니다.
"...당신이 의사인데 환자가 수술을 준비하면서 시간이 너무 오래 걸린다는 이유만으로 손 씻기를 모두 중단하라고 요구한다면 어떨까요? [...] 프로그래머가 수술에 양보하는 것은 비전문적입니다. 혼란스러운 코드 생성의 위험을 이해하지 못하는 훌륭한 관리자의 의지입니다."
이 기사는 제가 읽은 내용 중 관련 내용을 강조하고 실제 경험을 공유합니다.
기능: 단일 책임
잘 작성된 함수에는 단 하나의 책임이 있어야 합니다. 즉, 한 가지 일을 하고, 잘 하고, 그 일만 해야 합니다. 여러 책임을 단일 역할로 그룹화하면 코드를 읽고 테스트하고 유지 관리하기가 어려워집니다.
여러 책임이 있는 역할의 예(사용자 저장 및 알림):
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!