code smells 可以理解为代码中让人感觉到不舒服的地方。可能是代码规范问题,也可能是设计上的缺陷。
很多时候一段代码符合基本逻辑,能够正常运行,并不代表它是不“丑”的。代码中可能会存在诸如可读性差、结构混乱、重复代码太多、不够健壮等问题。
示例代码
"""
Very advanced Employee management system.
"""
from dataclasses import dataclass
from typing import List
# The fixed number of vacation days that can be paid out.
FIXED_VACATION_DAYS_PAYOUT = 5
@dataclass
class Employee:
"""Basic representation of an employee at the company"""
name: str
role: str
vacation_days: int = 25
def take_a_holiday(self, payout: bool) -> None:
"""Let the employee take a single holiday, or pay out 5 holidays."""
if payout:
if self.vacation_days < FIXED_VACATION_DAYS_PAYOUT:
raise ValueError(
f"You don't have enough holidays left over for a payout. \
Remaining holidays: {self.vacation_days}"
)
try:
self.vacation_days -= FIXED_VACATION_DAYS_PAYOUT
print(
f"Paying out a holiday. Holidays left: {self.vacation_days}")
except Exception:
pass
else:
if self.vacation_days < 1:
raise ValueError(
"You don't have any holidays left. Now back to work, you!"
)
self.vacation_days -= 1
print("Have fun on your holiday. Don't forget to check your emails!")
@dataclass
class HourlyEmployee(Employee):
""" Employee that's paid based on number of worked hours."""
hourly_rate: float = 50
amount: int = 10
@dataclass
class SalariedEmployee(Employee):
"""Employee that's paid based on a fixed monthly salary."""
monthly_salary: float = 5000
class Company:
"""Represents a company with employees."""
def __init__(self) -> None:
self.employees: List[Employee] = []
def add_employee(self, employee: Employee) -> None:
self.employees.append(employee)
def find_managers(self) -> List[Employee]:
managers = []
for employee in self.employees:
if employee.role == "manager":
managers.append(employee)
return managers
def find_vice_presidents(self) -> List[Employee]:
vice_presidents = []
for employee in self.employees:
if employee.role == "president":
vice_presidents.append(employee)
return vice_presidents
def find_interns(self) -> List[Employee]:
interns = []
for employee in self.employees:
if employee.role == "intern":
interns.append(employee)
return interns
def pay_employee(self, employee: Employee) -> None:
if isinstance(employee, SalariedEmployee):
print(
f"Paying employee {employee.name} a monthly salary of ${employee.monthly_salary}"
)
elif isinstance(employee, HourlyEmployee):
print(
f"Paying employee {employee.name} a hourly rate of \
${employee.hourly_rate} for {employee.amount} hours."
)
def main() -> None:
company =