Service and Repository Pattern | الگوی سرویس و ریپازیتوری
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Service Layer
لایه Service مسئول مدیریت منطق کسبوکار (Business Logic) برنامه است.
این لایه بهعنوان واسط بین لایه نمایش (UI) و لایه دسترسی به دادهها عمل میکند و تصمیم میگیرد چه فرایندهایی روی دادهها اجرا شوند.
- Repository Layer
لایه Repository وظیفه تعامل مستقیم با منبع داده را دارد؛ مثل Database یا یک آرایه (Array).
این لایه عملیاتهای پایه مانند ذخیرهسازی، جستجو و حذف دادهها را مدیریت میکند و تا حد امکان از سایر بخشهای برنامه مستقل نگه داشته میشود.
- Model
Model معمولاً یک Class است که ساختار دادههای اصلی برنامه را تعریف میکند.
برای مثال، فیلدهای مربوط به یک کاربر مانند name، username و password در این کلاس قرار میگیرند.
- CRUD Operations
CRUD مخفف چهار عملیات اصلی مدیریت داده است: Create، Read، Update و Delete.
- Separation of Concerns
Separation of Concerns یک اصل طراحی نرمافزار است که بر تفکیک مسئولیتها تأکید دارد.
هر بخش از کد، مانند مدیریت ورودی، منطق محاسباتی و ذخیرهسازی، باید در لایه مخصوص خود قرار بگیرد تا خوانایی و نگهداری پروژه سادهتر شود.
- Refactoring
Refactoring فرایند بازنویسی و اصلاح کد برای بهبود ساختار داخلی است، بدون اینکه رفتار بیرونی برنامه تغییر کند.
نکات مهم مصاحبهای
- چرا استفاده از الگوی Service-Repository اهمیت دارد؟
این الگو باعث جداسازی مسئولیتها میشود.
اگر ورودی کاربر، منطق برنامه و اتصال به دیتابیس همگی داخل کلاس Main نوشته شوند، با بزرگتر شدن پروژه نگهداری و توسعه دشوار میشود و احتمال خطا بالا میرود.
- تفاوت اصلی لایه
ServiceوRepositoryچیست؟
لایه Repository فقط با داده خام سروکار دارد؛ مثلاً جستجوی یک نام در یک لیست.
اما لایه Service منطق برنامه را پیادهسازی میکند؛ مثلاً بررسی میکند آیا رمز عبور واردشده با رمز عبور ذخیرهشده مطابقت دارد یا خیر.
- منظور از لایه
MenuیاControllerدر برنامههای کنسولی چیست؟
این لایه مسئول تعامل با کاربر است؛ ورودیها را با Scanner دریافت میکند و خروجی را در کنسول چاپ میکند.
این لایه نباید مستقیماً درگیر منطق دیتابیس یا جزئیات ذخیرهسازی داده شود.
- چگونه میتوان از بروز
NullPointerExceptionدر جستجوی دادهها جلوگیری کرد؟
قبل از فراخوانی هر متد روی یک شیء، مانند equals، داخل حلقه باید بررسی کنید که مقدار آن خانه از آرایه null نباشد.
مثال یا سناریوی کاربردی
در این سناریو، یک سیستم ثبتنام (Sign Up) و ورود (Sign In) بهصورت لایهبندیشده پیادهسازی میشود:
- لایه
Model: کلاسUserشامل فیلدهایname،usernameوpasswordتعریف میشود. - لایه
Repository: کلاسUserRepositoryمسئول مدیریت آرایه کاربران است. متدهایی مانندsaveبرای افزودن کاربر جدید وfindByUsernameبرای جستجو در آرایه در این لایه قرار میگیرند. - لایه
Service: کلاسUserServiceمنطق برنامه را پیاده میکند. مثلاً در متد ثبتنام، ابتدا ازRepositoryبررسی میکند آیاusernameتکراری است یا خیر؛ اگر تکراری نبود، دستور ذخیرهسازی را صادر میکند. - لایه
Menu: کلاسUserMenuورودیها را از کاربر میگیرد و بر اساس عدد واردشده، متدهای مربوط درServiceرا فراخوانی میکند.
بیشتر بدانید
-
نکته
IDE: برای تغییر نام یک متد یا کلاس در کل پروژه بهصورت خودکار، درIntelliJاز میانبرShift + F6استفاده کنید (Refactor Rename). -
نکته کدنویسی: در برنامههای کنسولی، بعد از گرفتن مقدار عددی با
nextInt()، معمولاً لازم است یک بارnextLine()خالی فراخوانی شود تا مشکل جا ماندن ورودیهای بعدی برطرف شود. -
توسعهپذیری: اگرچه در این آموزش از آرایه برای ذخیرهسازی استفاده شده است، اما با این معماری اگر در آینده بخواهید از دیتابیس واقعی مثل
PostgreSQLاستفاده کنید، کافی است کدهای لایهRepositoryرا تغییر دهید و سایر لایهها بدون تغییر باقی میمانند. -
دنیای واقعی: امروزه برنامههای کنسولی کمتر استفاده میشوند و بیشتر سیستمها تحت وب هستند، اما درک این لایهبندی، پایه و اساس فریمورکهای بزرگی مثل
Springدر جاوا است.
