برنامه نويسي شي گراء، بدون شک مهمترين تحول در دنياي نرم افزار طي ساليان گذشته بوده که بيشترين تاثير را در پيشبرد نرم افزار بدنبال داشته و ما امروز در صنعت گسترده نرم افزار از دستاوردهاي وسيع آن بهره مند هستيم . در اين مقاله قصد داريم ، به بررسي برنامه نويسي شي گراء پرداخته و از اين زاويه نگاهي به دات نت داشته باشيم .
بمنظور شناخت برنامه نويسي شي گراء ، کافي است به اطراف خود نگاهي داشته باشيم .جارو برقي ، قهوه جوش ، پنکه سقفي و مجموعه بسيار گسترده اي از ساير اشياء را پيرامون زندگي خود مشاهده مي نمائيم . اشياء ما را محاصره و يا در محاصره اشياء مي باشيم . برخي از اين اشياء نظير دوربين ، مستقل عمل نموه و برخي ديگر نظير تلفن و ماشين هاي پاسخگو با ساير اشياء ارتباط دارند . برخي از اشياء داراي داده ها ئي مي باشند که بين کاربران استفاده مي گردد(يک دفترچه تلقن) . برخي از اشياء شامل اشياء ديگري مي باشند، يک دستگاه بستني ساز درون فريزر ، نمونه اي در اين زمينه است .
بسياري از اشياء از لحاظ عملکرد با يکديگر مشابه ولي از لحاظ اهداف با يکديگر متفاوت مي باشند . مثلا" وان حمام و سينک آشبزخانه هر دو امکان استفاده از آب را فراهم مي نمايند ،ولي اين کار بندرت اتفاق خواهد افتاد که شما در سينک آشبزخانه دوش گرفته و يا ظروف آشبزخانه خود را در وان حمام بشوئيد! بهرحال وان حمام و سينک آشبزخانه موجود در منزل ، احتمالا" از يک لوله آب مشترک در ساختمان استفاده و اينترفيس آنها در موارد متعددي مشترک است ( پيچ آب گرم وسرد ، يک شير آب ، يک فاضلاب ) .
در صورت تامل در ارتباط با اشياء فوق ، با سوالات متعددي مواجه خواهيم شد . چه تفاوت هائي بين يک وان حمام و سينک آشبزحانه ، وجود دارد ؟ آيا اختلاف موجود به محل آنها ، اندازه لگن و يا گودي آنها از سطح زمين برمي گردد. شباهت موجود بين اشياء فوق چيست ؟
در برخي موارد انجام عملات يکسان در ارتباط با يک شي ، رفتارهاي متفاوتي را بدنبال خواهد داشت . يک شي قادر به انجام عمليات متفاوتي با توجه به ماهيت وضعيت بوجود آمده است . مثلا " زمانيکه دکمه 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 در دا ت نت ، قابل استفاده خواهد بود.