편집하거나 개선할 수 있는 사례가 많을 가능성이 높기 때문에 냄새가 납니다.
이러한 냄새의 대부분은 문제가 있을 수 있다는 힌트일 뿐입니다. 그러므로 그 자체로 고칠 필요는 없습니다… (그렇지만 살펴봐야합니다.)
이전 코드 냄새(파트 i - XXXI)는 여기에서 모두 찾을 수 있습니다.
계속하자...
우리는 프로그래밍 첫 날에 if/else를 배웁니다. 그러면 우리는 다른 것을 잊어버립니다.
요약: 명시적으로 설명하세요. Else에서도 마찬가지입니다.
IF 문장을 조기에 반환하는 경우 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 문
사진: Elena Mozhvilo , Unsplash
소프트웨어 팀의 가장 큰 문제는 모든 사람이 다른 사람이 하는 일을 이해하도록 하는 것입니다.
마틴 파울러
오늘은 지갑에 돈이 들어올 거라고 예상했어요. 잔액이 0이 되었습니다. 당황했습니다.
핵심요약: Null은 0이 아닙니다. 오류는 0이 아닙니다. 단지 0은 0입니다.
보안 문제에 대해 많이 읽었습니다.
특히 암호화폐에서는요.
지난 주에 저는 암호화폐 해킹 스레드 에 대해 읽었습니다.
지갑에 잔액이 0으로 표시되었을 때 나는 당황했습니다.
그것은 단지 UX 냄새였습니다.
블록체인에 접근할 수 없습니다 💩
""" 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 = "https://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 = "https://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 - 사용자 인터페이스의 비즈니스 코드
Unsplash 의 Jasmin Sessler 사진
코드 냄새는 단지 내 의견 일 뿐입니다.
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
많은 린터는 변수에 할당이 하나만 있는지 확인합니다.
또한 돌연변이 테스트를 수행하고 변수를 수정하여 테스트가 중단되는지 확인할 수도 있습니다.
우리는 변수 범위가 명확할 때 스스로 도전하고 리팩토링해야 하며, 변수의 속성과 가변성 에 대해 더 많이 배워야 합니다.
코드 냄새는 단지 내 의견 일 뿐입니다.
Unsplash 에 Noah Buscher 가 찍은 사진
작동하는 복잡한 시스템은 작동하는 단순한 시스템에서 진화한 것으로 변함없이 발견됩니다.
존 갈
진지한 개발은 다양한 사람들에 의해 이루어집니다. 우리는 동의하기 시작해야 합니다.
핵심요약: 다양한 대소문자 변환을 혼합하지 마세요
케이스 표준을 선택하세요
기다려라
서로 다른 사람들이 함께 소프트웨어를 만들 때 개인적 또는 문화적 차이가 있을 수 있습니다.
일부는 camelCase 🐫를 선호하고 일부는 snake_case 🐍, MACRO_CASE🗣️ 등을 선호합니다.
코드는 간단하고 읽기 쉬워야 합니다.
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "UPDATED_AT": "2022-01-07T02:23:41.305Z", "created_at": "2019-01-07T02:23:41.305Z", "deleted at": "2022-01-07T02:23:41.305Z" }
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "updatedAt": "2022-01-07T02:23:41.305Z", "createdAt": "2019-01-07T02:23:41.305Z", "deletedAt": "2022-01-07T02:23:41.305Z" // This doesn't mean THIS standard is the right one }
우리 회사의 광범위한 명명 표준 에 대해 린터에게 알리고 이를 시행할 수 있습니다.
새로운 사람이 조직에 도착할 때마다 자동화된 테스트는 그/그녀에게/.. 코드를 변경하도록 정중하게 요청해야 합니다.
우리 범위를 벗어난 코드와 상호 작용해야 할 때마다 우리 표준이 아닌 클라이언트 표준을 사용해야 합니다.
표준을 다루는 것은 쉽습니다.
우리는 이를 시행해야 합니다.
코드 냄새는 단지 내 의견 일 뿐입니다.
Unsplash 에 Wolfgang Hasselmann 이 찍은 사진
특별한 경우가 너무 많으면 잘못하고 있는 것입니다.
크레이그 제로우니
Maxint는 유효하지 않은 ID에 매우 적합한 번호입니다. 우리는 결코 도달하지 못할 것입니다.
핵심요약: 실제 ID를 유효하지 않은 ID와 결합하지 마세요. 사실: ID를 피하세요.
특수 개체를 사용하여 특수 사례를 모델링합니다.
9999, -1 및 0은 유효한 도메인 개체 및 구현 결합이므로 사용하지 마세요.
Null 개체 도입
컴퓨팅 초기에는 데이터 유형이 엄격했습니다.
그런 다음 우리는 수십억 달러의 실수를 발명했습니다.
그런 다음 우리는 성장하여 다형성 특수 값을 사용하여 특수 시나리오를 모델링했습니다.
#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)
코드에서 특별한 상수와 특별한 값을 확인할 수 있습니다.
외부 식별자와 관련된 숫자를 사용해야 합니다.
외부 식별자가 없으면 숫자가 아닙니다.
코드 냄새는 단지 내 의견 일 뿐입니다.
Unsplash 에 Markus Spiske 가 찍은 사진
벌레는 구석에 숨어 있고 경계에 모입니다.
보리스 바이저
5개의 코드 냄새가 곧 추가될 예정입니다…