📚 اصول GRASP و مثالهای آن در OOAD
GRASP (General Responsibility Assignment Software Patterns)
مجموعهای از دستورالعملها در تحلیل و طراحی شیءگرا (OOAD) هستند که به ما کمک میکنند مسئولیتها را به کلاسها و اشیا بهصورت مؤثر تخصیص دهیم. در ادامه هر اصل را با یک مثال کاربردی بررسی میکنیم:
1️⃣ Creator – ایجاد کننده
مسئولیت ایجاد نمونههای یک کلاس را به خود کلاس یا یک کلاس کارخانه مرتبط واگذار کنید.
🔹️مثال:
در سیستم مدیریت کتابخانه، وقتی کتاب جدیدی اضافه میشود، یک شیء Book باید ایجاد شود. این مسئولیت میتواند به کلاس Library یا یک کلاس جداگانه مانند BookFactory سپرده شود تا منطق ایجاد شیء Book متمرکز و قابل مدیریت باشد.
2️⃣ Information Expert – کارشناس اطلاعات
مسئولیت را به کلاسی واگذار کنید که اطلاعات لازم برای انجام آن مسئولیت را دارد.
🔹️مثال:
هنگام امانت گرفتن کتاب، بررسی موجود بودن کتاب باید توسط کلاس Book انجام شود. کلاس Book اطلاعات وضعیت موجودی خود را دارد و میتواند بدون وابستگی به کلاسهای دیگر این بررسی را انجام دهد. این کار انسجام بالا و کاهش وابستگی را تضمین میکند.
3️⃣ Low Coupling – وابستگی کم
کلاسها باید حداقل وابستگی را به یکدیگر داشته باشند.
🔹️مثال:
در سیستم مدیریت کتابخانه، کلاس LibraryCatalog مسئول مدیریت کاتالوگ کتابهاست. به جای دسترسی مستقیم به کلاس Book برای بررسی موجودی، میتواند از یک رابط (interface) مانند Searchable استفاده کند. این کار باعث میشود LibraryCatalog وابستگی کمتری به کلاس Book داشته باشد و نگهداری سیستم آسانتر شود.
4️⃣ High Cohesion – انسجام بالا
مسئولیتهای درون یک کلاس باید مرتبط و متمرکز باشند.
🔹️مثال:
کلاس Book باید مسئولیتهای مرتبط با جزئیات کتاب مانند عنوان، نویسنده و موجودی را مدیریت کند. وظایف نامرتبط مثل احراز هویت کاربر باید توسط کلاسهای جداگانه مدیریت شوند تا هر کلاس تمرکز مشخصی داشته باشد و سیستم قابل نگهداری باشد.
5️⃣ Controller – کنترلکننده
مسئولیت مدیریت رویدادهای سیستم یا هماهنگی فعالیتها را به یک کلاس کنترلکننده واگذار کنید.
🔹️مثال:
در یک اپلیکیشن وب کتابخانه، زمانی که کاربر درخواست امانت کتاب میدهد، کلاس BorrowBookController مسئول مدیریت درخواست و هماهنگی با کلاسهای Book، User و Library است. این کار باعث تمرکز منطق کنترل و سازماندهی بهتر سیستم میشود.
6️⃣ Pure Fabrication – ساختگی خالص
کلاسهای جدیدی معرفی کنید تا مسئولیتها را بدون نقض انسجام و وابستگی کم انجام دهند.
🔹️مثال:
برای ارسال ایمیل هنگام امانت یا بازگشت کتاب، به جای افزودن منطق ایمیل به کلاسهای Book یا User، کلاس جداگانه NotificationService ایجاد میکنیم. این کلاس مسئولیت خالص ارسال ایمیل را برعهده دارد و انسجام و وابستگی کم را حفظ میکند.
7️⃣ Indirection – واسطهگری
از واسطهها یا انتزاعها برای کاهش وابستگی کلاسها و افزایش انعطافپذیری طراحی استفاده کنید.
🔹️مثال:
اگر چندین کلاس نیاز به دسترسی به اطلاعات کتاب دارند، میتوان یک رابط BookRepository معرفی کرد. کلاسها به جای دسترسی مستقیم به Book، از این رابط استفاده کنند تا انعطافپذیری و قابلیت تغییر آینده آسانتر شود.
8️⃣ Polymorphism – چندریختی
از ارثبری و اینترفیسها برای پیادهسازی چندین رفتار استفاده کنید.
🔹️مثال:
فرض کنید کتابها به دو نوع FictionBook و NonFictionBook تقسیم شوند و هر کدام قوانین امانت خاص خود را داشته باشند. با تعریف یک اینترفیس مشترک Book و پیادهسازی آن در کلاسهای مختلف، چندریختی اجازه میدهد فرآیند امانت بهطور یکنواخت و مستقل از نوع کتاب مدیریت شود و استفاده مجدد کد سادهتر شود.
🔖هشتگها:
#GRASP #OOAD #ObjectOrientedDesign #LowCoupling #HighCohesion