PDA

View Full Version : شی گرایی در VB.NET



Boo Ali
چهارشنبه 14 اردیبهشت 1384, 16:46 عصر
اگر کسی در مورد شی گرایی اطلاعاتی دارد به این سوال پاسخ دهد :

من یک کلاس با نام Book ایجاد کرده ام که در آن 4 متد برای درج ، حذف ، تغییر و

انتخاب نوشته ام و Member هایی از قبیل نام Book ، ، سال و ... در نظر گرفته ام و

همینطور کلاس دیگری با عنوان Index دارم که هم دارای 4 متد فوق است و برای کار با

جدول Index تدارک دیده شده است. حال می خواهم یک کتاب را که دارای تعداد

نامعلومی Index نیز می باشد را درج نمایم ، می دانم که باید با متدهای Add ار

کلاسهای book و Index کار نمایم و نیز میدانم که باید مشخصات کتاب را با متد درج

به آن کلاس ارسال نمایم ، اما نمیدانم چگونه داده های کلاس Index که عنوان آنها

می باشد را به کلاس Index ارسال نمایم. یعنی چگونه دو کلاس را و از چه طریقی

بهم متصل نمایم.

یاشار
پنج شنبه 15 اردیبهشت 1384, 03:38 صبح
چیزی که من از سوال شما برداشت کردم:

یک کلاس Book داریم که داری خواص و متدهای خودشه. متدهای اضافه‌ و حذف و تغییر در این کلاس تعریف شده‌اند و از اون به عنوان Base Class برای کلاس IndexedBooks استفاده می‌کنیم. کلاس IndexedBooks، نوع خاصی از Book هست که علاوه بر فیلدهای Book یک خاصیت اضافی به اسم Index دارد.

اگر منظورتون همین بوده باشه، بدون اینکه لازم باشه خواص Book رو برای IndexedBook دوباره تعریف کنیم، موقع تعریف کلاس دومی، از کلاس اول ارث‌ می‌بریم و خاصیت Index رو بهش اضافه می‌کنیم و احتمالا لازم خواهد شد که که بعضی از متدهای Book رو override کنیم.






Public Class IndexedBooks
Inherits Books

Private _index As Int32
Public Property Index() As Int32
Get
Return _index
End Get
Set(ByVal Value As Int32)
_index = Value
End Set
End Property

Public Overrides Sub Add(ByVal newbook as ...)
dim NBook as ...
NBook = newbook
NBook.Index = _index

MyBase.Add(NBook)
End Sub


End Class


اگر منظورتون رو اشتباه فهمیدم راهنمایی کنید.

Boo Ali
شنبه 17 اردیبهشت 1384, 15:42 عصر
از اینکه سوالم را مبهم بیان کردم ، معذرت می خواهم. حال سعی می کنم آن را کامل

کنم:

یک کلاس Book داریم با اعضایی مانند نام کتاب ، سال انتشار و ... که در هر کتاب یک

دانه از آنها است . اما برای مشخصات بیش از یکی مانند Index های موجود در کتاب از

کلاس دیگری بنام Index استفاده می گردد که دارای تنها عضو : عنوان Index است و

از آن برای نگهداشتن حداقل یک Index استفاده می گردد.


هر کدام از این دو کلاس دارای متدهای درج ، حذف ، تغییر و جستجو است . البته در

داخل DataBase جدول واسطی بنام DetailIndex جهت برقراری ارتباط یک به چند بین

جدول Book و جدول Index وجود دارد.

حال می خواهیم فقط بخش برنامه نویسی شی گرایی آن در VB.Net را بررسی نماییم

، یعنی وقتی می خواهیم یک کتاب را درج نماییم باید از متد درج کلاس Book استفاده

نماییم ، اما چون اعضا کلاس Book فقط شامل مشخصات یکدانه ای است و جایی

برای اطلاعات Index که می تواند بیش از یکی باشد وجود ندارد ، بعبارت ارتباط این دو

کلاس باید از چه طریق برقرار شود؟

یاشار
شنبه 17 اردیبهشت 1384, 16:50 عصر
می‌شه یک event برای کلاس book تعریف کرد ( مثلا BookAdded ) که به محض اینکه کتابی اضافه شد، شلیک ( fire ) بشه و کلاس Index یک eventhandler داشته باشه که حواسش به این event باشه.

ولی باز مفهوم رابطه منطقی کلاس‌های شما رو متوجه نمی‌شم. اگر کلاس Index، مثل ایندکس آخر کتاب می‌مونه، پس هر کتاب باید یک ایندکس داشته باشه که ربطی به کتابهای دیگه نداره که البته این هم به نوع ایندکس بستگی داره. اگر script ایجاد جدول‌هاتون ( یا خلاصه‌اش ) رو در DB پست کنید شاید مسئله برای من روشن‌تر بشه.

Boo Ali
یک شنبه 18 اردیبهشت 1384, 11:38 صبح
ساختار بانک اطلاعاتی را جهت تشریح بیشتر موضوع خدمتتان ارایه می نمایم ،

پیشاپیش از کمکتان متشکرم :

یاشار
یک شنبه 18 اردیبهشت 1384, 12:55 عصر
دلیل خاصی وجود داره که از Typed DataSet استفاده نمی‌کنید ؟ به راحتی می‌تونید همین ساختار رو روی چند تا DataTable داخل DataSet تون پیاده کنید.

جدول Book و Idexes به طریق many to many با هم در ارتباط هستند. یعنی هر کتاب می‌تونه چند indexTitle داشته باشه و در عین حال هر indexTitle می‌تونه به چند کتاب اشاره داشته باشه.

بهتره cascade delete رو در دیتابیس‌تون فعال کنید که به محض اینکه یک کتاب در جدول Book حذف بشه، تمام ردیف‌های جدول میانجی ( DETAILINDEX ) که به اون کتاب اشاره دارند حذف بشن. ولی خود INDEXTITLE ها پاک نمی‌شن، چون ممکنه به کتاب‌های دیگه‌ای که پاک نشده‌اند اشاره داشته باشند و انسجام اطلاعات از بین بره. همینطور در مورد INDEXES

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

اگر منظورتون رو درست فهمیده باشم، احتیاجی به تعریف کلاس جداگانه برای Book و Index نیست و می‌تونید بوسیله DataSet، که یک کپی از دیتابیس در حافظه محسوب میشه، همه متد‌های اضافه و حذف و ... رو پیاده کنید.

حالا که قضیه یه کم روشن‌تر شد، می‌تونیم راحت‌تر دنبال کار رو بگیریم.

آیا هنوز لازمه از کلاسی غیر از DataSet استفاده کنید ؟ اگر لازم نیست می‌خواهید رابطه‌ جدول‌ها رو کجا برقرار کنید، داخل DB یا برنامه‌تون ؟ قبلا با DataSet ی که بیشتر از یک جدول داشته باشه کار کردین ؟ حدودا چند کاربر به طور همزمان به اطلاعات دسترسی خواهند داشت ؟

Boo Ali
سه شنبه 20 اردیبهشت 1384, 08:41 صبح
با تشکر از شما ، باید بگویم در پیاده شازی معمولی و متداول هیچ مشکلی ندارم و

براحتی می توانم آن را پیاده سازی نمایم اما من تمایل دارم برای تقویت دید شی

گرایی خود این سیستم و روابط بین آن را فقط در Programming با استفاده از برنامه

نویسی شی گرا انجام دهم ، یعنی بجای برنامه نویسی تجاری و ویژوالی از امکانات

شی گرایی و اشیا بصورت RunTime استفاده نمایم .

لطفا در مورد پیاده سازی شی گرا این سیستم من را راهنمایی نمایید.

یاشار
سه شنبه 20 اردیبهشت 1384, 17:20 عصر
عرضم به حضورتون که در Net. شما اصلا نمی‌توانید برنامه غیر شیی‌گرا بنویسید. چه در برنامه ویژوال چه غیر ویژوال همه اشیا به صورت کلاس بیان شده‌اند. کل برنامه شما هم به صورت یک یا چند کلاس تعریف می‌شود. ولی شیی‌گرایی به این معنا نیست که همه چیز لزوما با بقیه کلاسها رابطه مستقیم دارند. البته همه اشیا از شیی object نشات می‌گیرند ولی شیی گرایی وقتی به کمکمون میاد که می‌خواهیم چند شیی که خاصیت مشترک دارند رو تعریف کنیم و در این حین خیلی از کارها رو باید تکرار کنیم. به جای تکرار متدها و خواص تکراری، از اونها یک BaseClass درست می‌کنیم، و هر کدام از اشیا که در این متدها با هم مشترکند، از BaseClass ارث می‌گیرند. اگر رابطه‌ای وجود داشته باشه، باید در BaseClass که نقطه مشترک این اشیا هست، تعریف شده باشه.

به عنوان یک مثال ملموس، کلاس Control رو در نظر بگیرید. تمام کلاسهای Button، CheckBox، Treeview و ... از این کلاس به ارث گرفته شده‌اند. برای همین همه کنترلها، متدها و خواصی که در کلاس Control تعریف شده رو دارند و دلیلش هم اینه که این کلاسها از نظر مفهومی با هم یک چیز مشترک دارند. مثلا متد Hide یا Focus یا Refresh، یک بار در کلاس Control تعریف شده‌اند و دیگر لازم نیست که برای همه کنترل‌ها، همه این متدها رو از نو تعریف کنیم.

ولی در مورد مثال شما اینطور نیست. یعنی کتاب از جنس ایندکس نیست. شاید هم قدرت تصور من اجازه نمیده رابطه‌ای بین اینها برقرار کنم. تنها کاری که شما میتونید بکنید، اینه که هر دوی این کلاس‌ها رو از یک کلاس کلی‌تر به ارث ببرید، که اون BaseClass باید شامل نقاط اشتراک این دو کلاس باشه. در این مورد فکر نمی‌کنم انتخاب خوبی باشه.

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

حتی اگر بخواهید طراحی دیتابیس رو هم به روش شی‌گرا انجام بدید، همین منطق رو باید دنبال کنید. در مورد مثال شما، از نظر من باید دو کلاس مجزا تعریف کنیم که با هم هیچ رابطه خاصی هم ندارند. مفهوم کلی‌تری که هم کتاب و هم Index رو در بر بگیره، اگر هم قابل تعریف باشه بیفایده خواهد بود. چون نقطه مشترکی نداریم.




بجای برنامه نویسی تجاری و ویژوالی از امکانات شی گرایی و اشیا بصورت RunTime استفاده نمایم

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