خدمات در مقابل کنترل کننده های فرمان – انجمن DEV

مقدمه
سازماندهی کد در یک برنامه کاربردی برای نگهداری و مقیاس پذیری آن بسیار مهم است.
دو رویکرد رایج برای ساختاردهی کد عبارتند از سرویس ها و کنترل کننده های فرمان.
در این پست وبلاگ، این رویکردها را بررسی خواهیم کرد و در مورد زمان مناسب استفاده از هر یک بحث خواهیم کرد.
خدمات
خدمات یک راه موثر برای محصور کردن منطق کسب و کار و ارائه عملیات سطح بالاتر است.
آنها جزئیات پیاده سازی را انتزاع می کنند و ماژولار بودن کد را ارتقا می دهند.
خدمات به ویژه در هنگام مدیریت عملیات پیچیده که شامل چندین مؤلفه است مفید هستند.
در اینجا نمونه ای از خدمات پرداخت آورده شده است:
class PaymentService:
...
def process_payment(self, amount: Money, payment_method: str) -> None:
# Validate payment details
# Process payment
# Update transaction records
# Send confirmation email
در قطعه کد بالا، PaymentService
منطق پردازش پرداخت را در بر می گیرد.
اعتبارسنجی را انجام می دهد، پرداخت را پردازش می کند، سوابق تراکنش را به روز می کند و یک ایمیل تأیید ارسال می کند.
با کپسوله کردن این عملیات در یک سرویس، می توانیم کد را ماژولار و قابل نگهداری نگه داریم.
کنترل کننده های فرمان
کنترل کننده های فرمان بر اجرای دستورات یا اقدامات خاص تمرکز می کنند.
آنها از اصل مسئولیت واحد (SRP) پیروی می کنند و نگرانی ها را از هم جدا می کنند.
کنترلکنندههای فرمان زمانی مفید هستند که بخواهیم یک کار یا عمل خاص را در هر کنترلکننده انجام دهیم.
مثال زیر از یک کنترل کننده فرمان برای ثبت نام کاربر را در نظر بگیرید:
class RegisterUserCommandHandler:
def handle(self, command: RegisterUser) -> None:
# Validate user input
# Create user record in the database
# Send welcome email
یا در بیشتر Pythonic
روش، ما می توانیم این کار را به این صورت انجام دهیم:
class RegisterUserCommandHandler:
def __call__(self, command: RegisterUser) -> None:
# Validate user input
# Create user record in the database
# Send welcome email
در این مثال، RegisterUserCommandHandler
مسئولیت رسیدگی به ثبت نام یک کاربر را بر عهده دارد.
ورودی کاربر را تأیید می کند، یک رکورد کاربر در پایگاه داده ایجاد می کند و یک ایمیل خوش آمد می فرستد.
با استفاده از کنترلکنندههای فرمان، میتوانیم پایگاه کد خود را متمرکز نگه داریم و یک مسئولیت را برای هر کنترلکننده حفظ کنیم.
مزایا و معایب
هر دو خدمات و کنترل کننده های فرمان مزایا و معایب خود را دارند. بیایید آنها را با جزئیات بیشتر بررسی کنیم:
خدمات:
طرفداران:
- کپسوله سازی: خدمات منطق کسب و کار را در بر می گیرد و مدیریت و استدلال در مورد آن را آسان تر می کند.
- ماژولاریت: خدمات جزئیات پیاده سازی را انتزاعی می کنند، ماژولار بودن کد و قابلیت استفاده مجدد را ارتقا می دهند.
- مدیریت عملیات پیچیده: سرویس ها می توانند چندین مؤلفه را هماهنگ کرده و به طور مؤثر عملیات پیچیده را مدیریت کنند.
معایب:
- پتانسیل برای کلاسهای خدمات بزرگتر و پیچیدهتر: با رشد برنامه، خدمات ممکن است بزرگتر و نگهداری آنها سختتر شود.
- مشکل در حفظ مسئولیت واحد: حفظ یک اصل مسئولیت واحد در کلاس های خدمات بزرگ می تواند چالش برانگیز باشد.
کنترل کننده های فرمان:
طرفداران:
- سادگی: کنترلکنندههای فرمان روی وظایف خاص تمرکز میکنند و پایگاه کد را سادهتر و قابل نگهداریتر میکنند.
- مسئولیت منفرد: هر کنترل کننده فرمان مسئولیت روشنی دارد که جداسازی نگرانی ها را ترویج می کند.
- سهولت تست و نگهداری: با کنترلرهای فرمان، نوشتن تست های واحد و حفظ کد به دلیل ماهیت متمرکز آنها آسان تر است.
معایب:
- افزایش تعداد کلاسها: با افزایش تعداد دستورات، تعداد کنترلکنندههای دستور افزایش مییابد که به طور بالقوه منجر به ایجاد یک پایگاه کد بزرگتر میشود.
- پتانسیل برای تکرار کد: کنترلکنندههای فرمان ممکن است منطق مشابهی را به اشتراک بگذارند که اگر به درستی مدیریت نشود منجر به کد تکراری میشود.
انتخاب رویکرد مناسب
انتخاب بین سرویسها و کنترلکنندههای فرمان به نیازهای خاص و پیچیدگی برنامه شما بستگی دارد.
در اینجا چند دستورالعمل برای کمک به تصمیم گیری آگاهانه وجود دارد:
- پیچیدگی و اندازه برنامه خود را در نظر بگیرید. اگر شامل عملیات پیچیده و اجزای متعدد باشد، خدمات ممکن است انتخاب مناسبی باشد.
- سطح مدولار بودن و تفکیک نگرانی های مورد نیاز را ارزیابی کنید. اگر برنامه شما به درجه بالایی از مدولار بودن و تفکیک مسئولیت ها نیاز دارد، کنترلرهای فرمان می توانند رویکرد متمرکزتر و قابل نگهداری را ارائه دهند.
- به پتانسیل استفاده مجدد و نگهداری کد فکر کنید. اگر عملکردها یا عملیات مشترکی وجود دارد که باید در بخشهای مختلف برنامه شما مجدداً مورد استفاده قرار گیرند، سرویسها میتوانند به ترویج استفاده مجدد از کد کمک کنند. از سوی دیگر، اگر تغییرات یا بهروزرسانیهای مکرر در اقدامات یا وظایف خاص را پیشبینی میکنید، کنترلکنندههای فرمان میتوانند تعمیر و نگهداری و آزمایش را آسانتر کنند.
- سطح تست مورد نیاز برای برنامه را در نظر بگیرید. اگر برنامه شما به آزمایش گسترده در سطح فرمان نیاز دارد یا اگر از یک الگوی CQRS (تفکیک مسئولیت پرس و جوی فرمان) پیروی می کنید، کنترل کننده های فرمان می توانند آزمایش واحد را تسهیل کنند و تفکیک واضحی بین دستورات و پرس و جوها ایجاد کنند.
با در نظر گرفتن دقیق این عوامل و درک معاوضههای هر رویکرد، میتوانید رویکردی را انتخاب کنید که به بهترین وجه با نیازهای برنامه شما مطابقت داشته باشد، قابلیت نگهداری کد و مقیاسپذیری را ارتقا دهد.
به یاد داشته باشید که این تصمیم را مستند کنید! برای این کار می توانید از ADR ها استفاده کنید.
دیگر
به یاد داشته باشید، هیچ راه حلی برای همه وجود ندارد.
انتخاب بین سرویس ها و کنترل کننده های فرمان به ویژگی های منحصر به فرد پروژه شما بستگی دارد.
با ارزیابی دقیق پیچیدگی، ماژولار بودن، استفاده مجدد از کد و الزامات آزمایش، می توانید رویکردی را انتخاب کنید که به بهترین وجه با نیازهای برنامه شما همخوانی دارد.
سازماندهی کد و قابلیت نگهداری از عوامل کلیدی در موفقیت بلندمدت هر پروژه نرم افزاری است.
بنابراین، با در نظر گرفتن اصول و الگوهای مورد بحث در این پست وبلاگ، زمانی را برای برنامه ریزی و ساختار پایه کد خود به طور مدبرانه اختصاص دهید.
امیدوارم این مقاله بینشهای ارزشمندی را در مورد بحث سرویسها و کنترلکنندگان فرمان به شما ارائه کرده باشد و به شما در تصمیمگیری آگاهانه در پروژههایتان کمک کند.
کد نویسی مبارک! 🚀
PS.
برنامه برای پست بعدی وبلاگ است “نحوه پیاده سازی CommandBus در پایتون” پس در جریان باشید 😉