paint-brush
코드에서 불쾌한 부분을 찾는 방법 [XLVI부]~에 의해@mcsee
635 판독값
635 판독값

코드에서 불쾌한 부분을 찾는 방법 [XLVI부]

~에 의해 Maximiliano Contieri10m2023/11/27
Read on Terminal Reader

너무 오래; 읽다

카우보이 코더는 모범 사례를 따르지 않습니다. 그들은 팀의 제안을 따르지 않습니다. 카우보이 코딩은 유지 관리가 어렵고 오류가 발생하기 쉬운 코드로 이어질 수 있기 때문에 일반적으로 소프트웨어 개발에 대한 비전문적이고 위험한 접근 방식으로 간주됩니다.
featured image - 코드에서 불쾌한 부분을 찾는 방법 [XLVI부]
Maximiliano Contieri HackerNoon profile picture

코드에서 냄새가 나는 이유는 코드를 편집하거나 개선할 수 있는 경우가 많기 때문입니다.


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

이전 코드 냄새

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


계속하자...


코드 냄새 226 - 혼합 우선순위

또 다른 추락한 우주선. 또 다른 소프트웨어 문제


핵심요약: 소프트웨어를 설계하고 테스트하세요. 하드웨어에 비해 가격이 저렴합니다.

문제

솔루션

  1. 정확한 시뮬레이션 생성
  2. 내결함성 소프트웨어 만들기

문맥

루나 25호는 2023년 8월 19일 달 표면에 추락했습니다.


인도 찬드라얀 3 호가 달 남극에 연착륙하기 4일 전.


포렌식 분석 결과 해당 명령이 버스를 공유했으며 우선순위가 올바르게 지정되지 않은 것으로 나타났습니다.


우주선은 오랫동안 소프트웨어 결함의 역사를 가지고 있습니다.

샘플 코드

잘못된

 class TaskManager: def __init__(self): self.tasks = [] def add_task(self, task, priority): self.tasks.append((task, priority)) def execute_tasks(self): # No sorting for task, _ in self.tasks: task.execute() class Task: def __init__(self, name): self.name = name def execute(self): print(f"Executing task: {self.name}") task_manager = TaskManager() highPriorityTask = Task("Slow down") mediumPriorityTask = Task("Take Photos") reviveKlaatu = Task("Klaatu barada nikto") # unsorted task_manager.add_task(mediumPriorityTask, 2) task_manager.add_task(highPriorityTask, 1) task_manager.add_task(reviveKlaatu, 3) task_manager.execute_tasks()

오른쪽

 class TaskManager: def __init__(self): self.tasks = [] def add_task(self, task, priority): self.tasks.append((task, priority)) def execute_tasks(self): # Sort tasks by priority (high to low) self.tasks.sort(key=lambda x: x[1], reverse=True) for task, _ in self.tasks: task.execute() class Task: def __init__(self, name): self.name = name def execute(self): print(f"Executing task: {self.name}") task_manager = TaskManager() highPriorityTask = Task("Slow down") mediumPriorityTask = Task("Take Photos") reviveKlaatu = Task("Klaatu barada nikto") # unsorted task_manager.add_task(mediumPriorityTask, 2) task_manager.add_task(highPriorityTask, 1) task_manager.add_task(reviveKlaatu, 3) task_manager.execute_tasks()

발각

  • [x] 수동

이건 디자인 냄새야

태그

  • 신뢰할 수 있음

결론

소프트웨어 구성요소를 생성하고 실제 조건과 실제 조건이 아닌 시뮬레이션을 수행합니다.

처지

코드 냄새 198 - 숨겨진 가정

더 많은 정보

부인 성명

코드 냄새는 내 의견 입니다.


분석 엔진은 무엇이든 생성하려는 어떠한 주장도 하지 않습니다. 그것은 수행 명령을 내리는 방법을 아는 것은 무엇이든 할 수 있습니다. 그러나 과학 자체에 간접적이고 상호적인 영향을 미칠 가능성이 높습니다.


에이다 러브레이스

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


코드 냄새 227 - 카우보이 코딩

카우보이를 할리우드 영화에 남겨두세요.


요약: 팀 프로그래머로서 코드 작성

문제

  • 가독성
  • 신뢰할 수 없는 코드
  • 인력 관리 문제
  • 조정 부족

솔루션

  1. 전문적인 코드를 작성하세요.


  2. 선언적이고 암호화되지 않은 이름을 사용하십시오.

문맥

카우보이 코더는 모범 사례를 따르지 않습니다.


그들은 팀의 제안을 따르지 않습니다.


카우보이 코딩은 유지 관리가 어렵고 오류가 발생하기 쉬운 코드로 이어질 수 있기 때문에 일반적으로 소프트웨어 개발에 대한 비전문적이고 위험한 접근 방식으로 간주됩니다.


카우보이 프로그래머는 좋은 사람들입니다. 그러나 그룹으로 활동할 수는 없습니다 .

샘플 코드

잘못된

 # Very simple example # Compute the sum of two numbers without any structure or best practices. num1 = input("Enter the first number: ") num2 = input("Enter the second number: ") # WARNNING!!!! Don't remove the line below !!!!! # (Unpleasant comment) res = num1 + num2 # (No data type checking or error handling) print("The sum is: " + result) # (No validation or formatting) # (No good names, no functions, no error handling, no testing, # no version control, and no structure.)

오른쪽

 def add_numbers(): try: firstAddend = float(input("Enter the first number: ")) secondAddend = float(input("Enter the second number: ")) total = firstAddend + secondAddend return total except ValueError: print("Invalid input. Please enter valid numbers.") return None def main(): total = add_numbers() if total is not None: print("The sum is: {:.2f}".format(sum)) if __name__ == "__main__": main()

발각

  • [x] 수동


이러한 코딩 관행을 방지하고 팀 구축을 시행하기 위해 환경 규칙을 설정할 수 있습니다.

예외

  • 아주 작은 개인 프로젝트

태그

  • 선언적

결론

소프트웨어 개발은 팀워크입니다.

처지

코드 냄새 06 - 너무 영리한 프로그래머

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

코드 냄새 105 - 코미디언 방법

더 많은 정보

https://www.linkedin.com/pulse/software-development-cowboy-coding-hakan-atbaş/

크레딧

사진: Taylor Brandon, Unsplash


컴퓨터의 위험은 컴퓨터가 결국 남자만큼 똑똑해진다는 데 있는 것이 아니라 그 사이에 우리가 중간에 컴퓨터를 만나기로 동의하게 된다는 점입니다.

버나드 아비샤이


코드 냄새 228 - 파일당 여러 클래스

하나 이상의 수업은 엉망입니다.


핵심요약: 우려사항 분리 원칙과 파일 구성을 따르세요.

문제

  • 코드 구성
  • 커플 링
  • 자동 로딩 문제
  • 디버깅
  • 버전 제어 및 병합 충돌

솔루션

  1. 파일당 단일 클래스 선언


  2. 이름 범위 지정 사용

문맥

파일 시스템을 사용하여 클래스를 선언하는 언어에서는 일반적으로 파일당 하나의 클래스를 갖는 것이 모범 사례로 간주됩니다.


이 접근 방식은 코드 구성 및 유지 관리성을 개선하고 잠재적인 문제를 줄이는 데 도움이 됩니다.


프로젝트 구조 내에서 네임스페이스를 별도의 디렉터리로 구성할 수 있습니다.


이렇게 하면 단일 파일에서 여러 클래스를 선언하는 문제를 피하면서 논리적이고 효율적인 코드베이스를 유지할 수 있습니다.

샘플 코드

잘못된

 <? namespace MyNamespace; class Class1 { public function sayHello() { echo "Hello from Class1!\n"; } } class Class2 { public function sayHello() { echo "Hello from Class2!\n"; } }

오른쪽

 <? namespace MyNamespace; class Class1 { public function sayHello() { echo "Hello from Class1!\n"; } }
 <? namespace MyNamespace; class Class2 { public function sayHello() { echo "Hello from Class2!\n"; } }

발각

  • [x] 자동

많은 표준이 이 규칙을 시행합니다.

태그

  • 커플 링

결론

코드를 체계적으로 유지하고 알려진 표준을 따르세요.

처지

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

더 많은 정보

크레딧

UnsplashMarjan Blan 사진


요구 사항이나 디자인이 없으면 프로그래밍은 빈 텍스트 파일에 버그를 추가하는 기술입니다.


루이스 스리글리


코드 냄새 229 - 빨간 테이프

코드가 너무 복잡해졌습니다.


핵심요약: 우발적인 복잡성과 관료주의를 피하세요

문제

솔루션

  1. MAPPER를 사용하여 실제 객체에 책임을 할당합니다.

문맥

"빨간 테이프" 코드 냄새는 코드베이스를 이해하거나 유지 관리하기 어렵게 만드는 불필요한 복잡성, 관료주의 또는 과도한 구성과 관련될 수 있습니다.

샘플 코드

잘못된

 class VotingSystem: def __init__(self, config): self.config = config def validate_voter(self, voter_id): if self.config['voter_verification_enabled']: # Code to verify the voter's identity goes here def cast_vote(self, voter_id, candidate): if self.config['voting_enabled']: # Code to record the vote goes here def generate_vote_report(self): if self.config['generate_report']: # Code to generate a voting report goes here def audit_voting_system(self): if self.config['audit_enabled']: # Code to perform an audit of the voting system goes here # ... other voting-related methods ... # Usage config = { 'voter_verification_enabled': True, 'voting_enabled': False, 'generate_report': False, 'audit_enabled': True } voting_system = VotingSystem(config) # Voter validation, voting, report generation, # and auditing are handled based on the configuration.

오른쪽

 class VoterVerification: def verify_voter(self, voter_id): # Code to verify the voter's identity goes here class VotingMachine: def cast_vote(self, voter_id, candidate): # Code to record the vote goes here class VoteReporter: def generate_report(self): # Code to generate a voting report goes here class VotingAuditor: def audit_voting_system(self): # Code to perform an audit of the voting system goes here # Usage voter_verification = VoterVerification() voting_machine = VotingMachine() vote_reporter = VoteReporter() voting_auditor = VotingAuditor() # Voter verification, vote casting, report generation, # and auditing are handled separately.

발각

  • [x] 반자동

일부 도구는 불필요한 책임으로 개체를 부풀리고 있다고 추측할 수 있습니다.

태그

  • 블로터

결론

개발자가 어떤 기능이 활성화되어 있는지 확인하기 위해 복잡한 구성을 탐색해야 하기 때문에 형식적인 코드 냄새는 분명합니다.


이로 인해 불필요한 복잡성이 추가될 뿐만 아니라 시스템 무결성에 영향을 줄 수 있는 잘못된 구성 가능성도 높아집니다.

처지

코드 냄새 54 - 앵커 보트

부인 성명

코드 냄새는 내 의견 입니다.

크레딧

Unsplash폭발 사진


소프트웨어의 오류: 작동하고 아무것도 변경하지 않으면 계속 작동합니다.

제시카 커


코드 냄새 230 - 슈뢰딩거 코드

귀하의 코드는 죽었고 살아 있습니다.


핵심요약: 경쟁 조건을 주의 깊게 살펴보세요.

문제

솔루션

  1. 경쟁 조건을 피하세요


  2. 전역 변수를 피하세요


  3. 적절한 동기화 사용

문맥

슈뢰딩거 코드는 동시에 두 가지 다른 상태에 있을 수 있지만 실행될 때까지 코드의 상태가 결정되지 않는 코드입니다.


이는 코드에 경쟁 조건이 포함되어 있거나 코드가 다른 스레드나 프로세스에 의해 변경될 수 있는 전역 변수의 상태에 따라 달라질 때 발생할 수 있습니다.

샘플 코드

잘못된

 import threading cats_alive = 0 def thread_1(): cats_alive += 1 def thread_2(): cats_alive -= 1 if cats_alive > 0: feedThem() # The value of cats_alive is indeterminate, # so the code can be in either of the two states: # # 1. cats_alive > 0 and feedThem() is called. # 2. cats_alive <= 0 and feedThem() is not called.

오른쪽

 import threading lock = threading.Lock() cats_alive = 0 def thread_1(): with lock: cats_alive += 1 def thread_2(): with lock: cats_alive -= 1 if cats_alive > 0: feedThem() # With the lock, the two threads cannot access # the `cats_alive` variable at the same time. # This means that the value of `cats_alive` is always determined, # and the program will not exhibit Schrödinger code behavior.

발각

  • [x] 수동

동시 코드에 대한 코드 검토

태그

  • 동시성
  • 전역

결론

슈뢰딩거 코드를 피하려면 경쟁 조건을 피하고 다른 스레드나 프로세스에 의해 변경될 수 있는 전역 변수의 상태에 의존하지 마십시오.


코드에서 전역 변수를 사용해야 하는 경우 올바르게 동기화되었는지 확인하세요.

처지

코드 냄새 198 - 숨겨진 가정

코드 냄새 32 - 싱글톤

코드 냄새 60 - 글로벌 클래스

크레딧

사진: Yerlin Matu, Unsplash


프로그래머가 가장 하기 싫은 일은 내부 상태를 엉망으로 만드는 것입니다.

앨런 케이


다음 주에는 5가지 냄새가 더 나옵니다.