برنامهنویسی تمیز (Clean Coding) در پایتون رویکردی است برای داشتن کدی که خوانا، قابل نگهداری و با ساختار صحیح باشد. یکی از اصول مهم در برنامهنویسی تمیز، اصل تکمسئولیتی (Single Responsibility Principle) است که توسط رابرت سی. مارتین (عمو باب) در کتاب Clean Code معرفی شده است. این اصل میگوید هر کلاس یا تابع در پایتون باید تنها یک وظیفه و مسئولیت مشخص داشته باشد.
نقل قول کلیدی از عمو باب برای تاکید بر اصل تکمسئولیتی:
"A class should have only one reason to change." (کتاب Clean Code، فصل 7)
اصل تکمسئولیتی در پایتون
اهمیت اصل تکمسئولیتی در برنامهنویسی تمیز
اصل تکمسئولیتی (SRP) میگوید که هر کلاس یا تابع باید تنها یک مسئولیت داشته باشد. این موضوع در برنامهنویسی تمیز پایتون کمک میکند تا کدها سادهتر و قابل نگهداریتر شوند.
“Functions should do one thing. They should do it well. They should do it only.”
— (Clean Code، فصل 3)
مثالهای عملی اصل تکمسئولیتی در پایتون
مثال اول: مدیریت دادههای کارمند
در مثال زیر، میخواهیم سیستمی برای مدیریت دادههای کارمندان طراحی کنیم که دارای سه وظیفه است. یک پیادهسازی نادرست از این سیستم ممکن است شامل تمامی این وظایف در یک کلاس واحد باشد که در ادامه نشان داده شده است:
class EmployeeManager:
def __init__(self, employee):
self.employee = employee
def calculate_salary(self):
return self.employee['hours_worked'] * self.employee['hourly_rate']
def send_salary_email(self):
salary = self.calculate_salary()
print(f"Email sent to {self.employee['email']}: Your salary is {salary}")
def log_financial_report(self):
salary = self.calculate_salary()
with open('financial_report.txt', 'a') as file:
file.write(f"{self.employee['name']} salary: {salary}\n")
مشکلات کد بالا:
- این کلاس دارای چندین مسئولیت است و تغییر در هر بخش میتواند کل کلاس را تحت تأثیر قرار دهد.
- به گفته عمو باب، برای داشتن کدی تمیز، هر کلاس باید تنها یک وظیفه را بر عهده داشته باشد.
پیادهسازی اصل تکمسئولیتی در پایتون
برای پیادهسازی اصل تکمسئولیتی، هر وظیفه را در یک کلاس مستقل قرار میدهیم.
class SalaryCalculator:
def __init__(self, employee):
self.employee = employee
def calculate(self):
return self.employee['hours_worked'] * self.employee['hourly_rate']
class EmailService:
def __init__(self, employee):
self.employee = employee
def send_salary_email(self, salary):
print(f"Email sent to {self.employee['email']}: Your salary is {salary}")
class FinancialLogger:
def __init__(self, employee):
self.employee = employee
def log_salary(self, salary):
with open('financial_report.txt', 'a') as file:
file.write(f"{self.employee['name']} salary: {salary}\n")
اکنون میتوانیم از هر کدام از این کلاسها به طور مستقل استفاده کنیم:
employee = {
'name': 'Ali',
'hours_worked': 160,
'hourly_rate': 20,
'email': 'ali@example.com'
}
calculator = SalaryCalculator(employee)
salary = calculator.calculate()
emailer = EmailService(employee)
emailer.send_salary_email(salary)
logger = FinancialLogger(employee)
logger.log_salary(salary)
مثال کاربردی ۲: سیستم سفارش آنلاین با اصل تکمسئولیتی در پایتون
بیایید به سراغ مثال دیگری برویم که در آن سیستمی برای سفارشات آنلاین داریم:
class OrderCalculator:
def __init__(self, items):
self.items = items
def calculate_total(self):
return sum(item['price'] * item['quantity'] for item in self.items)
class PaymentProcessor:
def process_payment(self, amount):
print(f"Processed payment of ${amount}")
class InvoiceSender:
def __init__(self, customer_email):
self.customer_email = customer_email
def send_invoice(self, amount):
print(f"Invoice for ${amount} sent to {self.customer_email}")
اکنون میتوانیم هر وظیفه را به طور مستقل اجرا کنیم:
items = [{'price': 10, 'quantity': 2}, {'price': 5, 'quantity': 5}]
calculator = OrderCalculator(items)
total = calculator.calculate_total()
payment_processor = PaymentProcessor()
payment_processor.process_payment(total)
invoice_sender = InvoiceSender('customer@example.com')
invoice_sender.send_invoice(total)
مزایای پیروی از اصل تکمسئولیتی در پایتون
خوانایی بالاتر: رعایت اصل تکمسئولیتی در پایتون باعث میشود که هر کلاس یا تابع تنها یک کار انجام دهد، که منجر به خوانایی بیشتر میشود.
"Clean code is readable and understandable." (کتاب Clean Code، فصل 1)
- قابلیت نگهداری بالا
- تست پذیریبالا
سخن نهایی
رعایت اصل تکمسئولیتی یا Single Responsibility Principle در برنامهنویسی تمیز پایتون به توسعهدهندگان کمک میکند تا کدهایی قابل نگهداری و قابل توسعه ایجاد کنند. به گفته رابرت سی. مارتین،"The purpose of a good software design is to minimize the human effort required to read and understand the code."
— (کتاب Clean Code، فصل 6)
