Django Service Object

Django Service Object

alireza-feizi

‌khat academy


شروع یک پروژه جدید همیشه هیجان انگیز است. شما فیچر ها رو مشخص می کنید. شروع به نوشتن تست های خود می کنید و کد خودتون رو پیاده سازی می کنید. اما پس از مدتی تو میونه راه یه سری چالش ها براتون بوجود میاد.
مدل ها و ویو های شما خیلی شلوغ شده و اونقدر منطق پیاده سازی کردید که حتی نمی دنید اونهارو کجا قرار بدید و یا مسیری که اونجا قرارشون دادید گم کردید.

آیا راه بهتری است؟
بله! سرویس آبجکت برای نجات آماده کمک به شماست

سرویس آبجکت (Service Object) چیست؟
خیلی ساده بخوام بگم، سرویس آبجکت جاییه که شما منطق بیزنس (Business logic) رو قرارش می دید.

فرض کنید در حال ساختن یک سیستم رزرو هستید. هنگامی که مشتری رزرو می کند، برنامه باید یک مشتری جدید ایجاد کند یا یک مشتری موجود را دریافت کند، باید یک رزرو در پایگاه داده ایجاد کند و سپس یک ایمیل تأیید ارسال کند. وقتی ایمیل تأیید شد، برنامه باید وضعیت رزرو را به‌روزرسانی کند و به سرپرست اطلاع دهد. در نهایت، زمانی که مدیر رزرو را تأیید کرد، برنامه باید وضعیت رزرو را به روز کند، یک فاکتور ایجاد کند و آن را برای مشتری ارسال کند.

تمام این منطق باید در Service Object قرار بگیرد.

حرف کافیه بیا کد بزنیم

سرویس آبجکت ها از Service ارث بری می کنند(نحوه پیاده سازی در ادامه) و دارای یک API مشابه با فرم های جنگو است. این به این دلیل است که Service در واقه از forms.Form ارث بری کرده است. تفاوت در این قسمت است که شما یک پراسس برای پیاده سازی منطق کسب و کار خودتون داخل سرویس آبجکت انجام می دید.

در اینجا من سروی CreateBooking رو نوشتم که سه کار رو انجام میده:
- مشتری رو به روز رسانی می کنه یا ایجاد می کنه.
- یک رزور ایجاد می کنه
- یک ایمیل تایید ارسال می کنه


اممم جالبه. چجوری ازش استفاده کنیم؟
فقط کافیه execute رو صدا بزنید و درست مثل form مقادیر رو ارسال کنید.

و متد process رزرو رو انجام می ده و بر میگردونه

خب اینم از Base Class که به این شکل نوشتیم

متد execute در بیس کلاس Service ورودی ها رو چک می کنه تا معتبر باشه و در صورت نامعتبر بودن یک exception ایجاد می کنه. همچنین این متد به ما این اطمینان رو میده که process داخل یک تراکنش اجرا بشه

زمانی که شما میخواید سرویسی رو اجرا کنید اما ورودی ها نامعتبر هستند InvalidInputsErrro اجرا میشه. می تونید به ارور فیلد های نامعتبر دسترسی داشته باشید.‌


اما چرا از Services objects استفاده کنیم؟

استفاده از Services objects امتیازات زیادی داره، برای مثال:

۱. جدا و سوا بودن از Presentation logic:
الان بیزنس لاجیک شما توی کلاس خودش قرار داره. شما می تونید از هر جایی صداش بزنید. از توی view ها، اندپوینت JSON، منیجمنت کتمند ها،‌RQ tasks،‌ جنگو ادمین و ... . دیگه بیزنس لاجیک شما محدود به view و یا model نمیشه

۲. به راحتی قابل تست و ماک است

۳. اعتبار سنجی ورودی:
دیگه نیاز نیست به صورت دستی بررسی کنید ببینید که آیا یک پارامتر معتبر هستش یا نه، کد شما خیلی مختصر تر می شه.‌


نتیجه گیری:

پروژه‌ها به سرعت پیچیده می‌شوند، و تنها قرار دادن منطق کسب‌وکارتان در ویوها و مدل‌ها، شما را در دنیایی از آسیب رها می‌کند. Service object به شما کمک می کند تا دچار این مشکل نشید.


Report Page