در طی ده ها سال از ایجاد و بکارگیری کامپیوتر تاکنون در زمینه های مختلف ، کامپیوتر پیشرفت چشمگیری داشته است.
در نرم افزار،از برنامه های به زبان ماشین به نرم افزارهای هوشمند و زبانهای نسل چهارم رسیده ایم.کاربرد کامپیوتر و نرم افزار در تمام سطوح فراگیر شده است . و نیازهای بشری به شدت گسترش پیدا کرده است و کامپیوتر در تمام زوایای زندگی بشر رسوخ کرده و خواهد کرد ، در چنین وضعیتی لازم است:
1-همه افراد توانی ها و سواد کامپیوتری لازم را داشته باشند .
2-کسانیکه در رشته کامپیوتر فعالیت می کنند باید با ایده ها و روشها و تکنیکهای جدید آشنایی کامل داشته باشند ، یکی از این ایده ها ، برنامه نویسی شی ء گرایی است .
همچنین نیازهای جوامع بشری به شدت گسترش پیدا کرده است . و همین موجب مطرح شدن مفهوم ((سامانه پیچیده )) و ((سیستم پیچیده )) شده است . اغلب پدیده های طبیعی و بسیاری از ساخته ها و آفرینشهای امروزین بشر را باید تحت عنوان رده عام – سامانه پیچیده یا سیستم پیچیده (complex systems) به بررسی و مطالعه نشست . مثالهای زیادی را می شود برای این سامانه ها ذکر کرد مانند سامانه اقتصاد یا سامانه کارت سوخت و انرژی
سیستمهای پیچیده :سازمانها مصداق کامل سیستمهای پیچیده هستند ، پیچیدگی سیستمها نه فقط به تعدد و تنوع اجزای سیستم و متغیرهای اثر گذار بر رفتار آنها مربوط می شود . بلکه به تنوع ارتباطات فیما بین اجزاء و محیط از سویی و به متغیر بودن جهت و شدت تاثیرات متقابل و تعاملات بین اجزاء و محیط از سوی دیگر مربوط است .
مدیریت بر سیستمهای پیچیده مستلزم درک این پیچیدگیها و این ویژگیها است .در این سیستمها بجای تمرکز بر نقطه بروز مساله و سعی در زدودن نشانه های مساله ، باید بر رفتار سیستم پدید آورنده مساله تمرکز کرد .
در این سیستمها ، آنچه مهم است (( چه باید باشد )) و ((چگونه باید باشد )) مهم است . مهندسان نرم افزار در تحلیل سیستمهای پیچیده می باید چگونگی و چرایی رفتار آن سیستم را نه فقط بررسی کنند بلکه باید این چگونگی و چرایی را به تصویر بکشند و در نهایت بصورت نرم افزار در آورند.
پیچیدگی نرم افزارهای مورد تقاضا روز به روز بیشتر می شود در حالی که ما در برخورد با این پیچیدگیها بطور بنیادی محدود هستیم . ما چه خواهیم کرد راه کار چیست ؟
تنها یک راه وجود دارد و آن هم استراتژی غلبه بر پیچیدگیها و به نظم در آوردن آشفتگی
روش چیره شدن بر پیچیدگیها از زمان قدیم شناخته شده است . فاصله بینداز و پیروز شو .
در مواقع طراحی یک سیستم نرم افزاری پیچیده ، تفکیک آن به قسمتهای کوچک و کوچکتر بسیار ضروری است . به گونه ای که بتوانیم هر یک را بطور مستقل مورد توجه قرار دهیم.
از این رو پس از گستردگی سیستمهای پیچیده ، مهندسی نرم افزار دستخوش تغییرات فراوانی شد ، و روش توسعه نرم افزار مبتنی بر کد نویسی خط به خط با توسعه مبتنی بر شی ء یا مؤلفه جایگزین شد.
تعریف کلی شی :
مؤلفه های نرم افزاری یک قطعه جامع و قابل توسعه می باشد که عملکردش به خوبی تعریف شده است و از طریق واسطها با دیگر مؤلفه ها می تواند ترکیب شده و با همدیگر در تعامل باشند.
سه هدف اصلی برنامه نویسی مبتنی بر اشیاء:
*غلبه بر پیچیدگی * مدیریت تغییر * قابلیت استفاده مجدد.
غلبه بر پیچیدگی: ما در یک دنیای پیچیده ای از عصر انفجار اطلاعات زندگی می کنیم .طبق تحقیقات انجام گرفته توسط تیمی در دانشگاه برکلی : دنیا ما بین یک و دو اگزا بایت اطلاعات بی نظیر در هر سال تولید می کند که تقریبا 250 مگا بایت برای هر مرد ، زن و بچه در روی زمین است . هر اگزا بایت یک بیلییون گیگا بایت است . در علم کامپیوتر اندازه پیچیدگی نرم افزار به طور قابل توجه در حال افزایش است .. برنامه نویسی مبتنی بر مولفه یک روش موثر با نام تقسیم و غلبه را برای برخورد با پیچیدگی نرم افزار فراهم می کند.
مدیریت تغییر:تغییرات در مهندسی نرم افزار ذاتی است ، تغییر خواسته های کاربران ، تغییر مشخصه ها ، تغییر کارکنان ، تغییر بودجه ، تغییر تکنولوژی و غیره.یکی از اهداف اساسی مهندسی نرم افزار تاکید بر اهمیت مدیریت تغییر می باشد.برنامه نویسی مبتنی بر مولفه یک روش موثر به نام برنامه ریزی برای تغییر و ساخت طراحی را برای برخورد با تغییرات در مهندسی نرم افزار فراهم آورده است . مولفه ها به آسانی با خواسته های جدید و در حال تغییر وفق داده می شوند .
قابلیت استفاده مجدد: نرم افزار با قابلیت استفاده مجدد باعث می شود که طراحی و پیاده سازی فقط یکبار انجام گیرد و در زمینه ها و قلمرو های متفاوتی بارها و بارها مورد استفاده قرار گیرد که قابلیت استفاده مجدد باعث افزایش بازدهی ، بکارگیری مفید از راه حلهای ارائه شده ، اصلاح کیفیت و غیره می باشد. سطوح مختلفی از قابلیت استفاده مجدد نرم افزار وجود دارد برای نمونه کپی کردن کد منبع ، که پایین ترین سطح از قابلیت استفاده مجدد می باشد. کتابخانه ای از توابع رویه ای بهتر از کپی کد منـبع می باشد اما توسعـه پذیر نیست. برنامه نویسی مبتنی بر مولفه سطح بالایی از استفاده مجدد نرم افزار را پشتیبانی می کند. به خاطر اینکه در برگیرنده انواع گوناگونی از استفاده مجدد می باشد.
پس دانستیم که بنابر توضیحات بالا به هنگام مواجهه با سیستمهای پیچیده و بزرگ باید با دید شی گرایی به سیستم نگاه کنیم ، فایده این روش در آن است که ریسک تولید سیستمهای بزرگ را کاهش می دهد به دلیل آنکه طراحی این سیستمها به گونه ای است که بتوانند از سیستمهای کوچکتر که ما در مورد آنها مطمئن هستیم به سیستمهای بزرگتر می رسیم .
اکنون سوال مطرح می شود که در برخورد با سیستمهای پیچیده چگونه بادید شی گرایی کار کنیم و اجزای اصلی دیدگاه شیء گرایی چیست ؟
در دیدگاه شیء گرایی ما با سه مقوله مواجه هستیم .
1-برنامه سازی شی گرایی (Object-oriented programming)
2-طراحی شی گرایی (Object-oriented design)
3-تحلیل شیء گرایی (Object-oriented analysis)
برنامه نویسی شیء گرایی
یک شیوه برنامه نویسی است که در آن برنامه ها بصورت مجموعه ای از اشیاء که با یکدیگر همکاری می کنند ، سازمان داده شده اند .اشیاء صورتهای مجرد از ماهیتهای مطرح در مسئله هستند که دارای وضعیت (درونی) و همچنین عملیات بر روی دادهها (وضعیت درونی) میباشند.
طراحی شی گرایی
طراحی شیء گرا بر یک پایه مهندسی محکم که مجموعه عناصرش را مدل شیء می نامیم ، بنا شده است . طراحی شی گرایی با دیدگاه سنتی طراحی ساخت یافته متفاوت است ، در این تکنیک ما با اشیا ، سر و کار داریم طراحی شیء گرا بر مباحثی نظیر: شیء، کلاس، مسئولیت، عمل و سناریو استوار است و جهان را به صورت مجموعه ای از اشیاء به هم مرتبط می بیند که هر شیء، رفتار خاص خود و مسئولیت خاص خود را دارد.
فرآیندی است که برای درک سیستم با استفاده از کلاسها و اشیایی که در جهان با آن سیستم مرتبط هستند ، استفاده می شود . در واقع تحلیل گر در این حالت همه اجزا سیستم را بصورت شی ء می بیند و تفکیک می کند ، و براساس قوانین دنیای شی گرایی ، ارتباط بین اشیا را ایجاد می کند.
نحوه ارتباط 3 عنصر بالا با یکدیگر:
اصولا حاصل تحلیل شی گرا به عنوان مدلی که از آن می توانیم طراحی شی ء گرا را آغاز کنیم ، می تواند عمل کند سپس حاصل طراحی شی گرا ، می تواند برای پیاده سازی کامل سیستم ، با استفاده از روشهای برنامه نویسی شی گرا مورد استفاده قرار می گیرد . شکل زیر گویای مسله است
تحلیل شی گرا ------------> طراحی شی گرا-----------> برنامه نویسی شی گرا
سه رکن بنیادی شی گرایی
1-کپسوله سازی (encapsulation)
2-وراثت (inheritance)
3-چند شکلی بودن (polymorphism)
1-کپسوله سازی : فرآیند مخفی نگاه داشتن تمام جزییات از یک شی است که مشارکتی در ویژگیهای اصلی شی نداشته باشند . به شکل زیر نگاه کنید ، شما در فرایند کپسوله سازی از جزییات شی خود بی خبرید
-وراثت : یک سلسله مراتب میان کلاسها در سیستمهای شی گرا است . وراثت تشبیهی از دنیای واقعی وراثت موجود است ، کلاس فرزند می تواند خصوصیات کلاس پدر را به ارث ببرد.
3-چند شکلی بودن : یعنی اینکه یک موجودیت ، دارای اشکال مختلفی باشد. و یا به تعبیری با استفاده از یک نام واحد بتوان رفتارهای مختلفی را در شرایط مختلف آن هم بصورت خودکار انتظار داشت .
برای درک دو مورد بالا به شکل زیر دقت کنید ، ما یک مجموعه حیوانات داریم خوب همه آنها حیوان هستند ، پس می توان یک کلاس والد یا پدر به نام حیوان داشته باشیم که بقیه کلاسها مانند ، شیر ، سگ و گربه و غیره از آن مشتق شده باشند یا به تعبیری از آن ارث بری می کنند یعنی کلاس شیر باید خاصیت کلاس حیوان را به ارث ببرد .
شاید برای شما این سوال مطرح شده باشد ، که چگونه می توان کلاس یا متی و .. بنویسیم که مثلا با انواع داده ها کار کند .مثلا متدی بنویسیم که پارامترهای ورودی آن هم از نوع int و هم از نوع float باشد و یا کلاسی بنویسید که هم پارامتر های int را بپذیرد و هم string ، خوب حتما می خواهید چندین متد یا چندین کلاس بنویسید و یا فکر می کنید باید override کنید . نه اینگونه نیست .از زمان اریه شده .net2 چند سالی می گذرد ، اما یکی از قابلیتهایی که در آن زمان اضافه شد generic ها بود .که تا به امروز هم استفاده فراوانی دارد .generic ها ساختار گرامری جدیدی به دات نت اضافه کرده اند .مثلا می توانید یک کلاس کلی بنویسید بدون اینکه مشخص کنید که چه نوع داده ای رامی پذیرد .البته این کل ماجرا نیست بلکه به نظر بنده generic ها پاسخی هستند به برخی از نیازها و سواالات زیر :
1-آیا می توان interfaces, classes, methods, events and delegates. داشته باشیم که بتواند انواع مختلف داده را بپذیرد؟
2-آیا می توان آرایه یا لیستی از عناصر گوناگون داشته باشیم که بتواند انواع مختلف داده ها را در خود ذخیره کند ؟
3-آیا می توان بدون پیاده سازی مجدد یک الگوریتم آن را با ساختار داده ای متفاوت دیگری بکار ببریم؟
سوالات فراوان است اما بنده به همان سه سوال بالا اکتفا می کنم . و وارد بحث خواهم شد ، ابتدا تعریف
تعریف generic
یک کلاس یا متد و یا اینترفیس و غیره شبیه یک کلاس) یا متد و یا اینترفیس و غیره( عادی تعریف می شود ، با این تفاوت که بعد از نام کلاس ، نوع generic مشخص می گردد. نوع داده ای generic بوسیله کلاس می توانند به عنوان نوع داده یک عضو از کلاس یا به عنوان نوع داده پارامتری متدها استفاده شوند.
اگر طراح یا برنامه نویس صفحات وب باشید ، حتما با فایلها css سرو کار داشته اید ، مهمترین عناصر این فایلها id و class است .
با نگاهی گذرا ، می بینیم که ای دو خصوصیت بسیار مشابه هم هستند ، پس چرا از هر دو استفاده می کنیم ، جه تفاوتی با هم دارن
در اینجا من می خواهم تفاوت عمده این دو عنصر یعنی id و class را در فایلها css برای شما مختصرا بیان کنم.
Id منحصر به فرد است :
*-هر عنصر می تواند تنها یک id داشته باشد .
*-هر صفحه می تواند فقط یک عنصر با یک id منحصر به فرد داشته باشد
کلاسها منحصر به فرد نیستند :
*-شما می توانید از یک کلاس در چندین عنصر استفاده کنید
*-شما می توانید از چند کلاس در یک عنصر استفاده کنید
<div class="widget"></div> <div class="widget big"></div>
شباهت id و class با سیستم بارکد و شماره سریال
شما اگر به کالاهای موجود در یک فروشگاه زنجیره ای دقت کنید می بینید ، یک کالای خاص دارای مثلا 50 عدد موجودی در آن فروشگاه است ، خوب تمام این 50 عدد دارای یک شماره بارکد است که وقتی توسط دستگاه خوانده می شود ، نشان دهنده رنگ و قیمت و بقیه مشخصات آن کالا است ، حال اگر قیمت آن کالا عوض شد ، شما باید اطلاعات مربوط به آن بارکد را عوض کنید
اما همان کالا در کنار بارکد ، دارای یک شماره سریال است ، این سریال برای هر کالا یک شماره منحصر به فرد است ، یعنی هر کدام از این اقلام 50 ،کالا دارای شماره سریال منحصر به فرد است ، این شماره فقط نمایش دهنده آن کالا است و اطلاعات آن قابل تغییر نیست .
خوب شباهت و تفاوت id و class در فایلهای css همانطور است . در حقیقت id همان شماره سریال کالا است که منحصر به فرد است و قابل تغییر نیست . و بارکد همان class است که فقط نمایش دهنده آن کالا است که تکراری است و می تواند هر لحظه تغییر کند .