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 .
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
Tàu vũ trụ có lịch sử lâu dài về lỗi phần mềm.
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()
Mã Mùi 198 - Những giả định ẩn giấu
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
Để 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
# 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()
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
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
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
<? 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"; } }
Code Smell 48 - Code Không Tiêu Chuẩn
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
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
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.
Mùi mã là ý kiến của tôi.
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ã của bạn đã chết và còn sống.
TL;DR: Xem xét kỹ điều kiện cuộc đua
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.
Mã Mùi 198 - Những giả định ẩn giấu
Đ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