paint-brush
Cách tìm những phần khó chịu trong mã của bạn [Phần XLVI]từ tác giả@mcsee
635 lượt đọc
635 lượt đọc

Cách tìm những phần khó chịu trong mã của bạn [Phần XLVI]

từ tác giả Maximiliano Contieri10m2023/11/27
Read on Terminal Reader

dài quá đọc không nổi

Các lập trình viên cao bồi không tuân theo các phương pháp hay nhất. Họ không làm theo đề xuất của nhóm. Mã hóa cao bồi thường được coi là một cách tiếp cận không chuyên nghiệp và rủi ro để phát triển phần mềm vì nó có thể dẫn đến mã khó bảo trì và dễ bị lỗi.
featured image - Cách tìm những phần khó chịu trong mã của bạn [Phần XLVI]
Maximiliano Contieri HackerNoon profile picture

Mã của bạn có vấn đề vì có thể có nhiều trường hợp mã đó có thể được chỉnh sửa hoặc cải thiện.


Hầu hết những mùi này chỉ là gợi ý về điều gì đó có thể không ổn. Do đó, chúng không bắt buộc phải được sửa… (Tuy nhiên, bạn nên xem xét vấn đề này.)

Mùi mã trước đó

Bạn có thể tìm thấy tất cả các mùi mã trước đó (Phần I - XLV) tại đây .


Tiếp tục đi...


Mã Mùi 226 - Ưu tiên hỗn hợp

Một tàu vũ trụ khác bị rơi. Một vấn đề phần mềm khác


TL;DR: Thiết kế và kiểm thử phần mềm. Nó rẻ hơn phần cứng

Các vấn đề

Các giải pháp

  1. Tạo mô phỏng chính xác
  2. Tạo phần mềm có khả năng chịu lỗi

Bối cảnh

Luna-25 rơi trên bề mặt mặt trăng vào ngày 19 tháng 8 năm 2023.


4 ngày trước khi tàu Chandrayaan-3 của Ấn Độ hạ cánh xuống cực nam của Mặt Trăng.


Một phân tích điều tra cho thấy các hướng dẫn dùng chung một bus và không được ưu tiên chính xác.


Tàu vũ trụ có lịch sử lâu dài về lỗi phần mềm.

Mã mẫu

Sai

 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()

Phải

 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()

Phát hiện

  • [x] Hướng dẫn sử dụng

Đây là mùi thiết kế

Thẻ

  • độ tin cậy

Phần kết luận

Tạo các thành phần phần mềm và mô phỏng các điều kiện thực và không thực

quan hệ

Mã Mùi 198 - Những giả định ẩn giấu

Thêm thông tin

Tuyên bố từ chối trách nhiệm

Mùi mã là ý kiến của tôi.


Công cụ phân tích không có ý định tạo ra bất cứ thứ gì. Nó có thể làm bất cứ điều gì chúng ta biết cách ra lệnh cho nó thực hiện… Nhưng nó có khả năng gây ảnh hưởng gián tiếp và tương hỗ lên chính khoa học.


Ada Lovelace

Kỹ thuật phần mềm Những câu nói hay


Mã Mùi 227 - Mã Hóa Cao Bồi

Để lại những chàng cao bồi cho những bộ phim Hollywood.


TL;DR: Viết code với tư cách là lập trình viên nhóm

Các vấn đề

  • Khả năng đọc
  • Mã không đáng tin cậy
  • Vấn đề quản lý con người
  • Thiếu sự phối hợp

Các giải pháp

  1. Viết mã chuyên nghiệp.


  2. Sử dụng tên khai báo không khó hiểu.

Bối cảnh

Các lập trình viên cao bồi không tuân theo các phương pháp hay nhất.


Họ không làm theo đề xuất của nhóm.


Mã hóa cao bồi thường được coi là một cách tiếp cận không chuyên nghiệp và rủi ro để phát triển phần mềm vì nó có thể dẫn đến mã khó bảo trì và dễ bị lỗi.


Lập trình viên cao bồi là người tốt; tuy nhiên, họ không thể làm việc theo nhóm .

Mã mẫu

Sai

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

Phải

 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()

Phát hiện

  • [x] Hướng dẫn sử dụng


Bạn có thể đặt ra các quy tắc về môi trường để ngăn chặn các hoạt động viết mã này và thực thi việc xây dựng nhóm.

Ngoại lệ

  • Dự án cá nhân rất nhỏ

Thẻ

  • khai báo

Phần kết luận

Phát triển phần mềm là làm việc theo nhóm.

quan hệ

Code Smell 06 - Lập Trình Viên Quá Thông Minh

Mã Mùi 02 - Hằng số và những con số kỳ diệu

Mã Mùi 105 - Phương Pháp Diễn Hài

Thêm thông tin

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

Tín dụng

Ảnh của Taylor Brandon trên Bapt


Mối nguy hiểm từ máy tính không phải là chúng sẽ trở nên thông minh như đàn ông mà là chúng ta sẽ đồng ý chấp nhận chúng một nửa.

Bernard Avishai


Mã mùi 228 - Nhiều lớp trên mỗi tệp

Nhiều hơn một lớp là một mớ hỗn độn.


TL;DR: Tuân theo nguyên tắc tách biệt mối quan tâm và tổ chức tệp

Các vấn đề

  • Mã tổ chức
  • Khớp nối
  • Sự cố tự động tải
  • Gỡ lỗi
  • Xung đột kiểm soát phiên bản và hợp nhất

Các giải pháp

  1. Khai báo một lớp duy nhất cho mỗi tập tin


  2. Sử dụng phạm vi tên

Bối cảnh

Trong các ngôn ngữ khai báo các lớp bằng hệ thống tệp, việc có một lớp cho mỗi tệp thường được coi là cách thực hành tốt nhất.


Cách tiếp cận này giúp cải thiện tổ chức và khả năng bảo trì mã, đồng thời giảm thiểu các vấn đề tiềm ẩn.


Bạn có thể sắp xếp các không gian tên thành các thư mục riêng biệt trong cấu trúc dự án của mình.


Bằng cách này, bạn có thể duy trì một cơ sở mã hợp lý và hiệu quả đồng thời tránh được các vấn đề khi khai báo nhiều lớp trong một tệp.

Mã mẫu

Sai

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

Phải

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

Phát hiện

  • [x] Tự động

Nhiều tiêu chuẩn thực thi quy tắc này

Thẻ

  • Khớp nối

Phần kết luận

Giữ mã của bạn có tổ chức và tuân theo các tiêu chuẩn đã biết.

quan hệ

Code Smell 48 - Code Không Tiêu Chuẩn

Thêm thông tin

Tín dụng

Ảnh của Marjan Blan trên Bapt


Không có yêu cầu hoặc thiết kế, lập trình là nghệ thuật thêm lỗi vào một tệp văn bản trống.


Louis Srygley


Mã Mùi 229 - Red Tape

Bạn phức tạp hóa mã của bạn quá mức.


TL;DR: Tránh sự phức tạp và quan liêu vô tình

Các vấn đề

Các giải pháp

  1. Gán trách nhiệm cho các đối tượng trong thế giới thực bằng MAPPER .

Bối cảnh

Mùi mã "băng đỏ" có thể liên quan đến sự phức tạp không cần thiết, quan liêu hoặc cấu hình quá mức khiến cơ sở mã khó hiểu hoặc khó bảo trì hơn.

Mã mẫu

Sai

 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.

Phải

 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.

Phát hiện

  • [x] Bán tự động

Một số công cụ có thể đoán bạn đang dồn các trách nhiệm không cần thiết vào đối tượng của mình.

Thẻ

  • Áo phồng

Phần kết luận

Mùi mã quan liêu hiện rõ khi các nhà phát triển cần điều hướng cấu hình phức tạp để xác định tính năng nào đang hoạt động.


Điều này không chỉ làm tăng thêm sự phức tạp không cần thiết mà còn làm tăng khả năng cấu hình sai có thể ảnh hưởng đến tính toàn vẹn của hệ thống của bạn.

quan hệ

Mã Mùi 54 - Thuyền Neo

Tuyên bố từ chối trách nhiệm

Mùi mã là ý kiến của tôi.

Tín dụng

Ảnh chụp từ vụ nổ trên Bapt


Sai lầm về phần mềm: Nếu nó hoạt động và chúng ta không thay đổi gì thì nó sẽ tiếp tục hoạt động.

Jessica Kerr


Mã Mùi 230 - Mã Schrödinger

Mã của bạn đã chết và còn sống.


TL;DR: Xem xét kỹ điều kiện cuộc đua

Các vấn đề

Các giải pháp

  1. Tránh điều kiện cuộc đua


  2. Tránh các biến toàn cục


  3. Sử dụng đồng bộ hóa thích hợp

Bối cảnh

Mã Schrödinger là mã có thể ở hai trạng thái khác nhau cùng một lúc, nhưng trạng thái của mã không được xác định cho đến khi nó được thực thi.


Điều này có thể xảy ra khi mã chứa điều kiện tương tranh hoặc khi mã phụ thuộc vào trạng thái của biến toàn cục có thể được thay đổi bởi các luồng hoặc quy trình khác.

Mã mẫu

Sai

 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.

Phải

 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.

Phát hiện

  • [x] Hướng dẫn sử dụng

Thực hiện đánh giá mã trên mã đồng thời

Thẻ

  • Đồng thời
  • Quả cầu

Phần kết luận

Để tránh mã Schrödinger, hãy tránh các điều kiện chạy đua và tránh phụ thuộc vào trạng thái của các biến toàn cục có thể được thay đổi bởi các luồng hoặc quy trình khác.


Nếu bạn cần sử dụng biến toàn cục trong mã của mình, hãy đảm bảo biến đó được đồng bộ hóa chính xác.

quan hệ

Mã Mùi 198 - Những giả định ẩn giấu

Mã Mùi 32 - Singletons

Mã Mùi 60 - Lớp học toàn cầu

Tín dụng

Ảnh của Yerlin Matu trên Bapt


Điều cuối cùng bạn muốn bất kỳ lập trình viên nào làm là gây rối với trạng thái bên trong

Alan Kay


Tuần sau có thêm 5 mùi nữa.