قدرت دکوراتورها: جداسازی نگرانی ها (SOC) در کد پایتون

دکوراتورها یک ویژگی مفید در پایتون هستند که امکان جداسازی نگرانی ها در کد را فراهم می کند. این به معنای کپسوله کردن عملکردهای مشابه در یک مکان واحد و کاهش تکرار کد است. با پیاده سازی عملکرد مشترک در یک دکوراتور، می توانیم قابلیت نگهداری و مقیاس پذیری کد خود را بهبود بخشیم.
یک مورد رایج برای دکوراتورها در چارچوب های وب مانند جنگو، فلاسک و FastAPI است. بیایید قدرت دکوراتورها را با استفاده از آنها به عنوان یک میان افزار برای ورود به پایتون درک کنیم. در یک محیط تولید، دانستن زمان لازم برای ارائه یک درخواست مهم است. این اطلاعات در تمام نقاط پایانی به اشتراک گذاشته می شود، بنابراین منطقی است که آن را در یک مکان با استفاده از دکوراتورها پیاده سازی کنید.
فرض کنید تابعی به نام “service_request()” داریم که مسئول رسیدگی به درخواست های کاربر است. ما می خواهیم زمان لازم برای اجرای این تابع را ثبت کنیم. یکی از راه های انجام این کار اضافه کردن عبارات ورود به سیستم در خود تابع است، مانند این:
import time
def service_request():
start_time = time.time()
# Function body representing complex computation
print(f"Time Taken: {time.time() - start_time}s")
return True
در حالی که این روش کار می کند، منجر به تکرار کد می شود. اگر مسیرها یا عملکردهای بیشتری داشته باشیم، باید کد ورود به سیستم را در هر کدام تکرار کنیم. این در تضاد با اصل DRY (خودت را تکرار نکن) کد تمیز است. برای جلوگیری از این امر، میتوانیم از دکوراتورها برای کپسوله کردن عملکرد ورود به سیستم استفاده کنیم.
میان افزار لاگ کردن چیزی شبیه به این خواهد بود:
def request_logger(func):
def wrapper(*args, **kwargs):
start_time = time.time()
res = func()
print(f"Time Taken: {time.time() - start_time}s")
return res
return wrapper
در این پیاده سازی، تابع خارجی “request_logger” تزئین کننده ای است که یک تابع را به عنوان ورودی می پذیرد. تابع داخلی “wrapper” عملکرد ورود به سیستم را پیاده سازی می کند و تابع اصلی “func” درون آن فراخوانی می شود. به این ترتیب، میتوانیم بدون تغییر کد تابع اصلی، از عملکرد ورود به سیستم استفاده کنیم.
برای استفاده از این دکوراتور، به سادگی تابع service_request را با استفاده از علامت @ تزئین می کنیم:
@request_logger
def service_request():
# Function body representing complex computation
return True
این به طور خودکار تابع service_request را به دکوراتور “request_logger” منتقل می کند، که زمان صرف شده را ثبت می کند و سپس تابع اصلی را فراخوانی می کند. این به ما این امکان را می دهد که به راحتی بدون تکرار کد، ورود به سیستم را به روش های مشابه به سایر روش های خدمات اضافه کنیم. مثلا:
@request_logger
def service_request():
# Function body representing complex computation
return True
@request_logger
def service_another_request():
# Function body
return True
به طور خلاصه، دکوراتورها به ما کمک میکنند تا عملکردهای مشترک را در یک مکان واحد محصور کنیم و کد ما را قابل نگهداری و مقیاسپذیرتر کنند. آنها همچنین از اصل جداسازی نگرانیها پیروی میکنند و به ما اجازه میدهند تا عملکردی را بدون تغییر کد اصلی اضافه کنیم. دکوراتورها ابزار قدرتمندی در پایتون هستند و به شدت در چارچوب های وب و سایر برنامه ها استفاده می شوند.
برنامه های مطالعه MyExamCloud
آزمون های تمرینی گواهینامه های جاوا – برنامه های مطالعه MyExamCloud
تست های تمرینی گواهینامه های پایتون – برنامه های مطالعه MyExamCloud
تست های تمرین گواهینامه AWS – برنامه های مطالعه MyExamCloud
تستهای تمرین گواهینامه Google Cloud – برنامههای مطالعه MyExamCloud
طرح مطالعه آزمون های تمرین استعداد MyExamCloud
MyExamCloud AI Exam Generator