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

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

~에 의해 Maximiliano Contieri7m2023/04/07
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

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

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


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

이전 코드 냄새

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


계속하자...


코드 냄새 166 - 사용자 인터페이스의 낮은 수준 오류

치명적인 오류: 잡히지 않는 오류: /var/www/html/query-line.php:78에서 'logs_queries_web' 클래스를 찾을 수 없습니다.


스택 추적: 718행의 /var/www/html/query-line.php에 #0 {main}이 발생했습니다.


요약: 오류를 잡아보세요. 당신이 기대하지 않는 것조차도.

문제

  • 보안


  • 오류 처리


  • 오류 로깅


  • 나쁜 UX 경험

솔루션

  1. 최상위 핸들러를 사용하십시오.


  2. 반환 코드를 선호하는 언어는 피하세요.


  3. 데이터베이스 및 낮은 수준의 오류가 예상됩니다.

문맥

2022년에도 일반 사용자에게 스택이나 디버깅 메시지를 보여주는 "심각한" 웹사이트를 볼 수 있습니다.

샘플 코드

잘못된

 <? Fatal error: Uncaught Error: Class 'MyClass' not found in /nstest/src/Container.php:9

오른쪽

 <? // A user-defined exception handler function function myException($exception) { logError($exception->description()) // We don't show Exception to final users } // Set user-defined exception handler function set_exception_handler("myException");

발각

  • [x] 자동

돌연변이 테스트를 사용하여 문제를 시뮬레이션하고 문제가 올바르게 처리되는지 확인할 수 있습니다.

태그

  • 보안

결론

우리는 계속 성숙해져야 합니다.


우리의 솔루션은 엉성해서는 안됩니다.



우리는 진지한 소프트웨어 엔지니어로서 명성을 높여야 합니다.

처지

코드 냄새 72 - 반환 코드

더 많은 정보

빠른 실패

부인 성명

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

크레딧

사진: Jesse Orrico, Unsplash


내 문제의 80%는 단순한 논리 오류입니다. 나머지 문제의 80%는 포인터 오류입니다. 남은 문제는 어렵다.

마크 도너

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


코드 냄새 167 - 해싱 비교

해싱은 두 개체가 서로 다르다는 것을 보장합니다. 그것들이 똑같다는 것은 아닙니다.


요약: 해시를 확인하는 경우 동등성도 확인해야 합니다.

문제

솔루션

  1. 해시(빠름)를 확인한 다음 동등성(느림)을 확인합니다.

문맥

2022년 10월 7일에 대규모 블록체인 중 하나가 중단되었습니다.


대부분의 블록체인은 정의상 분산화되어 있기 때문에 이 소식은 충격적이었습니다.


여기에서 전체 기사를 읽을 수 있습니다.

해커가 코드 냄새를 악용하여 5억 6600만 달러를 훔친 방법

샘플 코드

잘못된

 public class Person { public String name; // Public attributes are another smell @Override public boolean equals(Person anotherPerson) { return name.equals(anotherPerson.name); } @Override public int hashCode() { return (int)(Math.random()*256); } // This is just an example of non-correlation // When using HashMaps we can make a mistake // and guess the object is not present in the collection }

오른쪽

 public class Person { public String name; // Public attributes are another smell @Override public boolean equals(Person anotherPerson) { return name.equals(anotherPerson.name); } @Override public int hashCode() { return name.hashCode(); } // This is just an example of non-correlation }

발각

  • [x] 반자동

많은 린터에는 해시 및 동등성 재정의에 대한 규칙이 있습니다.


돌연변이 테스트를 통해 동일한 해시로 다양한 개체를 시드하고 테스트를 확인할 수 있습니다.

  • 신원
  • 보안

결론

모든 성능 향상에는 단점이 있습니다.


캐시와 복제가 주목할만한 예입니다.


우리는 그것들을 조심스럽게 사용할 수 있습니다.

처지

코드 냄새 49 - 캐시

코드 냄새 150 - 동등 비교

더 많은 정보

평등과 해시

자바의 해시코드

해시 코드 대 같음

부인 성명

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


독자 중 일부는 놀라겠지만, 나의 주된 관심은 컴퓨터 보안이 아닙니다. 나는 주로 의도한 대로 작동하는 소프트웨어를 작성하는 데 관심이 있습니다.

비체 베네마

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


코드 냄새 168 - 문서화되지 않은 결정

우리는 몇 가지 변화를 주어야 합니다. 우리는 그 이유를 분명히 해야 합니다.

핵심요약: 설계 또는 구현 결정을 선언적으로 작성하세요.

문제

  • 코드 주석
  • 테스트 용이성 부족

솔루션

  1. 이유를 명시적으로 설명하세요.
  2. 주석을 메소드로 변환하십시오.

문맥

때때로 우리는 쉽게 테스트할 수 없는 임의의 규칙을 발견합니다.


실패한 테스트를 작성할 수 없다면 주석 대신 훌륭하고 선언적인 이름을 가진 함수가 필요합니다.

샘플 코드

잘못된

 // We need to run this process with more memory set_memory("512k) run_process();

오른쪽

 increase_memory_to_avoid_false_positives(); run_process();

발각

  • [x] 반자동

이것은 의미 론적 냄새입니다.


우리는 댓글을 감지하고 경고할 수 있습니다.

태그

  • 코멘트

결론

코드는 산문이다. 그리고 디자인 결정은 서술적이어야 합니다.

처지

코드 냄새 05 - 댓글 남용자

코드 냄새 75 - 메소드 내부의 주석

부인 성명

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

크레딧

사진: Goh Rhy Yan, Unsplash


사람과 마찬가지로 프로그램도 늙어갑니다. 노화를 예방할 수는 없지만 그 원인을 이해하고 그 영향을 제한하며 일부 손상을 되돌릴 수는 있습니다.

마리오 푸스코

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


코드 냄새 169 - 접착 방법

한 번에 두 가지 이상의 것을 만들지 마십시오.

핵심요약: 메소드에서 가능한 원자성을 갖도록 노력하세요

문제

  • 결합 코드
  • 테스트하기가 더 어렵습니다.
  • 읽기가 더 어렵다

솔루션

  1. 방법을 깨뜨려라

리팩토링

https://maximilianocontieri.com/refactoring-002-extract-method

문맥

'And'로 메소드 이름을 지정하면 추출 및 중단 메소드 기회를 놓칠 가능성이 높습니다.

샘플 코드

잘못된

 calculatePrimeFactorsRemoveDuplicatesAndPrintThem() // Three responsibilities

오른쪽

 calculatePrimeFactors(); removeDuplicates(); printNumbers(); // Three different methods // We can test them and reuse them

발각

  • [x] 반자동

일부 린터는 'and'라는 용어를 포함한 메소드에 대해 경고할 수 있습니다.

태그

  • 커플 링

결론

방법을 만들 때 고무 오리 이야기를 하면서 우리가 제대로 만들고 있는지 스스로에게 말하는 것이 매우 중요합니다.

처지

%[ https://maximilianocontieri.com/code-smell-85-and-functions ]

부인 성명

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

크레딧

UnsplashScott Sanker 사진


대부분의 다른 분야와 마찬가지로 프로그래밍 기술을 배우는 것은 먼저 규칙을 배우고 그 규칙을 깨뜨릴 때를 배우는 것으로 구성됩니다.

조슈아 블로흐


코드 냄새 170 - 기능 변경으로 리팩토링

개발은 훌륭합니다. 리팩토링은 놀랍습니다. 동시에 만들지 마세요.

핵심요약: 기능적 변경과 리팩터링을 동시에 하지 마세요.

문제

  • 솔루션 검토가 어려움
  • 병합 충돌

솔루션

  1. 리팩토링하는 동안 기능을 변경하지 마십시오.

문맥

때때로 우리는 추가 개발을 위해 리팩토링이 필요하다는 것을 감지합니다.


우리는 학습 전문가입니다.


우리는 해결책을 보류해야 합니다. 리팩토링 작업을 진행하고 솔루션을 계속 사용하세요.

샘플 코드

잘못된

 getFactorial(n) { return n * getFactorial(n); } // Rename and Change factorial(n) { return n * factorial(n-1); } // This is a very small example // Things go works while dealing with huge code

오른쪽

 getFactorial(n) { return n * getFactorial(n); } // Change getFactorial(n) { return n * getFactorial(n-1); } // Run the tests factorial(n) { return n * factorial(n-1); } // Rename

발각

이것은 리팩토링 냄새입니다.

  • [x] 수동

태그

  • 리팩토링

결론

물리적 토큰을 사용해야 합니다.


우리는 리팩토링 단계이거나 개발 단계에 있습니다.

부인 성명

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

크레딧

사진: Dannie Jing , Unsplash


코드를 공부할 때 리팩토링을 통해 내가 놓칠 수 있는 더 높은 수준의 이해를 얻을 수 있습니다. 이해력 리팩토링을 쓸모없는 코드 조작으로 일축하는 사람들은 혼란 뒤에 숨겨진 기회를 결코 보지 못한다는 사실을 깨닫지 못합니다.

마틴 파울러


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