이러한 냄새의 대부분은 문제가 있을 수 있다는 힌트일 뿐입니다. 그러므로 그 자체로 고칠 필요는 없습니다… (그렇지만 살펴봐야합니다.)
이전 코드 냄새(파트 i - XXXI)는 여기에서 모두 찾을 수 있습니다.
우리는 프로그래밍 첫 날에 if/else를 배웁니다. 그러면 우리는 다른 것을 잊어버립니다.
요약: 명시적으로 설명하세요. Else에서도 마찬가지입니다.
그런 다음 IF를 제거 하고 다형성을 사용합니다.
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
이런 종류의 냄새는 공개적으로 많은 논쟁 과 증오를 불러일으킵니다.
코드 냄새 36 - Switch/case/else if/else/if 문
소프트웨어 팀의 가장 큰 문제는 모든 사람이 다른 사람이 하는 일을 이해하도록 하는 것입니다.
마틴 파울러
오늘은 지갑에 돈이 들어올 거라고 예상했어요. 잔액이 0이 되었습니다. 당황했습니다.
핵심요약: Null은 0이 아닙니다. 오류는 0이 아닙니다. 단지 0은 0입니다.
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable show 0 as the balance """ import requests import json def get_balance(address): url = "//blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: return 0
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable throw an error """ import requests import json def get_balance(address): url = "//blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: raise BlockchainNotReachableError("Error reaching blockchain")
예외 또는 반환 코드가 발생하고 0으로 마스크되면 패턴을 찾을 수 있습니다.
코드 냄새 139 - 사용자 인터페이스의 비즈니스 코드
코드 냄새는 단지 내 의견 일 뿐입니다.
Null에 대한 나의 진짜 비판은 프로그램을 확인하지 않고 빠르게 실행할지 아니면 확인하면서 느리게 실행할지 선택해야 하는 불필요하게 모든 고통을 다시 불러온다는 것입니다.
토니 호어 (Null Inventor)
변수에 값을 할당하고 사용하지만 절대 변경하지 않습니다.
핵심요약: 가변성을 선언하세요.
때때로 우리는 MAPPER를 사용하여 값이 변경될 수 있다고 추측합니다.
이것은 또한 Magic Constants를 피할 것입니다.
<?php function configureUser() { $password = '123456'; // Setting a password on a variable is another vulnerability // And Code Smell $user = new User($password); // Notice Variable doesn't change }
<?php define("USER_PASSWORD", '123456') function configureUser() { $user = new User(USER_PASSWORD); } // or function configureUser() { $user = new User(userPassword()); } function userPassword() : string { return '123456'; } // Case is an oversimplification as usual
우리는 변수 범위가 명확할 때 스스로 도전하고 리팩토링해야 하며, 변수의 속성과 가변성 에 대해 더 많이 배워야 합니다.
코드 냄새는 단지 내 의견 일 뿐입니다.
작동하는 복잡한 시스템은 작동하는 단순한 시스템에서 진화한 것으로 변함없이 발견됩니다.
존 갈
진지한 개발은 다양한 사람들에 의해 이루어집니다. 우리는 동의하기 시작해야 합니다.
핵심요약: 다양한 대소문자 변환을 혼합하지 마세요
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "UPDATED_AT": "2023-01-07T02:23:41.305Z", "created_at": "2020-01-07T02:23:41.305Z", "deleted at": "2023-01-07T02:23:41.305Z" }
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "updatedAt": "2023-01-07T02:23:41.305Z", "createdAt": "2020-01-07T02:23:41.305Z", "deletedAt": "2023-01-07T02:23:41.305Z" // This doesn't mean THIS standard is the right one }
우리 회사의 광범위한 명명 표준 에 대해 린터에게 알리고 이를 시행할 수 있습니다.
코드 냄새는 단지 내 의견 일 뿐입니다.
특별한 경우가 너무 많으면 잘못하고 있는 것입니다.
크레이그 제로우니
Maxint는 유효하지 않은 ID에 매우 적합한 번호입니다. 우리는 결코 도달하지 못할 것입니다.
핵심요약: 실제 ID를 유효하지 않은 ID와 결합하지 마세요. 사실: ID를 피하세요.
그런 다음 우리는 수십억 달러의 실수를 발명했습니다.
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define INVALID_VALUE 999 int main(void) { int id = get_value(); if (id==INVALID_VALUE) { return EXIT_FAILURE; // id is a flag and also a valid domain value } return id; } int get_value() { // something bad happened return INVALID_VALUE; } // returns EXIT_FAILURE (1)
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" // No INVALID_VALUE defined int main(void) { int id; id = get_value(); if (!id) { return EXIT_FAILURE; // Sadly, C Programming Language has no exceptions } return id; } get_value() { // something bad happened return false; } // returns EXIT_FAILURE (1)
코드 냄새는 단지 내 의견 일 뿐입니다.
벌레는 구석에 숨어 있고 경계에 모입니다.
보리스 바이저