paint-brush
코드에서 냄새나는 부분을 찾는 방법 [파트 XXXII]~에 의해@mcsee
806 판독값
806 판독값

코드에서 냄새나는 부분을 찾는 방법 [파트 XXXII]

~에 의해 Maximiliano Contieri9m2023/03/08
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

편집하거나 개선할 수 있는 사례가 많을 가능성이 높기 때문에 냄새가 납니다. 이러한 냄새의 대부분은 문제가 있을 수 있다는 힌트일 뿐입니다. 그러므로 그 자체로 고칠 필요는 없습니다… (단, 조사해 보아야 합니다.) 이전 코드 냄새여기에서 모든 이전 코드 냄새(파트 i - XXXI)를 찾을 수 있습니다.
featured image - 코드에서 냄새나는 부분을 찾는 방법 [파트 XXXII]
Maximiliano Contieri HackerNoon profile picture

편집하거나 개선할 수 있는 사례가 많을 가능성이 높기 때문에 냄새가 납니다.


이러한 냄새의 대부분은 문제가 있을 수 있다는 힌트일 뿐입니다. 그러므로 그 자체로 고칠 필요는 없습니다… (그렇지만 살펴봐야합니다.)

이전 코드 냄새

이전 코드 냄새(파트 i - XXXI)는 여기에서 모두 찾을 수 있습니다.


계속하자...


코드 냄새 156 - 암시적 Else

우리는 프로그래밍 첫 날에 if/else를 배웁니다. 그러면 우리는 다른 것을 잊어버립니다.


요약: 명시적으로 설명하세요. Else에서도 마찬가지입니다.

문제

솔루션

  1. 명시적인 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); }

발각

  • [x] 자동


구문 트리를 확인하고 구문 분석하여 누락된 항목에 대해 경고할 수 있습니다.


또한 이를 다시 작성하고 돌연변이 테스트를 수행할 수도 있습니다.

태그

  • 조건부

결론

이런 종류의 냄새는 공개적으로 많은 논쟁 과 증오를 불러일으킵니다.


우리는 의견을 교환하고 각각의 장단점을 소중히 여겨야 합니다.

처지

코드 냄새 102 - 화살표 코드

코드 냄새 36 - Switch/case/else if/else/if 문

더 많은 정보

암시적 Else 사용 중지

암시적 Else를 사용해야 하는 경우

빠른 실패

짜증나는 IF를 영원히 제거하는 방법

크레딧

사진: Elena Mozhvilo , Unsplash


소프트웨어 팀의 가장 큰 문제는 모든 사람이 다른 사람이 하는 일을 이해하도록 하는 것입니다.


마틴 파울러


코드 냄새 157 - 잔액 0

오늘은 지갑에 돈이 들어올 거라고 예상했어요. 잔액이 0이 되었습니다. 당황했습니다.


핵심요약: Null은 0이 아닙니다. 오류는 0이 아닙니다. 단지 0은 0입니다.

문제

  • UX
  • 유용성

솔루션

  1. 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")

발각

  • [x] 수동


디자인 냄새네요.


예외 또는 반환 코드가 발생하고 0으로 마스크되면 패턴을 찾을 수 있습니다.

태그

  • UX

결론

항상 최소한의 놀라움 원칙을 지침으로 따르십시오.

처지

코드 냄새 12 - Null

코드 냄새 139 - 사용자 인터페이스의 비즈니스 코드

코드 냄새 73 - 예상되는 경우에 대한 예외

코드 냄새 72 - 반환 코드

더 많은 정보

Null: 10억 달러의 실수

신용 거래

UnsplashJasmin Sessler 사진

부인 성명

코드 냄새는 단지 내 의견 일 뿐입니다.


Null에 대한 나의 진짜 비판은 프로그램을 확인하지 않고 빠르게 실행할지 아니면 확인하면서 느리게 실행할지 선택해야 하는 불필요하게 모든 고통을 다시 불러온다는 것입니다.


토니 호어 (Null Inventor)


소프트웨어 공학에 대한 좋은 인용문


코드 냄새 158 - 변수는 변수가 아니다


변수에 값을 할당하고 사용하지만 절대 변경하지 않습니다.


핵심요약: 가변성을 선언하세요.

문제

  • 가독성
  • Bijection 가변성을 존중합니다.
  • 잠재적인 성능 및 메모리 문제.

솔루션

  1. 변수를 상수로 변경하고 범위를 명확히 하세요.

리팩토링

리팩토링 003 - 상수 추출

리팩토링 008 - 변수를 상수로 변환

문맥

우리는 항상 도메인에서 배웁니다.


때때로 우리는 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

발각

  • [x] 자동


많은 린터는 변수에 할당이 하나만 있는지 확인합니다.


또한 돌연변이 테스트를 수행하고 변수를 수정하여 테스트가 중단되는지 확인할 수도 있습니다.

태그

  • 가변성

결론

우리는 변수 범위가 명확할 때 스스로 도전하고 리팩토링해야 하며, 변수의 속성과 가변성 에 대해 더 많이 배워야 합니다.

처지

코드 냄새 116 - 'var'로 선언된 변수

코드 냄새 127 - 변경 가능한 상수

코드 냄새 107 - 변수 재사용

코드 냄새 02 - 상수 및 매직 넘버

더 많은 정보

돌연변이의 사악한 힘

부인 성명

코드 냄새는 단지 내 의견 일 뿐입니다.

크레딧

UnsplashNoah Buscher 가 찍은 사진


작동하는 복잡한 시스템은 작동하는 단순한 시스템에서 진화한 것으로 변함없이 발견됩니다.


존 갈


코드 냄새 159 - mixEd_cASeI

진지한 개발은 다양한 사람들에 의해 이루어집니다. 우리는 동의하기 시작해야 합니다.


핵심요약: 다양한 대소문자 변환을 혼합하지 마세요

문제

  • 가독성
  • 유지 관리성

솔루션

  1. 케이스 표준을 선택하세요


  2. 기다려라

문맥

서로 다른 사람들이 함께 소프트웨어를 만들 때 개인적 또는 문화적 차이가 있을 수 있습니다.

일부는 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 }

발각

  • [x] 자동

우리 회사의 광범위한 명명 표준 에 대해 린터에게 알리고 이를 시행할 수 있습니다.


새로운 사람이 조직에 도착할 때마다 자동화된 테스트는 그/그녀에게/.. 코드를 변경하도록 정중하게 요청해야 합니다.

예외

우리 범위를 벗어난 코드와 상호 작용해야 할 때마다 우리 표준이 아닌 클라이언트 표준을 사용해야 합니다.

태그

  • 명명

결론

표준을 다루는 것은 쉽습니다.


우리는 이를 시행해야 합니다.

처지

코드 냄새 48 - 표준이 없는 코드

더 많은 정보

이름이란 정확히 무엇입니까 - 1부 퀘스트

모든 명명 규칙

부인 성명

코드 냄새는 단지 내 의견 일 뿐입니다.

크레딧

UnsplashWolfgang Hasselmann 이 찍은 사진


특별한 경우가 너무 많으면 잘못하고 있는 것입니다.


크레이그 제로우니


코드 냄새 160 - 잘못된 ID = 9999

Maxint는 유효하지 않은 ID에 매우 적합한 번호입니다. 우리는 결코 도달하지 못할 것입니다.


핵심요약: 실제 ID를 유효하지 않은 ID와 결합하지 마세요. 사실: ID를 피하세요.

문제


  • 생각보다 빨리 잘못된 ID에 도달할 수도 있습니다.


  • 잘못된 ID에도 null을 사용하지 마세요.


  • 호출자에서 함수로 플래그를 연결합니다.

솔루션

  1. 특수 개체를 사용하여 특수 사례를 모델링합니다.


  2. 9999, -1 및 0은 유효한 도메인 개체 및 구현 결합이므로 사용하지 마세요.


  3. 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)

발각

  • [x] 반자동


코드에서 특별한 상수와 특별한 값을 확인할 수 있습니다.

태그

  • 없는

결론

외부 식별자와 관련된 숫자를 사용해야 합니다.


외부 식별자가 없으면 숫자가 아닙니다.

처지

코드 냄새 120 - 순차 ID

코드 냄새 12 - Null

더 많은 정보

Null: 10억 달러의 실수

Y2K22 - 우리를 당황하게 만드는 실수

부인 성명

코드 냄새는 단지 내 의견 일 뿐입니다.

크레딧

UnsplashMarkus Spiske 가 찍은 사진


벌레는 구석에 숨어 있고 경계에 모입니다.


보리스 바이저


5개의 코드 냄새가 곧 추가될 예정입니다…