برنامه نويسی شی گراء، بدون شک مهمترين تحول در دنيای نرم افزار طی ساليان گذشته بوده که بيشترين تاثير را در پيشبرد نرم افزار بدنبال داشته و ما امروز در صنعت گسترده نرم افزار از دستاوردهای وسيع آن بهره مند هستيم
منظور شناخت برنامه نويسی شی گراء ، کافی است به اطراف خود نگاهی داشته باشيم .جارو برقی ، قهوه جوش ، پنکه سقفی و مجموعه بسيار گسترده ای از ساير اشياء را پيرامون زندگی خود مشاهده می نمائيم . اشياء ما را محاصره و يا در محاصره اشياء می باشيم . برخی از اين اشياء نظير دوربين ، مستقل عمل نموه و برخی ديگر نظير تلفن و ماشين های پاسخگو با ساير اشياء ارتباط دارند . برخی از اشياء دارای داده ها ئی می باشند که بين کاربران استفاده می گردد(يک دفترچه تلقن) . برخی از اشياء شامل اشياء ديگری می باشند، يک دستگاه بستنی ساز درون فريزر ، نمونه ای در اين زمينه است .
بسياری از اشياء از لحاظ عملکرد با يکديگر مشابه ولی از لحاظ اهداف با يکديگر متفاوت می باشند . مثلا" وان حمام و سينک آشبزخانه هر دو امکان استفاده از آب را فراهم می نمايند ،ولی اين کار بندرت اتفاق خواهد افتاد که شما در سينک آشبزخانه دوش گرفته و يا ظروف آشبزخانه خود را در وان حمام بشوئيد! بهرحال وان حمام و سينک آشبزخانه موجود در منزل ، احتمالا" از يک لوله آب مشترک در ساختمان استفاده و اينترفيس آنها در موارد متعددی مشترک است ( پيچ آب گرم وسرد ، يک شير آب ، يک فاضلاب ) .
در صورت تامل در ارتباط با اشياء فوق ، با سوالات متعددی مواجه خواهيم شد . چه تفاوت هائی بين يک وان حمام و سينک آشبزحانه ، وجود دارد ؟ آيا اختلاف موجود به محل آنها ، اندازه لگن و يا گودی آنها از سطح زمين برمی گردد. شباهت موجود بين اشياء فوق چيست ؟
در برخی موارد انجام عملات يکسان در ارتباط با يک شی ، رفتارهای متفاوتی را بدنبال خواهد داشت . يک شی قادر به انجام عمليات متفاوتی با توجه به ماهيت وضعيت بوجود آمده است . مثلا " زمانيکه دکمه Play يک دستگاه کنترل کننده DVD و يا VCD فعال می گردد ، دستگاه فوق ، يک فيلم را پخش و ما شاهد نمايش آن بر روی صفحه تلويزيون خواهيم بود. اما اگر يک CD در دستگاه Player باشد ، همزمان با فشردن دکمه Play ، دستگاه Player باعث پخش CD صوتی شده و ما شاهد نواختن موسيقی از بلندگوهای مربوطه خواهيم بود. همانگونه که مشاهده می گردد در چنين وضعيتی ، فعال نمودن دکمه ها ی مشابه ، عمليات يکسان ولی با نتايج متفاوت را بدنبال داشته است .
به بسياری از اشياء پيرامون خود، می توان بعنوان جعبه های سياه ( black box ) ، نگاه نمود.در چنين حالتی نسبت به اصول اوليه عملکرد شی مورد نظر و پردازش های اوليه آن شناخت لازم وجود خواهد داشت ولی بسياری از جزئيات عملياتی که يک شی انجام می دهد برای ما ناشناخته خواهد بود. اکثرا" در زمان استفاده از يک شی علاقه مند به رويکرد فوق می باشند ( آشنائی با پتانسيل های شی و نحوه بالفعل نمودن آنان و پرهيز از درگير شدن و آگاهی از جزئيات مربوطه ) . در چنين مواردی برای استفاده از اشياء موجود در منزل ، ضرورتی به آگاهی از مکانيزم داخلی بعنوان شرط لازم وجود نخواهد داشت و می توان بدون درگير شدن در جزئيات از شی موجود استفاده نمود.
بمنظور بررسی موضوع اشاره شده ، می توانيم نگاهی به عملکرد يک لامپ 100 وات ، داشته باشيم . سيم پيچ درون لامپ چيزی بيشتر از يک مقاومت ساده نيست . زمانيکه برق فعال ( سوئيج فعال گردد) شده باشد ، حرارت سيم پيچ درون لامپ در حدود 2500 درجه سلسيوس ، خواهد بود.وضعيت فوق ، باعث تشعش گرما ئی متناسب با طول رشته سيم درون لامپ ( قطر خير ) و حدود 1750 لومن ( واحد پخش نور) می گردد .بدين ترتيب نور مرئی با طول موجی حدود 555 نانومنر را شاهد خواهيم بود. رشته موجود در لامپ از تنگستن تشکيل شده است . آيا به اين حجم ازاطلاعات بهمراه جزئيات مربوطه در زمان استفاده از لامپ ، نياز خواهيم داشت و يا صرفا" می خواهيم زمانيکه سوئيچ فعال می گردد، لامپ روشن و با ساير مسائل و نحوه انجام اين کار ، کاری نداريم ؟ در اين راستا ، استفاده کنندگان از لامپ آن را بمنزله يک جعبه سياه در نظر گرفته و صرفا" تمايل به آگاهی از نحوه استفاده از اينترفيس مربوطه برای بخدمت گرفتن پتانسيل موجود را دارند .
هر شی دارای دو خصلت ذاتی است : وضعيت ( state ) و رفتار ( Behavior ) .
مثلا" يک لامپ دارای اطلاعاتی نظير : روشن/خاموش بودن ، نام تجاری ، طول عمر و موارد ديگر است که جملگی وضعيت شی فوق را مشخص می نمايند. رفتار لامپ ، شامل ارائه نور و روشنائی است . يک شی مسلما" نسبت به خود ، به منزله يک جزیره است . بسیاری از اشياء به صورت دسته جمعی و با تشريک مساعی در يک سيستم قرار خواهند گرفت . مثلا" تلويزيون و بلندگوهای آن بخشی از سيستمی می باشند که موسوم به تئاتر خانوادگی است . يخچال و اجاق گاز بخشی از سيستمی با نام آشپزخانه می باشند. اين نوع سيستم ها خود متعلق به يک سيستم بزرگتر و با نام آپارتمان و يا خانه می باشند . مجموعه ای از آپارتمانها سيستم ديگری را با نام مجتمع ايجاد می نمايند.
يک نرم افزار را می توان مشتمل بر مجموعه ای از اشياء در نظر گرفت که هر يک پتانسيل های لازم را ارائه و با بخدمت گرفتن آنان و بهره گيری از پتانسيل های موجود زمينه نيل به اهداف مورد نظر فراهم خواهد شد. بمنظور طراحی و پياده سازی يک برنامه شی گراء در اولين مرحله می بايست ، اقدام به طراحی و ايجاد اشياء مورد نظر با توجه به اهداف نرم افزار نمود.مرحله فوق ، اولين گام و بدون شک مهمترين مرحله در فرآيند ايجاد يک سيستم است . در مرحله دوم که ارزش آن شايد بمراتب بالاتر از مرحله قبل باشد ، می بايست نحوه ارتباط اشياء با يکديگر بدرستی مشخص گردد. در زمان ايجاد يک سيستم بزرگ که دارای پيچيدگی های خاص خود است ، می بايست نسبت به دو مرحله فوق ، شناخت لازم وجود داشته و بدون آگاهی لازم ، امکان ايچاد اينچنين سيستم های بزرگی با رويکرد شی گراء ، چالش های خاص خود را بدنبال خواهند داشت . در چنين مواردی می توان فرآيند پياده سازی يک سيستم را شامل دو مرحله مهم طراحی شی گراء و برنامه نويسی شی گراء در نظر گرفت . برنامه نويسی مبتنی بر عنصر ، پايه و اساس اين نوع سيستم ها محسوب می گردد . برنامه نويسی اشياء در نرم افزار ، نيازمند يک زبان برنامه نويسی شی گراء نمی باشد و اگر از يک زبان برنامه نويسی شی گراء استفاده می گردد ، بدين مفهوم نخواهد بود که کد نوشته شده ، شی گراء خواهد بود. زبان ها صرفاً می توانند کمکی در فرآیند فوق را ارائه و هیچگونه تضمینی در این رابطه را ارائه نخواهند داد
شی گرایی در سی شارپ
C#.Net يک زبان برنامه نويسی شی گرا کامل است . این بدان معنی است که زبان فوق از چهار اصل برنامه نويسی شی گراء که به شرح زیر می باشند حمایت میکند :
• انتزاع (abstraction )
• کپسوله سازی کد و داده ( encapsulation )
• وراثت ( inheritance)
• چند ریختی ( polymorphism )
در ادامه با اصول چهار گانه فوق بيشتر آشنا شده و مشاهده خواهيم کرد که هر يک از اصول فوق، چه دستاوردی را برای پياده کنندگان نرم افزار شی گراء بدنبال خواهند داشت .
1-1-2 انتزاع ( abstraction )
راديو دارای يک تيونر ، يک آنتن ، يک پيچ صدا و يک سوئيچ روشن و خاموش است . بمنظور استفاده از راديو، ضرورتی به به آگاهی از نحوه دريافت سيگنال هائی راديوئی توسط آنتن مربوطه ، تبديل آنان به سيگنال های الکتريکی ، تقويت قدرت آنان بر اساس يک مدار تقويت کننده فرکانس بالا ، نخواهد بود. در اين راستا لازم نيست از نحوه فيلتر نمودن نتايج ، تقويت و تبديل آنان به صوت ، آگاهی داشت .ما صرفا" راديو را روشن و پس از تنظيم ايستگاه مورد علاقه خود ، از آن استفاده می نمائيم . بدين ترتيب استفاده کنندگان می توانند بدون آگاهی از جزئيات داخلی از راديو استفاده نمايند. ويژگی فوق ، بسيار مهم بوده و امکان استفاده از راديو برای هر شخص فراهم می گردد ( نه فقط افراديکه دارای اطلاعات فنی در رابطه با نحوه عملکرد آن می باشند). بنابراين می توان اين استنباط را داشت که رادیو يک شی است که بگونه ای طراحی شده است که پيچيدگی ها ی مربوط نمايان نباشد ( مخفی شدن پيچيدگی ) .
در نرم افزار شی گراء ، پيچيدگی با استفاده از انتراع ، مديريت می گردد . انتزاع ، فرآيندی است که بر اساس آن رفتار حياتی و مهم يک شی مشخص و جزئيات نامرتبط ، حذف می گردد. يک انتزاع خوش فکر ، عموما" ساده بوده و سمت و سوی آن نگريستن به موضوع (شی ) از ديدگاه کاربر است . فرآيند انتزاع ، نسبت به ساختار و ماهيت شی مورد نظر متفاوت بوده و لازم است برای ايجاد يک انتزاع برتر و مناسب ، موضوع بدفعات و از زوايای متفاوت مورد بررسی قرار گيرد.مثلا" در صورتيکه بخواهيم از راديو با دو هدف متفاوت : گوش دادن به موزيک و يا آمورش اصول الکترونيک ، استفاده نمائيم ، نگرش به انتزاع راديو در هر يک از موارد فوق با يکديگر متفاوت خواهد بود . انتزاع ، يک بايد غير قابل اتتخاب و جزء لاينفک يک شی است . مثلا" شی Button که در فرم های ويندوز و يا وب از آن بدفعات استفاده می گردد ، دارای متدی با نام Click است . متد فوق ، يک انتزاع است و چه بخواهيم و يا نخواهيم وجود خواهد داشت . ( تغيير شکل اوليه Button در زمانيکه بر روی آن کليک می گردد ). در اين رابطه رويداد OnClick يک انتخاب است که پياده کنندگان می توانند با توجه به سیاست های موجود در نرم افزار نحوه برخورد با رويداد فوق را تبين و مشخص نمايند .
2-1-2 کپسوله سازی کد و داده (encapsulation)
زبانهای برنامه نويسی نظير C و پاسکال قادر به ايجاد ساختارهائی مشابه شی می باشند. در C ، اين ويژگی يک struct و در پاسکال از آن با نام رکورد ياد می گردد . هر دو نمونه، نوع های داده تعريف شده توسط کاربر می باشند . در هر دو زبان ، يک تابع قادر به عمل بر روی بيش از يک نوع است عکس حالت فوق نيز صادق است (بیش از يک تابع قادر به عملیات بر روی يک نوع داده است). داده بطور کامل ارائه و آسيب پذيری خاص خود را خواهد داشت .
در مقابل وضعيت فوق ، برنامه نويسی شی گراء بر اساس کپسوله سازی است . وضعيت شی و رفتار آن با يکديگر نگهداری و اصطلاحا" کپسوله می گردند. داده ئی که وضعيت يک شی را ارائه داده بهمراه متدهائی ( توابع و روتين ها ) که بر روی داده ها عملياتی را انجام خواهند داد ، با يکديگر و بعنوان يک واحد منسجم ذخيره می گردند. به عبارت ديگر ، استقرار ساختمان داده ها و کدهای مربوطه جهت پردازش داده های فوق ، بمنظور رسيدن به يک هدف مشخص در يک Box و توليد يک شی مشخص با اهداف از قبل تعريف شده ، کپسوله سازی ناميده می گردد.
کپسوله سازی ، اغلب با نام مخفی سازی اطلاعات نيز ناميده می شود. اما با اينکه اين دو واژه در برخی حالات بجای يکديگر استفاده می گردند ، نمی توان آنان را مترادف هم در نظر گرفت . آنان دارای مفاهيمی مجزاء می باشند. کپسوله سازی ، پياده سازی يک شی را از رفتار آن تفکيک و بنوعی محدوديتی را بمنظور دستيابی به داده داخلی ايجاد می نمايد . محدوديت فوق ، باعث می گردد که جزئيات خاصی از رفتار يک شی مخفی گردد . بدين ترتيب ، امکان ايجاد يک جعبه سياه فراهم که وضعيت داخلی يک شی در مقابل استفاده کنندگان و آسيب های احتمالی حفاظت خواهد شد .
کپسوله سازی معمولا" با "انتزاع " نيز اشتباه گرفته می شود. با اينکه دو مفهوم فوق تا حدود زيادی با يکديگر مشابه می باشند ، ولی ايده های متفاوتی را ارائه می نمايند. انتزاع يک فرآيند بوده و شامل عمليات لازم بمنظور مشخص نمودن خصايص و رفتار يک شی برای پردازش است . کپسوله سازی ، مکانيزمی است که توسط "انتزاع " ، پياده سازی می گردد .مثلا" شی راديو ، تکنولوژی های متفاوتی را کپسوله نموده است ، تکنولوژی هائی که امکان درک مناسب آنان برای اغلب افراد امکان پذیر نخواهد بود.
در دات نت ، ساختاری که امکان تعریف يک "انتزاع " را فراهم می نمايد ، کلاس ( class ) ، ناميده می شود. واژه کلاس و شی ، اغلب بجای يکديگر استفاده می گردند ، اما شی در واقع يک نمونه از يک کلاس است . يک عنصر شامل مجموعه ای از يک و يا چندين شی نظير يک کتابخانه کلاس در يک DLL است .