مقدمه ای بر برنامه نويسی شی گراء در دات نت - نسخه قابل چاپ +- Parsi Coders (http://parsicoders.com) +-- انجمن: Software Development Programming (http://parsicoders.com/forumdisplay.php?fid=37) +--- انجمن: Visual Basic Programming (http://parsicoders.com/forumdisplay.php?fid=39) +---- انجمن: Visual Basic.Net (http://parsicoders.com/forumdisplay.php?fid=43) +---- موضوع: مقدمه ای بر برنامه نويسی شی گراء در دات نت (/showthread.php?tid=70) |
مقدمه ای بر برنامه نويسی شی گراء در دات نت - Amin_Mansouri - 04-26-2011 برنامه نويسی شی گراء، بدون شک مهمترين تحول در دنيای نرم افزار طی ساليان گذشته بوده که بيشترين تاثير را در پيشبرد نرم افزار بدنبال داشته و ما امروز در صنعت گسترده نرم افزار از دستاوردهای وسيع آن بهره مند هستيم . در اين مقاله قصد داريم ، به بررسی برنامه نويسی شی گراء پرداخته و از اين زاويه نگاهی به دات نت داشته باشيم . بمنظور شناخت برنامه نويسی شی گراء ، کافی است به اطراف خود نگاهی داشته باشيم .جارو برقی ، قهوه جوش ، پنکه سقفی و مجموعه بسيار گسترده ای از ساير اشياء را پيرامون زندگی خود مشاهده می نمائيم . اشياء ما را محاصره و يا در محاصره اشياء می باشيم . برخی از اين اشياء نظير دوربين ، مستقل عمل نموه و برخی ديگر نظير تلفن و ماشين های پاسخگو با ساير اشياء ارتباط دارند . برخی از اشياء دارای داده ها ئی می باشند که بين کاربران استفاده می گردد(يک دفترچه تلقن) . برخی از اشياء شامل اشياء ديگری می باشند، يک دستگاه بستنی ساز درون فريزر ، نمونه ای در اين زمينه است . بسياری از اشياء از لحاظ عملکرد با يکديگر مشابه ولی از لحاظ اهداف با يکديگر متفاوت می باشند . مثلا" وان حمام و سينک آشبزخانه هر دو امکان استفاده از آب را فراهم می نمايند ،ولی اين کار بندرت اتفاق خواهد افتاد که شما در سينک آشبزخانه دوش گرفته و يا ظروف آشبزخانه خود را در وان حمام بشوئيد! بهرحال وان حمام و سينک آشبزخانه موجود در منزل ، احتمالا" از يک لوله آب مشترک در ساختمان استفاده و اينترفيس آنها در موارد متعددی مشترک است ( پيچ آب گرم وسرد ، يک شير آب ، يک فاضلاب ) . در صورت تامل در ارتباط با اشياء فوق ، با سوالات متعددی مواجه خواهيم شد . چه تفاوت هائی بين يک وان حمام و سينک آشبزحانه ، وجود دارد ؟ آيا اختلاف موجود به محل آنها ، اندازه لگن و يا گودی آنها از سطح زمين برمی گردد. شباهت موجود بين اشياء فوق چيست ؟ در برخی موارد انجام عملات يکسان در ارتباط با يک شی ، رفتارهای متفاوتی را بدنبال خواهد داشت . يک شی قادر به انجام عمليات متفاوتی با توجه به ماهيت وضعيت بوجود آمده است . مثلا " زمانيکه دکمه Play يک دستگاه کنترل کننده DVD و يا VCD فعال می گردد ، دستگاه قوق ، يک فيلم را پخش و ما شاهد نمايش آن بر روی صفحه تلويزيون خواهيم بود. اما اگر يک CD در دستگاه Player باشد ، همزمان با فشردن دکمه Play ، دستگاه Player باعث پخش CD صوتی شده و ما شاهد نواختن موسيقی از بلندگوهای مربوطه خواهيم بود. همانگونه که مشاهده می گردد در چنين وضعيتی ، فعال نمودن دکمه ها ی مشابه ، عمليات يکسان ولی با نتايج متفاوت را بدنبال داشته است . به بسياری از اشياء پيرامون خود، می توان بعنوان جعبه های سياه ( black box ) ، نگاه نمود.در چنين حالتی نسبت به اصول اوليه عملکرد شی مورد نظر و پردازش های اوليه آن شناخت لازم وجود خواهد داشت ولی بسياری از جزئيات عملياتی که يک شی انجام می دهد برای ما ناشناخته خواهد بود. اکثرا" در زمان استفاده از يک شی علاقه مند به رويکرد فوق می باشند ( آشنائی با پتانسيل های شی و نحوه بالفعل نمودن آنان و پرهيز از درگير شدن و آگاهی از جزئيات مربوطه ) . در چنين مواردی برای استفاده از اشياء موجود در منزل ، ضرورتی به آگاهی از مکانيزم داخلی بعنوان شرط لازم وجود نخواهد داشت و می توان بدون درگير شدن در جزئيات از شی موجود استفاده نمود. بمنظور بررسی موضوع اشاره شده ، می توانيم نگاهی به عملکرد يک لامپ 100 وات ، داشته باشيم . سيم پيچ درون لامپ چيزی بيشتر از يک مقاومت ساده نيست . زمانيکه برق فعال ( سوئيج فعال گردد) شده باشد ، حرارت سيم پيچ درون لامپ در حدود 2500 درجه سلسيوس ، خواهد بود.وضعيت فوق ، باعث تشعش گرما ئی متناسب با طول رشته سيم درون لامپ ( قطر خير ) و حدود 1750 لومن ( واحد پخش نور) می گردد .بدين ترتيب نور مرئی با طول موجی حدود 555 نانومنر را شاهد خواهيم بود. رشته موجود در لامپ از تنگستن تشکيل شده است . آيا به اين حجم ازاطلاعات بهمراه جزئيات مربوطه در زمان استفاده از لامپ ، نياز خواهيم داشت و يا صرفا" می خواهيم زمانيکه سوئيچ فعال می گردد، لامپ روشن و با ساير مسائل و نحوه انجام اين کار ، کاری نداريم ؟ در اين راستا ، استفاده کنندگان از لامپ آن را بمنزله يک جعبه سياه در نظر گرفته و صرفا" تمايل به آگاهی از نحوه استفاده از اينترفيس مربوطه برای بخدمت گرفتن پتانسيل موجود را دارند . هر شی دارای دو خصلت ذاتی است : وضعيت ( state ) و رفتار ( Behavior ) . مثلا" يک لامپ دارای اطلاعاتی نظير : روشن/خاموش بودن ، نام تجاری ، طول عمر و موارد ديگر است که جملگی وضعيت شی فوق را مشخص می نمايند. رفتار لامپ ، شامل ارائه نور و روشنائی است . يک شی مسلما" نسبت به خود ، بمنزله يک جزيره است . بسياری از اشياء بصورت دسته جمعی و با تشريک مساعی در يک سيستم قرار خواهند گرفت . مثلا" تلويزيون و بلندگوهای آن بخشی از سيستمی می باشند که موسوم به تئاتر خانوادگی است . يخچال و اجاق گاز بخشی از سيستمی با نام آشپزخانه می باشند. اين نوع سيستم ها خود متعلق به يک سيستم بزرگتر و با نام آپارتمان و يا خانه می باشند . مجموعه ای از آپارتمانها سيستم ديگری را با نام مجتمع ايجاد می نمايند. يک نرم افزار را می توان مشتمل بر مجموعه ای از اشياء در نظر گرفت که هر يک پتانسيل های لازم را ارائه و با بخدمت گرفتن آنان و بهره گيری از پتانسيل های موجود زمينه نيل به اهداف مورد نظر فراهم خواهد شد. بمنظور طراحی و پياده سازی يک برنامه شی گراء در اولين مرحله می بايست ، اقدام به طراحی و ايجاد اشياء مورد نظر با توجه به اهداف نرم افزار نمود.مرحله فوق ، اولين گام و بدون شک مهمترين مرحله در فرآيند ايجاد يک سيستم است . در مرحله دوم که ارزش آن شايد بمراتب بالاتر از مرحله قبل باشد ، می بايست نحوه ارتباط اشياء با يکديگر بدرستی مشخص گردد. در زمان ايجاد يک سيستم بزرگ که دارای پيچيدگی های خاص خود است ، می بايست نسبت به دو مرحله فوق ، شناخت لازم وجود داشته و بدون آگاهی لازم ، امکان ايچاد اينچنين سيستم های بزرگی با رويکرد شی گراء ، چالش های خاص خود را بدنبال خواهند داشت . در چنين مواردی می توان فرآيند پياده سازی يک سيستم را شامل دو مرحله مهم طراحی شی گراء و برنامه نويسی شی گراء در نظر گرفت . برنامه نويسی مبتنی بر عنصر ، پايه و اساس اين نوع سيستم ها محسوب می گردد . برنامه نويسی اشياء در نرم افزار ، نيازمند يک زبان برنامه نويسی شی گراء نمی باشد و اگر از يک زبان برنامه نويسی شی گراء استفاده می گردد ، بدين مفهوم نخواهد بود که کد نوشته شده ، شی گراء خواهد بود. زبان ها صرفا" می توانند کمکی در فرآيند فوق را ارائه و هيچگونه تضمينی در اين رابطه را ارائه نخواهند داد. با استفاده از ويژوال بيسيک ، امکان نوشتن نرم افزار شی گراء وجود خواهد داشت . البته لازم است به اين موضوع اشاره گردد که نوشتن برنامه شی گراء در ويژوال بيسيک همواره بسادگی انجام نخواهد شد ، چراکه ويژوال بيسيک همواره دارای رويکردی شی گراء نمی باشد. پياده سازی عناصر باينری با قابليت استفاده مجدد در ويژوال بيسک در حال حاضر ميسر و امکان پذيراست ولی استفاده از اينگونه عناصر بين زبان های متفاوت چالش های خود را بدنبال خواهد داشت . با عرضه دات نت که مطابق آخرين دستاوردهای علمی ايجاد شده است ، ويژوال بيسيک دات نت بعنوان يکی از زبانهای حمايت شده ، دارای امکانات قدرتمند وغنی بمنظور استفاده ازمزايای آخرين دستاوردهای پياده سازی در برنامه نويسی شی گراء است . ويژوال بيسيک دات نت و برنامه نويسی شی گراء ويژوال بيسيک دات نت يک زبان برنامه نويسی شی گراء کامل است . اين بدان معنی است که زبان فوق از چهار اصل برنامه نويسی شی گراء يعنی : انتزاع (abstraction ) ، کپسوله سازی کد و داده ( encapsulation ) ، وراثت ( inheritance) ، چند ريختی ( polymorphism ) حمايت می نمايد. در ادامه با اصول چهار گانه فوق بيشتر آشنا شده و مشاهده خواهيم کرد که هر يک از اصول فوق، چه دستاوردی را برای پياده کنندگان نرم افزار شی گراء بدنبال خواهند داشت . انتزاع ( abstraction ) راديو دارای يک تيونر ، يک آنتن ، يک پيچ صدا و يک سوئيچ روشن و خاموش است . بمنظور استفاده از راديو، ضرورتی به به آگاهی از نحوه دريافت سيگنال هائی راديوئی توسط آنتن مربوطه ، تبديل آنان به سيگنال های الکتريکی ، تقويت قدرت آنان بر اساس يک مدار تقويت کننده فرکانس بالا ، نخواهد بود. در اين راستا لازم نيست از نحوه فيلتر نمودن نتايج ، تقويت و تبديل آنان به صوت ، آگاهی داشت .ما صرفا" راديو را روشن و پس از تنظيم ايستگاه مورد علاقه خود ، از آن استفاده می نمائيم . بدين ترتيب استفاده کنندگان می توانند بدون آگاهی از جزئيات داخلی از راديو استفاده نمايند. ويژگی فوق ، بسيار مهم بوده و امکان استفاده از راديو برای هر شخص فراهم می گردد ( نه فقط افراديکه دارای اطلاعات فنی در رابطه با نحوه عملکرد آن می باشند). بنابراين می توان اين استنباط را داشت که راديو يک شی است که بگونه ای طراحی شده است که پيچيدگی ها ی مربوط نمايان نباشد ( مخفی شدن پيچيدگی ) . در نرم افزار شی گراء ، پيچيدگی با استفاده از انتراع ، مديريت می گردد . انتزاع ، فرآيندی است که بر اساس آن رفتار حياتی و مهم يک شی مشخص و جزئيات نامرتبط ، حذف می گردد. يک انتزاع خوش فکر ، عموما" ساده بوده و سمت و سوی آن نگريستن به موضوع (شی ) از ديدگاه کاربر است . فرآيند انتزاع ، نسبت به ساختار و ماهيت شی مورد نظر متفاوت بوده و لازم است برای ايجاد يک انتزاع برتر و مناسب ، موضوع بدفعات و از زوايای متفاوت مورد بررسی قرار گيرد.مثلا" در صورتيکه بخواهيم از راديو با دو هدف متفاوت : گوش دادن به موزيک و يا آمورش اصول الکترونيک ، استفاده نمائيم ، نگرش به انتزاع راديو در هر يک از موارد فوق با يکديگر متفاوت خواهد بود . انتزاع ، يک بايد غير قابل اتتخاب و جزء لاينفک يک شی است . مثلا" شی Button که در فرم های ويندوز و يا وب از آن بدفعات استفاده می گردد ، دارای متدی با نام Click است . متد فوق ، يک انتزاع است و چه بخواهيم و يا نخواهيم وجود خواهد داشت . ( تغيير شکل اوليه Button در زمانيکه بر روی آن کليک می گردد ). در اين رابطه رويداد OnClick يک انتخاب است که پياده کنندگان می توانند با توجه به سياست های موجود در نرم افزار نحوه برخورد با رويداد فوق را تبين و مشخص نمايند . کپسوله سازی کد و داده (encapsulation) زبانهای برنامه نويسی نظير C و پاسکال قادر به ايجاد ساختارهائی مشابه شی می باشند. در C ، اين ويژگی يک struct و در پاسکال از آن با نام رکورد ياد می گردد . هر دو نمونه، نوع های داده تعريف شده توسط کاربر می باشند . در هر دو زبان ، يک تابع قادر به عمل بر روی بيش از يک نوع است عکس حالت فوق نيز صادق است (بيش از يک نابع قادر به عمليات بر روی يک نوع داده است ). داده بطور کامل ارائه و آسيب پذيری خاص خود را خواهد داشت . در مقابل وضعيت فوق ، برنامه نويسی شی گراء بر اساس کپسوله سازی است . وضعيت شی و رفتار آن با يکديگر نگهداری و اصطلاحا" کپسوله می گردند. داده ئی که وضعيت يک شی را ارائه داده بهمراه متدهائی ( توابع و روتين ها ) که بر روی داده ها عملياتی را انجام خواهند داد ، با يکديگر و بعنوان يک واحد منسجم ذخيره می گردند. بعبارت ديگر ، استقرار ساختمان داده ها و کدهای مربوطه جهت پردازش داده های فوق ، بمنظور رسيدن به يک هدف مشخص در يک Box و توليد يک شی مشخص با اهداف از قبل تعريف شده ، کپسوله سازی ناميده می گردد. کپسوله سازی ، اغلب با نام مخفی سازی اطلاعات نيز ناميده می شود. اما با اينکه اين دو واژه در برخی حالات بجای يکديگر استفاده می گردند ، نمی توان آنان را مترادف هم در نظر گرفت . آنان دارای مفاهيمی مجزاء می باشند. کپسوله سازی ، پياده سازی يک شی را از رفتار آن تفکيک و بنوعی محدوديتی را بمنظور دستيابی به داده داخلی ايجاد می نمايد . محدوديت فوق ، باعث می گردد که جزئيات خاصی از رفتار يک شی مخفی گردد . بدين ترتيب ، امکان ايجاد يک جعبه سياه فراهم که وضعيت داخلی يک شی در مقابل استفاده کنندگان وو آسيب های احتمالی حفاظت خواهد شد . کپسوله سازی معمولا" با "انتزاع " نيز اشتباه گرفته می شود. با اينکه دو مفهوم فوق تا حدود زيادی با يکديگر مشابه می باشند ، ولی ايده های متفاوتی را ارائه می نمايند. انتزاع يک فرآيند بوده و شامل عمليات لازم بمنظور مشخص نمودن خصايص و رفتار يک شی برای پردازش است . کپسوله سازی ، مکانيزمی است که توسط "انتزاع " ، پياده سازی می گردد .مثلا" شی راديو ، تکنولوژی های متفاوتی را کپسوله نموده است ، تکنولوژی هائی که امکان درک مناسب آنان برای اغلب افراد امکان پذير نخواهد بود. در ويژوال بيسيک دات نت ، ساختاری که امکان تعريف يک "انتزاع " را فراهم می نمايد ، کلاس ( class ) ، ناميده می شود. واژه کلاس و شی ، اغلب بجای يکديگر استفاده می گردند ، اما شی در واقع يک نمونه از يک کلاس است . يک عنصر شامل مجموعه ای از يک و يا چندين شی نظير يک کتابخانه کلاس در يک DLL است . توارث (inheritance) توارث ، قابليت تعريف يک کلاس جديد است که رفتارهای خود ( و کد ) را ااز يک کلاس موجود ، به ارث می برد. کلاس جديد ، کلاس مشتق شده و يا کلاس فرزند ، ناميده می شود . کلاس اوليه بعنوان کلاس پايه و يا مادر ناميده می شود . توارث بمنظور ارائه ارتباطات از نوع "Is-a " و يا "kind-of" ، است. يک اتومبيل يک وسيله نقليه است . يک قايق يک وسيله نقليه است . يک زيردريائی يک وسيله نقليه است . در برنامه نويسی شی گراء ، کلاس پايه "وسيله نقليه " ، می تواند رفتارهای عمومی تمامی انواع وسائط نقليه را مشخص می نمايد. يک کلاس زيرمجموعه که از کلاس پايه مشتق می گردد می تواند بگونه ای پياده سازی گردد که نشاندهنده رفتار نوع خاصی از يک وسيله نقليه باشد .مهمترين دستاورد توارث ، قابليت توسعه و استفاده مجدد از کد است . علاوه بر امکان فوق ، يکی ديگر از دستاوردهای توارث ، قابليت ارتباط بين اشياء متفاوتی است که از يک شی واحد ، مشتق شده اند . در مقابل توارث ، نوع خاص ديگری از ازتباط و از نوع "has - a" وجود دارد . اين نوع ارتباط با استفاده از ترکيب ( Composition) که در برخی حالات از آن با نام تجمع ( aggregation ) نيز ياد می گردد، ايجاد می گردد. ارتباط فوق، نشاندهنده اين موضوع است که يک شی در مقابل توارث خصلت ها و رفتار خود از يک شی ديگر ، خود شامل شی ديگر است ( ترکيب خصلت ها و رفتار در مقابل توارث خصلت ها و رفتار ) . طبيعتا" اتومبيل دارای يک موتور است ، اما نمی توان اين ادعا را داشت که اتومبيل نوعی از يک موتور است . در ++C ، نوع خاصی از توارث و با نام توارت چندگانه ، استفاده می گردد. در سناريوی فوق ، يک کلاس از بيش از يک کلاس پايه مشتق می شود . تعداد زيادی از برنامه نويسان ++C ، استفاده از توارث چندگانه را دارای چالش های خاص خود دانسته و در موارديکه از کلاس های پايه با اسامی توابع يکسان استفاده می گردد بکارگيری صحيح آنان برای حتی برنامه نويسان با تجربه مسائل خاص خود را بدنبال خواهد د اشت .ويژوال بيسيک دات نت ، نظير جاوا صرفا" امکان توارث يگانه را حمايت می نمايد. در زمان طراحی شی گراء ، می بايست شناخت لازم و عميقی از توارث و تاثيرات آن وجود داشته باشد . ايجاد يک شی که از شی ديگر مشتق خواهد شد ، همواره عمليات آسانی نخواهد بود و با مجموعه ای از سوالات روبرو خواهيم شد . مثلا" آيا دايره نوع خاصی از بيضی است ؟ آيا مربع شکل خاصی از مستطيل است ؟ . چند ريختی ( polymorphism ) چندريختی ، تصور( برداشت ) اشکال متفاوت از يک شی ، است. در برنامه نويسی شی گراء ، اين انتظار وجود دارد که پتانسيل های زبان استفاده شده برخوردی مناسب و متفاوت با اشياء را در زمان اجراء داشته باشند. در موارديکه اشياء با يکديگر ارتباط برقرار می نمايند عملا" پيام هائی را ارسال و يا دريافت می دارند . در اين راستا ، فرستنده پيام ضرورتی به آگاهی ازاينکه چه کلاسی از دريافت کننده عضوء است ، نخواهد داشت. (می تواند هر کلاس دلخواهی باشد) . شی فرستنده صرفا"می بايست دارای دانش لازم در ارتباط با توانائی شی دريافت کننده بمنظور انجام يک رفتار خاص باشد. وضعيت فوق ، مهمترين مزيت چندريختی است . مثلا" فرض کنيد ما دارای يک مستطيل ، مربع و يک دايره باشيم . هر کلاس يک shape بوده و هر يک دارای متدی با نام Draw می باشند که مسئوليت تفسير و رسم شکل بر روی صفحه را بر عهده دارند. با استفاده از چند ريختی ، می توان متدی را ايجاد که يک شی Shape و يا آرايه ای از اشياء Shape را بعنوان پارامتر دريافت نمايد. می توان مربع ، مستيطل و دايره را به اين متدها بدون هيچگونه مسئله ای پاس دهيم . (مراجعه به يک کلاس از طريق مادر آن بطور کامل معتبر و قانونی خواهد بود ). در مثال فوق ، گيرنده صرفا" از اين موضوع که يک Shape را دريافت که دارای متدی با نام Draw است ، آگاه و اطلاعات خاصی در ارتباط با نوع خاص Shape نخواهد بود. در صورتيکه Shape ، مستطيل باشد ، در ادامه نسخه Draw مربوط به مستطيل فراخوانده خواهد شد. اگر شکل مورد نظر ، مربع باشد ، نسخه Draw مربوط به مربع ، فراخوانده می شود. مفهوم فوق را می توان از زاويه ای ديگر نيز بررسی نمود . فرض کنيد از يک نرم افزار گرافيکی کوچک بمنظور ترسيم اشکال متفاوت استفاده می گردد و بخواهيم در يک لحظه چندين شکل را بر روی صفحه رسم نمائيم . بمنظور پياده سازی قابليت فوق ، کلاسی با نام Scene ، ايجاد می گردد. کلاس فوق، دارای متدی با نام Render است که يک آرايه از اشياء Shape را بعنوان ورودی دريافت می نمايد . در چنين حالتی می توان آرايه ای از اشکال متفاوت را ايجاد و آن را برای متد Render پاس نمود . متد فوق ، قادر به تکرار بين آرايه و فراخوانی متد Draw برای رسم هر يک از عناصر آرايه است . در اين راستا و متناسب با نوع شکل ، نسخه Draw مربوط به شکل مورد نظر فراخوانده می گردد . متد Render ، دارای ايده و يا اطلاعاتی در ارتباط با نوع شکلی که در حا ل کار با آن است، نخواهد بود. مهمترين مزيت پياده سازی کلاس Scene و متد مربوطه آن يعنی Render ، جايگاه آنان در توسعه سيستم است . مثلا" در صورتيکه کلاس جديدی با نام Ellipse ، اضافه گردد ( کلاسی برای نرم افزار مربوطه ) ، ضرورتی به اعمال تغييرات در کلاس Scene وجودد نخواهد داشت . . متد Render قادر به رسم Ellipse نظير ساير اشکال خواهد بود چراکه متد فوق با اشياء مربوط يک ارتباط عمومی دارد . دراين حالت ، کلاس های Shape و Scene بدرستی با يکديگر جفت وجور شده اند. اين نوع از چند ريختی ، عام و يا parametricpolymorphism ناميده می شود. نوع ديگری از چند ريختی ، Overloading ناميده می شود. در مدل فوق ، يک شی دارای دو و يا بيش از دو رفتار است که دارای اسامی يکسان می باشند . متدها صرفا" از طريق پيامهائی که دريافت می نمايند ( توسط پارامترهای متد ) مشخص خواهند شد . ايجاد يک متد مشترک با نام power بمنظور محاسبه توان اعداد صحيح و اعشاری ، نمونه ای مناسب در اين زمينه است . با اينکه می دانيم برای محاسبه توان اعداد صحيح و اعشاری از الگوريتم ها ی متفاوتی استفاده می گردد ، می خواهيم با داشتن يک متد از قابليت های آن بمنظور محاسبه توان اعداد صحيح و يا اعشاری استفاده نمائيم . استفاده کننده از متد Power ، با سناريوی طراحی شده درون متد کاری نداشته و صرفا" پارامتر خود را در اختيار متد قرار خواهد داد . با تمهيداتی که درون متد پيش بينی شده است ، تصميم لازم در خصوص استفاده از روتين های جانبی ( متدهای جانبی ) بمنظور محاسبه توان اعداد صحيح و يا اعشاری يک عدد ، اتخاذ خواهد شد . چند ريختی ، يکی از مفاهيم و ويژگی های مهم برنامه نويسی شی گراء بوده که انعطاف شگفت انگيزی را در ارتباط با طراحی برنامه ها بدنبال خواهد داشت . فريمورک دات نت اشيائی که با استفاده از ويژوال بيسيک دات نت ايجاد می گردند، تداوم و ادامه حيات خود را مديون فريمورک دات نت می دانند. پلات فرم فوق، با استفاده از استانداردهای های باز و پروتکل هائی نظير XML ، HTTP و SOAP ايجاد شده است . فريمورک دات نت ، شامل يک کتابخانه استاندارد غنی است که سرويس های اساسی را در اختيار تمامی زبانهای سازگار با دات نت ، قرار می دهند.هدف از معماری فوق ، ارائه امکانات و تسهيلات لازم برای برای ايجاد ، بکارگيری و اجراء سرويس های مبتنی بر وب است . عليرغم هدف فوق ، فريمورک دات نت ، محلی ايده آل برای پياده سازی تمامی انواع برنامه ها صرفنظر از طراحی است . برخی از مزايای معماری فوق بشرح زير می باشد : عمليات توزيع شده بر اساس استانداردهای اينترنت و پروتکل هائی نظير HTTP,XML و SOAP ارائه سرويس های جهانی و بزرگ نظير Object pooling, پيام ، امنيت و تراکنش زيرساخت مناسب بمنظور تسهيل در پياده سازی کدها و عناصر با قابليت استفاده مجدد تسهيل در پياده سازی تحت وب با استفاده از استانداردهای باز . ارتباط کامل بين زبانها که دستاوردهائی نظير : توارث کلاس ها ، Catch exceptions و اشکال زدائی بين زبان های متفاوت را بدنبال خواهد داشت . بکارگيری نرم افزار در دات نت بمراتب ساده ترنسبت به گذشته خواهد بود ، چراکه تنظيمات در فايل های پيکربندی از نوع XML ذخيره و در دايرکتوری مربوط به نرم افزار ذخيره خواهند شد. در اين راستا ضرورتی به استفاده از ريجستری نخواهد بود دو بخش بسيار مهم دات نت که توجه طراحان و پياده کنندگان نرم افزار را بسرعت بسوی خود جلب می نمايد : CLR)Common Language Runtime) و کتابخانه کلاس دات نت است . CLR ، سرويس های لازم برای عناصری را که تحت دات نت اجراء می گردند ، ارائه می نمايد .کتابخانه کلاس دات نت ، مجموعه ای گسترده از کلاس ها را برای هر چيزی از دستيابی به داده گرفته تا طراحی رابط کاربر، امنيت ، شبکه و ... ارائه می نمايد. کتابخانه همچنين شامل تعاريف مورد نياز برای تمامی نوع های داده اوليه نظير : bytes,integers و string است . تمامی اين نوع ها ، از يک کلاس پايه با نام System.object مشتق می گردند. محدوديتی بين نوع هائی که توسط سيستم تعريف شده اند با نوع هائی که شما ايجاد می نمائيد ،وجود نخواهد داشت . هر چيزبمنزله يک شی خواهد بود. در گذشته ، پاس دادن يک string از يک عنصر نوشته شده به زبان ويژوال بيسيک به عنصر ديگری که با ++C نوشته شده بود ، ( و يا برعکس ) مسائل و مشکلات خاص خود را بدنبال داشت . رشته ها در ويژوال بيسيک ، مشابه رشته ها در ++C نبودند . در حقيقت،در برخی موارد خاص ، استفاده از يک عنصر نوشته شده با ++C از طريق ويژوال بيسيک ، بدليل تفاوت در نوع داده آنان ، غير ممکن بود. هر زبان سازگار با دات نت ، از نوع های يکسان تعريف شده و موجود در کتابخانه کلاس پايه استفاده می نمايد. بدين ترتيب ، با مسائل مربوط به ارتباط عملياتی بين زبانها که در گذشته شاهد آنان بوديم ، برخورد نخواهيم کرد. CLR و قابليت های آن CLR ، موتور اجرائی فريمورک دات نت است . سيستم فوق ، مديريت تمامی کدهای ترجمه شده را بر عهده خواهد داشت .کد ترجمه شده که در دات نت اجراء می گردد را کد مديريت يافته (اداره شده) می گويند. علاوه بر مسئوليت لود و اجراء يک برنامه ، CLR سرويس هائی را ارائه که تمامی پياده کنندگان عناصر می توانند از مزايای آن بهره مند گردند: فراخوانی و توقف threads و پردازه ها چرخه حيات شی و مديريت حافظه ارتباط و همبستگی بين زبان ها کد قابل استفاده در محيط های متفاوت ( Cross-code ) و عمليات مبتنی بر امنيت Exception handling ( حتی بين زبانها ) بکارگيری و مسئله ورژن سازی ارتباط بين کد اداره شده ( مديريت يافته ) و کد غير اداره شده (غيرمديريت يافته ) اشکال زدائی بين تمامی زبانها Runtime ها چيزی جديدی نمی باشند . ويژوال بيسيک همواره دارای نوع خاصی از يک runtime بوده است . ويژوال ++C ، دارای يک runtime با نام MSVCRT.DLL است . perl ، Python و SmallTalk نيز از runtime استفاده می نمايند. تفاوت بين اين نوع از Runtime ها و CLR در اين است که CLR بمنظور کار با چندين زبان برنامه نويسی طراحی شده است .هر برنامه ای که مقصد کمپايلر آن فريمورک دات نت باشد ، قادر به استفاده از تمامی مزايای CLR است . دات نت در اين رابطه قابل مقايسه با جاوا نيز می باشد . جاوا از يک Runtime با نام JVM)Java Virtual Machine) استفاده و صرفا" قادر به اجراء کد نوشته شده توسط جاوا می باشد . لازم است به اين نکته مهم نيز اشاره گردد که JVM يک مفسر است . در دات نت ، تمامی برنامه های نوشته شده با هر يک از زبان های سازگار با دانت نت ،در ايتدا به يک زبان مستقل از پردازنده ترجمه می گردند که IL)Intermediate Language) ناميده می شود( قابل مقايسه با بايت کدهای جاوا ) . IL ، نظير جاوا در زمان اجراء تفسير نمی گردد و زمانيکه کد در اولين مرتبه اجراء می گردد ، يک و يا چندين کمپايلر JIT)Just-in-time) مسئوليت ترجمه کدهای IL به کد مختص يک ماشين را برعهده می گيرند. ارتباط و همبستگی بين زبانها يک از مهمترين مزايای ارائه شده توسط CLR است . اگر برنامه نويسی ، کلاسی را با استفاده از ++C نوشته باشد ، می توان کلاسی در VB.NET را با استفاده از آن ايجاد نمود( توارث بين زبانها ). ويژگی فوق ، توارث بين زبان ها ناميده می گردد. اشياء نوشته شده با زبان متفاوت ديگر قادر به ارتباط عملياتی با يکديگر می باشند . دو بخش مهم CLR که امکان فوق را فراهم می نمايند CTS)Common Type System) و CLS) Common Language Specification)، می باشند . سيستم CTS سيستم CTS ، قوانين لازم بمنظورتبعيت يک زبان در جهت بهره گيری از مزايای فريمورک دات نت را تعريف می نمايد. سيستم فوق، همچنين مجموعه ای از نوع های متداول و عملياتی که در بين زبان های برنامه نويسی متفاوت موجود است را تعريف و مشخص می نمايد که چگونه اين نوع ها استفاده و توسط CLR مديريت گردند ، چگونه اشياء قابليت های خود را عرضه و چگونه با يکديگر ارتباط برقرار نمايند . CTS ، فونداسيون لازم بمنظور ارتباط متقابل بين زبانها در دات نت را ايجاد می نمايد. سيستم CLS)Common Language Specification) CLS ، زير مجموعه ای از CTS بوده که مسئول تشريح پارامترهای پايه و مهم استفاده شده توسط مجموعه ای گسترده از زبان های برنامه نويسی است . عناصری که از ويژگی های CLS ، استفاده می نمايند ، سازگار با CLS بوده و امکان استفاده و دستيابی به عناصر فوق ، از طريق ساير زبانهای برنامه نويسی سازگار با دات نت ، وجود خواهد داشت . VB.NET يک زبان سازگار با CLS است . بنابراين ، هر کلاس ، شی و يا عنصری که ايجاد می گردد ، توسط ساير زبا ن های سازگار با CLS در دا ت نت ، قابل استفاده خواهد بود. |