PDA

View Full Version : سوال: تعريف مناسب روابط بين كلاسها



beginner63
جمعه 04 مرداد 1387, 20:00 عصر
سلام
من به تازگي ميخوام برنامه نويسي oop رو شروع كنم. اما يه سوال مهم ذهنم رو مشغول كرده
فرض كنيد سيستمي براي انتخاب واحد داريم. پس كلاسي براي دانشجو داريم و كلاسي براي درسها. حالا دانشجو ميتونه درسي رو انتخاب كنه و بالعكس، درس ميتونه توسط دانشجو انتخاب بشه، بهترين راهكار براي چنين مسائلي چي هست؟ متد انتخاب درس رو براي كلاس دانشجو بگذاريم يا متد انتخاب شدن رو براي درس؟
لطفا راهنمايي كنيد
تشكر

Xcalivorse
جمعه 04 مرداد 1387, 20:13 عصر
البته برنامه نويسي به روش OOP همه جا به کار مي آيد و فعلا بهترين روش است. ولي در اين مورد شما بهتر است در بانک خود رابطه ها رو تعريف کنيد. در اين مورد ميتونيد از الگوي رابطه اي يا نيکسون براي طراحي بانک و جداول خود استفاده کنيد.

beginner63
شنبه 05 مرداد 1387, 14:19 عصر
تشكر از جوابي كه داديد، اما فكر ميكنيد به سوال بنده حقير مربوط ميشه!؟

Xcalivorse
شنبه 05 مرداد 1387, 14:28 عصر
بله دوست عزیز به خاطر اینکه کاری که منظور شماست به دلیل پویا بودن درسها و واحد های انتخابی در پیاده سازی مستقیم درسها و واحد ها به صورت کلاس مشکلاتی ایجاد خواهد کرد که خصوصا در گسترش و بسط برنامه خود را نشان می دهند.
این مرحله از کای که منظور شماست نیازی به پیاده سازی بوسیله شی گرایی ندارد و رابطه های مورد نظر میبایستی در DataBase تعریف شود.
با این کا برای حق انتخاب دادن به کاربر برای انتخاب یک درس و نیز مقید کردن درس به انتخاب شدن و نشدن در موارد خاص نیازی به پیاده سازی کلاس نیست و رابطه های تعریف شده در DataBase همین کار را انجام می دهند.

linux
شنبه 05 مرداد 1387, 18:24 عصر
سلام
من به تازگي ميخوام برنامه نويسي oop رو شروع كنم. اما يه سوال مهم ذهنم رو مشغول كرده
فرض كنيد سيستمي براي انتخاب واحد داريم. پس كلاسي براي دانشجو داريم و كلاسي براي درسها. حالا دانشجو ميتونه درسي رو انتخاب كنه و بالعكس، درس ميتونه توسط دانشجو انتخاب بشه، بهترين راهكار براي چنين مسائلي چي هست؟ متد انتخاب درس رو براي كلاس دانشجو بگذاريم يا متد انتخاب شدن رو براي درس؟
لطفا راهنمايي كنيد
تشكر
خوب تا اینجا را خوب آمدی
یک کلاس داریم به نام کلاس دانشجو
یک کلاس داریم به نام درسها
در کلاس دانشجو می توانیم یک خاصیت داشته باشیم که آرایه یا کالکشنی از کلاس درسها باشد.
شما حتما احتیاج به ذخیره این اطلاعات در دیتابیس هم دارید درست هست؟

beginner63
یک شنبه 06 مرداد 1387, 11:52 صبح
بله دوست عزیز به خاطر اینکه کاری که منظور شماست به دلیل پویا بودن درسها و واحد های انتخابی در پیاده سازی مستقیم درسها و واحد ها به صورت کلاس مشکلاتی ایجاد خواهد کرد که خصوصا در گسترش و بسط برنامه خود را نشان می دهند.
این مرحله از کای که منظور شماست نیازی به پیاده سازی بوسیله شی گرایی ندارد و رابطه های مورد نظر میبایستی در DataBase تعریف شود.
با این کا برای حق انتخاب دادن به کاربر برای انتخاب یک درس و نیز مقید کردن درس به انتخاب شدن و نشدن در موارد خاص نیازی به پیاده سازی کلاس نیست و رابطه های تعریف شده در DataBase همین کار را انجام می دهند.

پس شيء گرايي چي ميشه؟
من براي مثال درس و دانشجو رو گفتم. اين رابطه ميتونه بين انسان و جوراب باشه:
مثلا انسان جوراب رو ميپوشه؟ يا جوراب توسط انسان پوشيده ميشه؟
فكر ميكنم بحث مهمي باشه. اين طور نيست؟


خوب تا اینجا را خوب آمدی
یک کلاس داریم به نام کلاس دانشجو
یک کلاس داریم به نام درسها
در کلاس دانشجو می توانیم یک خاصیت داشته باشیم که آرایه یا کالکشنی از کلاس درسها باشد.
شما حتما احتیاج به ذخیره این اطلاعات در دیتابیس هم دارید درست هست؟

كاملا درست هست.

mohammad272005
یک شنبه 06 مرداد 1387, 22:18 عصر
حالا دانشجو ميتونه درسي رو انتخاب كنهنظر خود شما چیه؟ فکر کنم خیلی سادست:


class Student
{
...
Collection<Unit> Units = new Collection<Unit>();
...
}

حالا:

Student student = new Student();
student.Units.Add(myUnit);

beginner63
دوشنبه 07 مرداد 1387, 08:03 صبح
نظر خود شما چیه؟ فکر کنم خیلی سادست:


class Student
{
...
Collection<Unit> Units = new Collection<Unit>();
...
}
حالا:

Student student = new Student();
student.Units.Add(myUnit);

از اونجا كه من تازه كارم، منظور شما رو از اعلان collection متوجه نشدم. لطفا بيشتر توضيح بديد
شايد به همين سادگي كه شما گفتيد باشه!

linux
دوشنبه 07 مرداد 1387, 09:29 صبح
از اونجا كه من تازه كارم، منظور شما رو از اعلان collection متوجه نشدم. لطفا بيشتر توضيح بديد
شايد به همين سادگي كه شما گفتيد باشه!
شما فکر کن List<T> هست
خوب شروع کن کدهاتو نوشتن برای کلاس دانشجو و درسها تا با هم ادامه بدهیم

beginner63
دوشنبه 07 مرداد 1387, 09:49 صبح
خوب تا اینجا را خوب آمدی
یک کلاس داریم به نام کلاس دانشجو
یک کلاس داریم به نام درسها
در کلاس دانشجو می توانیم یک خاصیت داشته باشیم که آرایه یا کالکشنی از کلاس درسها باشد.
شما حتما احتیاج به ذخیره این اطلاعات در دیتابیس هم دارید درست هست؟


شما فکر کن List<T> هست
خوب شروع کن کدهاتو نوشتن برای کلاس دانشجو و درسها تا با هم ادامه بدهیم

دوست عزيز منظور من از طرح اين سوال، آناليز كلاسها و بهترين روش پياده سازي هست، نه كد نويسي
همونطور كه گفتم اين رابطه ها ميتونه بين دانشجو و كلاس و يا انسان و جوراب باشه. پس لطفا سوال رو با ديد كلي مد نظر قرار بديد. تشكر

linux
دوشنبه 07 مرداد 1387, 11:03 صبح
دوست عزيز منظور من از طرح اين سوال، آناليز كلاسها و بهترين روش پياده سازي هست، نه كد نويسي
همونطور كه گفتم اين رابطه ها ميتونه بين دانشجو و كلاس و يا انسان و جوراب باشه. پس لطفا سوال رو با ديد كلي مد نظر قرار بديد. تشكر

شما تا وقتی یک مثال را پیاده سازی نکنی و به مرحله اجرا نرسانی با مشکلات موجود آشنا نمی شوی، در پیاده سازی همین مورد با چندتا از مفاهیم اصلی شی گرایی آشنا می شوی، و مشکلات کار آشنا می شوید و مطالب را بهتر می فهمید.

beginner63
سه شنبه 08 مرداد 1387, 13:38 عصر
شما تا وقتی یک مثال را پیاده سازی نکنی و به مرحله اجرا نرسانی با مشکلات موجود آشنا نمی شوی، در پیاده سازی همین مورد با چندتا از مفاهیم اصلی شی گرایی آشنا می شوی، و مشکلات کار آشنا می شوید و مطالب را بهتر می فهمید.

پس برنامه رو ميذاريم روي همين سيستم انتخاب واحد. قصد كد نويسي ندارم، فقط ميخوام با كمك شما دوستان مفاهيم رو خوب درك كنم.


اسم برنامه MyProgram
در فضاي نام Myprogram دو كلاس تعريف ميكنيم:


class Course
{
//properties and method
}


class Student
{
//properties and method
}




صفات كه مشخص هستند، متدهاي constructor هم همينطور. ميمونه همون سوال اولم كه متد انتخاب درس رو براي student تعريف كنم، يا متد انتخاب شدن رو براي Course ؟
تشكر

اَرژنگ
سه شنبه 08 مرداد 1387, 17:57 عصر
پس برنامه رو ميذاريم روي همين سيستم انتخاب واحد. قصد كد نويسي ندارم، فقط ميخوام با كمك شما دوستان مفاهيم رو خوب درك كنم.


اسم برنامه MyProgram
در فضاي نام Myprogram دو كلاس تعريف ميكنيم:


class Course
{
//properties and method
}


class Student
{
//properties and method
}


صفات كه مشخص هستند، متدهاي constructor هم همينطور. ميمونه همون سوال اولم كه متد انتخاب درس رو براي student تعريف كنم، يا متد انتخاب شدن رو براي Course ؟
تشكر



چرا برایه هردو تعریف نمیکنید؟

اَرژنگ
سه شنبه 08 مرداد 1387, 18:27 عصر
میشه این بحث را بدانه کد جلو برد، سوالاتی که کردند در مورد طراحی است و میشه بدانه کد نویسی و استفاده از داتابیس فقط به طراحی کلاسها نگاه بندازیم،
سوالی که من پرسیدم در مورد این بود که این بحث را همینطوری بدانه کد پیش بره، آخرین کاری که یک یک برنامه نویس انجام میده کد نویسیه، اول باید طراحیش کند و بررسی و آنالیز کند آخرین چیز کد نویسی است.

beginner63
پنج شنبه 10 مرداد 1387, 12:01 عصر
میشه این بحث را بدانه کد جلو برد، سوالاتی که کردند در مورد طراحی است و میشه بدانه کد نویسی و استفاده از داتابیس فقط به طراحی کلاسها نگاه بندازیم،
سوالی که من پرسیدم در مورد این بود که این بحث را همینطوری بدانه کد پیش بره، آخرین کاری که یک یک برنامه نویس انجام میده کد نویسیه، اول باید طراحیش کند و بررسی و آنالیز کند آخرین چیز کد نویسی است.

آقا ممنون. بالاخره یکی منظور منو کامل متوجه شد. لطفا دوستان دیگه هم همکاری کنند
تشکر از همگی اساتید


چرا برایه هردو تعریف نمیکنید؟
متوجه نشدم! لطفا توضیح بیشتر

Xcalivorse
پنج شنبه 10 مرداد 1387, 12:31 عصر
دوست عزیز فکر کنم منظورت رو فهمیدم. تو می تونی کلاس دانشجو رو طوری تعریف کنی که درسهایی (یا جورابهایی) رو که انتخاب کرده رو در خود نگهداری کنه. همچنین کلاس درس (یا جوراب) رو میتونی طوری طراحی کنی که دانشجویانی که انتخابش کردند رو در خود نگه داره. اما مساله مهمی که هست اینکه کلاس باید کاربردی طراحی بشه و بسته به نیازت در برنامه باشه. اگر در برنامه ات می خواهی این قابلیت رو بذاری که بتونی به تمام درسهایی که یک دانشجو گرفته دسترسی داشته باشی و یا نمایششون بدی باید قسمت سبز رنگ رو پیاده سازی کنی.
و اگر در برنامه ات می خواهی این قابلیت رو بذاری که بتونی به تمام دانشجویان که درس مورد نظر رو گرفته اند دسترسی داشته باشی قسمت آبی رنگ رو پیاده سازی کن.
و اگر می خواهی برنامه ات دارای هر دو قابلیت باشه، هم قسمت سبز و هم قسمت آبی رو پیاده سازی کن.
بنابراین قابلیت هایی که روی کلاست تعبیه میکنی بسته به انتظاراتت از برنامه یا کلاست داره.
امیدوارم تونسته باشم کمکت کرده باشم.
دوستدارت Xcalivorse.

اَرژنگ
پنج شنبه 10 مرداد 1387, 13:45 عصر
متوجه نشدم! لطفا توضیح بیشتر

شما گفتید (با یکمقداری ویرایش که معلوم بشه):




صفات كه مشخص هستند، متدهاي constructor هم همينطور. ميمونه همون سوال اولم كه
۱.متد انتخاب درس رو براي student تعريف كنم؟،
يا
۲.متد انتخاب شدن رو براي Course ؟
تشكر



منظورم این بود که چرا باید بین ۱ و ۲ انتخواب کنید؟ چرا هر دو را پیاده نکنید؟
تقریباَْ‌ همانچیزی که Xcalivorse گفتند ، منتها تعریف Xcalivorse کاملتر است.

HamedNET
جمعه 11 مرداد 1387, 11:39 صبح
class Student
{
...
Collection<Unit> Units = new Collection<Unit>();
...
}

اَرژنگ
جمعه 11 مرداد 1387, 17:55 عصر
class Student
{
...
Collection<Unit> Units = new Collection<Unit>();
...
}
لطفا کد نفرستید، این چیزی که فرستادید ربطی به این بحث ندارد، برنامه نویسی واقعی اول طراحی است و آخرین کارش کد نویسی.

beginner63
شنبه 12 مرداد 1387, 09:48 صبح
شما گفتید (با یکمقداری ویرایش که معلوم بشه):

منظورم این بود که چرا باید بین ۱ و ۲ انتخواب کنید؟ چرا هر دو را پیاده نکنید؟
تقریباَْ‌ همانچیزی که Xcalivorse گفتند ، منتها تعریف Xcalivorse کاملتر است.

يعني هر دو متد رو پياده سازي كنم؟ اين هم روش خوبيه اما فكر نميكنم روش بهينه باشه
باز هم منتظر نظرات دوستان عزيز هستم
تشكر

linux
شنبه 12 مرداد 1387, 10:05 صبح
يعني هر دو متد رو پياده سازي كنم؟ اين هم روش خوبيه اما فكر نميكنم روش بهينه باشه
باز هم منتظر نظرات دوستان عزيز هستم
تشكر
بهترین راه این هست که در کلاس دانشجو خاصیتی داشته باشی که درس های انتخاب شده را نگه دارد
فکر کنید یک کلاس به اسم درس داری
این کلاس نام درس، کددرس و تعداد واحدها را در خود نگه می دارد.
مثلا یک متد هم دارد که پیشنیاز بودن این درس را مشخص می کند.
حالا در کلاس دانشجو شما خاصیتهای زیر را داری
نام و نام خانوادگی دانشجو، سال ورود، و یک خاصیت که آرایه ای از کلاس درسها است.
با یک متد که مثلا لیست دروس را انتخاب شده را چاپ می کند می کند.
احتیاج نیست که برای کلاس درسها دانشجوها را در نظر بگیری، چون برای گزارش گرفتن شما احتیاج داری که اول دانشجویان برای یک درس ثبت نام کرده باشند.

sinpin
یک شنبه 13 مرداد 1387, 08:11 صبح
سئوال مبهم طرح شده است. بدنبال سورس كد و نحوه پياده سازي ايده ي خود هستيد يا يك طراحي مناسب ؟
بصورت كلي "دانشجو" نميتواند بصورت مستقيم با "درس" در ارتباط باشد و نياز به چند موجوديت واسط هست.
براي مثال ERD زير را بعنوان يك حالت ساده از طراحي سيستم آموزشي يك دانشگاه ببينيد :


http://www.sqlservercentral.com/columnists/rgummadi/E-R%20Diagram.jpg

http://www.sqlservercentral.com/articles/Miscellaneous/designadatabaseusinganentityrelationshipdiagram/1159/

اَرژنگ
یک شنبه 13 مرداد 1387, 09:57 صبح
يعني هر دو متد رو پياده سازي كنم؟ اين هم روش خوبيه اما فكر نميكنم روش بهينه باشه
باز هم منتظر نظرات دوستان عزيز هستم
تشكر
خیر!!
من نگفتم هر دو را پیاده کنید، من گفتم "چرا هر دو را پیاده نمیکنید؟ "
به نظر من هم بهینه نیامد ولی دلیل اینکه چرا بهینه نیست را نتوانستم ببینم. گفتم شاید یکی دلیل اینکه یا یکی و یا دیگری باید پیاده بشد را بدانه و به ما هم بگه.
باید دلیل اینکه بهینه نبودن را هم بدانیم. یک قوانینی را رعایت نمیکنه، ولی کدام قوانین و از چه جهت درست نیست که هردو پیاده بشند؟
یک دلیل که به ذهنم رسید این بود که هر چیزی باید در برنامه در یکجا تعریف شده باشد و اینکه ۲ متد باشد این اصل را میشکند، ولی میشه متد دومی از متد اولی استفاده کند، یعنی یک آلیاس باشد برایه اونیکه متد ، به این شکل که از هر دو کلاس قابلیت پیدا کردن اینکه درس به کی ربط دارد و اینکه که کی چه درسهایی را ورداشته را هم داشته باشیم.
ولی اگر در طراحی به نظر نمیاد که کسی یک ابجکت درس را برایه اینکه به کی عاید است را تفتیش کند، در آن حالت احتیاجی نیست که کلاس درس یک متد برایه اینکه بگد به کدام دانش اموز متعلق است را برایه ابجکت درس تعریف کند.
به این شکل نگاه کنید: شما دارید یک مدل میسازید، در این مدل باید روابط بین اشیاء را باهم تعریف کنید و اینکه هر شیئ چه قابلیتها و یا خصوصیتهایی دارد را هم به شکل ابراز کنید (چونکه باید برایه هر کس دیگری این روابط‌و قابلیتها و خصوصیتها بارز باشند).
حالا اگر در این مدل احتیاج هست که یک شیئ دانشجو درسهاش را هم بداند و یا نداند و از کلاس درس درسهای که بهش تعلق دارند را پیدا کند کاملا بستگی به اینکه شما مدلتان را چطوری میخواهید استفاده کنید دارد.
فکر کنید که اگر خدا قرار بود مدل این واقعتی که ما درش هستیم را طراحی کند چه کار میکرد، شما هم یکچیزی مانند همان را انجام میدید ولی برایه یک مدل بسیار کوچکتر.
بعضی از قوانین که باید در مدل سازی رعایت بشند:
1.consistency ثبات اینکه همه چی در همه جا به یک شکل اتفاق میافتند ، تعریف شدند.اگر در دنیایه واقعی همه چی ثبات نداشت نمیشد زندگی معمولی بسیار سخت میشد. فکر کنید اگر هر بار که وارد یک اتاق میشید همه چی همانجایی است که بود، و بستگی به این ندارد که از در برید تو و یا از پنجره. حالا در مورد سوال شما، اینکه کلاس درس دانشجو را برگرداند و یا اینکه کلاس دانشجو درسها را برگرداند مهم نیست، مهم این است که جوابی که با استفاده از هرکدام بدست میارید باید با هم وفق کنند.
۲.completeness ، مدل باید کامل باشد ،تمام قابلیتها ، خصوصیات و روابط بین اشیا را باید را باید دربر بگیرد. در زندگی معمولی این همه جا واضح است. اگر دو تا ماشین با هم تصادف میکنند نتیجه هنوز در مدل این واقعیت تعریف شده. وگرنه هر بار که تصادف میشد یک out of range exception اتفاق میافتد و باید این واقیت را دوباره ریست کرد.
در مدلی که میسازید (اول طراحی میکنید ولی وقتی که پیاده شد، برنامه خود مدلی که طراحی کردید و در حال اجراست) اگر لازم است که جوراب قابلیت دانستن اینکه که کی پوشیدش را دارد را هم باید طراحی کنید. منتها به جایه جوراب خودرو بگیم و میبینیم که چقدر مهم است که وقتی پلیس وقتی که یک خودرو را پیدا میکند قابل باشد که صاحبش را هم پیدا کند. حالا خودرو و صاحاب خودرو اطلاعاتشان در یک جایه دیگر نگهداری میشه، ولی در مدل برنامه نویسی میتوانید اینکه جوراب را کی پوشیده را در خود جوراب نگه دارید. اینکه از چه روشی برایه نگه داشتن اطلاعات استفاده کنید مهم نیست، ولی اینکه روشتان با بقیه مدل جور دربیاد مهم است.

جالب اینجاست که در فیزیک کوانتم مدل معنی و ثبات ندارد (در حالت محلی) ولی به شکل آماری هم ثبات دارد و هم کامل است (وگرنه این واقعیتی که ما در مدلش هستیم فرو میریخت).

وقتی که مدل میسازید اختیارات و تمام قدرتها در دست خودتان است، اگر من به شما بگم که از قوانینی که برایه من معنی دارد استفاده کنید و قوانین من به عقلتان جور درنمیاد از روش خودتان استفاده کنید. همه اینکه نوع مدل وقعیت چی هست در ذهنشان دارند و تفاوتها از همانجاست ولی در بعضی موارد همه انتظار دارند که وقتی که در اتاق را باز میکنند همه چی را همانجایی که بود پیاد کنند. اگر مدلی که میسازید از ۱۰ نفر برایه ۷ نفر قابل قبول باشد به اندازه کافی درست طراحی شده وگرنه میدانید به کسانیکه مدل واقعیتشان فقط برایه خودشان معنی دارد چی میگن! :)

اَرژنگ
یک شنبه 13 مرداد 1387, 10:09 صبح
سئوال مبهم طرح شده است. بدنبال سورس كد و نحوه پياده سازي ايده ي خود هستيد يا يك طراحي مناسب ؟
بصورت كلي "دانشجو" نميتواند بصورت مستقيم با "درس" در ارتباط باشد و نياز به چند موجوديت واسط هست.
براي مثال ERD زير را بعنوان يك حالت ساده از طراحي سيستم آموزشي يك دانشگاه ببينيد :


http://www.sqlservercentral.com/columnists/rgummadi/E-R%20Diagram.jpg

http://www.sqlservercentral.com/articles/Miscellaneous/designadatabaseusinganentityrelationshipdiagram/1159/
دلایل موجودیتهایه واسط این است که چه قوانین دیگری هم باید رعایت بشند. ولی اگر قوانین دیگری وجود ندارند (معمولا در دانشگاه این قوانین را پیاده میکنند چونکه فکر میکنند بدانه دانستن یکی واحد کسی نباید واحد دیگری را وردارد ، ما ورداشتیم و شد:). ولی در سطح مدرسه‌ای باید یکمی ساده تر باشد (مگر اینکه که یکی که در کلاس ۳ هست نتواند از درسهایه کلاسهایه بالاتر و یا پائینتر انتخواب کند).
شاید به جایه " شکل کلی " بگیم "در شکل دقیقتر" ؟ چونکه شکل کلی کمتر از شکل دقیقتر نکات دارد. اگر میشد مدلها از هم ارث بری کنند!