PDA

View Full Version : کلاس پایه



اوبالیت به بو
شنبه 23 آبان 1388, 12:22 عصر
سلام
دوستانه یه راهنمایی کنید به من بگید این روش درست هست یا خیر.
من تویه رسم Class Diagram ها به این صورت عمل می کنم که مثلا در کل سیستم یک کلاس رو به عنوان کلاس پایه در نظر می گیرم. مثلا در سیستم خبر کلاس پایه شامل درج خبر حذف خبر مشاهده خبر لیست اخبار و غیره شامل میشه. و کلاس های دیگه از این کلاس مشتق می شن. مثلا کلاس Admin علاوه بر متد های کلاس پایه یه سری متدهایی در خودش داره مثل تعریف کاربر تعریف سطح دسترسی و غیره.
حالا میشه گفت که در تمام سیستم ها میشه از کلاس پایه استفاده کرد؟

cups_of_java
شنبه 23 آبان 1388, 20:13 عصر
نه درست نیست! استفاده از وراثت اصلن این نیست!
admin هیچ ربطی به کلاس خبر نداره. شما باید شی گرایی و وراثت رو مطالعه کنید اول...
ضمنن نیازی نیست شما یه کلاس پدر (پایه) بگیری حتمن و بعد ...
هر جا انواع مختلفی از یک موجودیت داشته باشی و اون ها هم نوع باشن (رابطه is-a) لازمه که از وراثت استفاده کنی.

Elham_gh
شنبه 30 آبان 1388, 09:48 صبح
سلام
دوستانه یه راهنمایی کنید به من بگید این روش درست هست یا خیر.
من تویه رسم Class Diagram ها به این صورت عمل می کنم که مثلا در کل سیستم یک کلاس رو به عنوان کلاس پایه در نظر می گیرم. مثلا در سیستم خبر کلاس پایه شامل درج خبر حذف خبر مشاهده خبر لیست اخبار و غیره شامل میشه. و کلاس های دیگه از این کلاس مشتق می شن. مثلا کلاس Admin علاوه بر متد های کلاس پایه یه سری متدهایی در خودش داره مثل تعریف کاربر تعریف سطح دسترسی و غیره.
حالا میشه گفت که در تمام سیستم ها میشه از کلاس پایه استفاده کرد؟

اگه درست منظورتون رو متوجه شده باشم، شما يكسري خصوصيت و متد دارين كه مي خواين تمام كلاسهاتون اوها رو داشته باشند.در اينصورت مي تونين يك متاكلاس تعريف كنيد و بقيه كلاسهاتون رو از اون بگيريد.براي تعريف يك متا كلاس هم يك متا مدل تعريف كنيد.براي اين كار مي تونيد از profile در tools ي استفاده مي كنيد بهره بگيريد(البته روشهاي ديگر هم هست)
موفق باشيد

اوبالیت به بو
یک شنبه 01 آذر 1388, 20:04 عصر
یه نگاهی به این کلاس دیاگرام بندازید. البته کامنت هاش رو جدا نوشتم چون جا نشد.
این کلاس دیاگرام مال انتخاب واحد دانشگاه هست. کلاس Base متد های پایه رو شامل می شه که کلاس Student علاوه بر متد های خودش متدهای کلاس Base رو شامل می شه. کلاً همه کلاس هایی که با Base ارتباط دارن متدهای اون رو در خودشون دارن.
در واقع این کار نوعی صرفه جویی هستش. حالا این کار درست هستش؟

cups_of_java
دوشنبه 02 آذر 1388, 12:23 عصر
شی گرایی رو خوب استفاده نکردی شما. بعضی متد ها سر جاشون نیستن (مثلن courseList) بعضی متد ها به اشتباه تکراری شدند (مثل login) و اینکه بعضی وراثت ها بی معنی هست و به جا نیست.
ببین تنها راه فاکتورگیری Inheritance نیست. شما با استفاده از Composition می تونی فاکتورگیری و استفاده مجدد کنی.
در هر صورت باید صورت مسله و شرایطش هم مشخص باشه تا طرح رو دربیاریم. طرح یدونه نیست و می شه چندین طرح درست داد.
اما طرح شما ایراد هایی داره... نهایتن کاربرد کلاس های پایه این نیست که شما درج و حذف و ... بزاری توش بعد همه ازش وراثت بگیرن. برای انجام عملیات درج و حذف راه های دیگه هم هست. Teacher و Student تو سیستم نباید زیر یک کلاس پایه باشن.
سعی کن تو کلاس دیاگرام همش از وراثت استفاده نکنی. این کار دلیل خوب بودن طرح نیست.

اوبالیت به بو
دوشنبه 02 آذر 1388, 14:06 عصر
ممنون که ایرادات رو گفتین.
اگه ممکنه دیاگرام صحیح رو بکشید

cups_of_java
دوشنبه 02 آذر 1388, 14:27 عصر
چشم. اگر وقت کنم حتمن.

alimokhlesi
چهارشنبه 04 آذر 1388, 09:56 صبح
نه درست نیست! استفاده از وراثت اصلن این نیست!
admin هیچ ربطی به کلاس خبر نداره. شما باید شی گرایی و وراثت رو مطالعه کنید اول..

چرا ادمین هیچ ربطی به خبر نداره؟ الگوی طراحی استراتژی یا فکتوری این ارتباط و مشخص میکنه



کاربرد کلاس های پایه این نیست که شما درج و حذف و ... بزاری توش بعد همه ازش وراثت بگیرن

به نظر من این یکی از کاربردهاشه.
البته کار بردهای دیگه هم داره.



مي تونين يك متاكلاس تعريف كنيد


ممنون میشم متا دیتا و متا کلاس و کمی به من توضیح بدید. البته بدون وابستگی به زبان خاص. چون نمی دونم چی هستن
:)

cups_of_java
چهارشنبه 04 آذر 1388, 12:20 عصر
چرا ادمین هیچ ربطی به خبر نداره؟ الگوی طراحی استراتژی یا فکتوری این ارتباط و مشخص میکنه

ارتباط این دو توی دامنه مسله باید تعریف شه که من اطلاعاتی ازش ندارم. تو چیزی که ایشون گفته ارتباطی دیده نمیشه. بسته به اینکه ارتباط چی باشه می شه براشون از الگو ها استفاده کرد. نه؟



به نظر من این یکی از کاربردهاشه.
البته کار بردهای دیگه هم داره.

کاربرد درست وراثت رابطه is-a هستش. هر کاربرد دیگه ای از وراثت می تونه دچار آنومالی بشه. برای قرار دادن عملیات CRUD روی اشیا میشه از الگوی DAO استفاده کرد، میشه از الگوهای Object-Relational Mapping استفاده کرد...میشه از فکتوری استفاده کرد... (خیلی راه میشه ارایه داد بستگی به شرایط مسله داره...) حتی در ساده ترین حالت اگر میخوایم که این متد ها توی همه کلاس ها یاشن و بتونیم پلیمرفیک نگاشون کنیم میشه از Interface یکسان استفاده کرد. اما کلاس پایه شکل مناسبی نداره!
اولن چون فرزندان ذاتن از جنس کلاس پدر پایه نخواهند بود! در تقسیم وظایف ممکنه دچار اشتباه بشیم.
دومن ساختار سلسله مراتبی وراثت شما قابل گسترش و انعطاف نیست چون بر اساس is-a درست نشده.
سومن به مرور زمان این کلاس پایه که اتفاقن عملیات دیتابیسی انجام میده ممکنه کد هایی توش بیاد اضافه شه و به اشتراک دیگران گذاشته بشه که نباید میشده!
ببینید کلن اشتراک گذاری زیاد کار مناسبی نیست. دست آدم رو برای خراب کردن طرح خیلی باز میزاره. نهایتن طرحی که توش وراثت زیاد باشه، طرح شیگرای منعطف و قابل نگهداری ای نخواهد بود.