eshpilen
یک شنبه 12 دی 1389, 20:33 عصر
شاید شما هم با بنده هم نظر باشید که باوجود قدیمی بودن این بحث و منابع زیادی که سعی کردن شیء گرایی رو تعریف و بخصوص مزایای اون رو بیان و اثبات و با روشهای دیگر برنامه نویسی مقایسه کنن، بیشتر این مطالب برای خیلی مبتدی ها و حتی حرفه ایها دارای ابهام و دوری از نمودهای عینی هستن. نمیدونم چرا اینطوره! شاید توضیح بعضی چیزها مشکله و شاید اغراق و افراط باعث این امر میشه و شاید موقع توضیح دادن که میشه یادشون میره!!
ولی تازگی توضیحاتی بنظرم رسید که فکر میکنم مفید باشن. هرکس دیگر هم توضیحی داره میتونه بگه تا روشن بشیم.
خب شیء گرایی بنظر من یک چیز ساده و خیلی عینی هست. نیازی نیست مدام توضیح بدیم که بله شیء مثل اشیاء جهان خارجی که مثلا یک میز یا اتومبیل هست و پایه و چرخ داره و گاز و دنده غیره و غیره!! بنظرم این اسم شیء و شیء گرایی فکر آدم رو یخورده زیادی منحرف میکنن و باعث میشن بیهوده به مثالهایی که ذهن شنوندگان رو کم و بیش منحرف میکنن رو بیاریم.
بنظر بنده اساس شیء در برنامه نویسی درواقع مفهومی به این سادگی هست که ما میایم و تمام متغییرها و توابعی رو که مربوط به یک کار خاص یا یکسری کارهای مشابه/همخانواده و وابسته هستن در یک واحد برنامه نویسی که خودش تقریبا میتونه تاحدودی شبیه یک برنامهء مستقل و ایزوله از بقیهء برنامه تصور بشه، بنام کلاس، جمع میکنیم تا کدها تر و تمیز و خوانا بشه و از تداخل اسم متغییرها و توابع بخشها و کارهای دیگر برنامه با هم جلوگیری بشه و مثلا نگران نباشیم اگر از یک متغییر بنام counter در یک الگوریتم برنامه استفاده میکنیم، متغییر دیگری با همون نام در جای دیگری در برنامه که چیز دیگری رو میشماره وجود داشته باشه (درواقع کلاسها بنوعی نقش فضاهای نامی رو هم در سطح دسته بندی واحدهای کاری مختلف عضو یک برنامه ایفا میکنن). شیء گرایی یه چیزایی در همین حد ساده و عینی هست! یک نوع دسته بندی و بصورت قطعه های مجزا درآوردن. ماجولار کردن بخشهای مختلف کدهای برنامه.
موقعی که آدم روی یک کلاس کار میکنه، دیگه با تعداد زیادی از متغییرها و توابع دیگری که مستقیما به عملیات جاری مربوط نیستن در لابلای کدها و الگوریتم و کاربرد مورد مطالعه برخورد نمیکنه و این به تمرکز و سرعت برنامه نویس خیلی کمک میکنه و خیلی کمتر نیاز به جهش های مداوم از روی کدها و متغییرهای نامربوط و جستجو برای موارد مرتبط با موضوع درمیان کدهای برنامه داره. ضمنا یک کلاس رو میشه داد برنامه نویس دیگری بنویسه، و میشه در یک فایل مستقل ذخیره کرد.
این ویژگیها باوجود اینکه بنظر کوچک میان اما بخاطر نیازها و حساسیت و ظرفیت انسان، در عمل خیلی تاثیر گذار هستن.
یکسری ویژگیهای پیشرفته تر هم به کلاسها اضافه شدن که خودشون جای بحث دارن. مثلا اینکه اصول طراحی صحیح اینترفیس کلاسها چیه و Public و Private و غیره چین. اما اینا مسائل بعدی و فرعی هستن. مثل قواعد نامگذاری استاندارد و بدون تداخل قفسه ها و پرونده ها یا کتابها در یک بایگانی یا کتابخانه.
اصل کلاس همون ماجولار کردن کدهای برنامه با توجه به کارکرد و ارتباط بین کدهای واحدهای مختلف کارها و مراحل متعددی که برنامه انجام میده هست که باعث تفکیک و کم حجم و راحت شدن کدها برای مطالعه و طبقه بندی بخشهای مختلف برنامه میشه.
فرق زبانهای شیء گرا با زبانهای تابعی (ساخت یافته) فقط در این هست که زبانهای شیء گرا، امکانات فنی لازم برای تسهیل و بهینه سازی فرایند این ماجولار و طبقه بندی کردن کدهای برنامه رو توسط سینتاکس خودشون در اختیار برنامه نویس میذارن. وگرنه ما در یک زبان تابعی هم میتونیم فرضا با استفاده از جمع کردن متغییرها و توابع مستقیما مرتبط، در یک بخش از کد و قرار دادن هرکدوم از این قطعه کدها در یک فایل مجزا و احتمالا همچنین استفاده از قواعد نامگذاری طبقه بندی شده، چیزی کم و بیش با کارایی پایهء برنامه نویسی شیء گرا رو ایجاد کنیم.
بخاطر همین هست که لزوما اونایی که از زبانهای غیر شیء گرا استفاده میکنن کارشون غیراصولی و غیربهینه نیست. چون این افراد هم وقتی حرفه ای باشن اکثرا طبقه بندی و ماجولار کردن های مشابهی رو با روشهای دیگر به کدهای خودشون اعمال میکنن و از بخش عمده ای از مزایای شیء گرایی بهره مند میشن.
شیء گرایی بیشتر یک قدم و تکامل طبیعی و منطقی هست که با افزایش حجم و پیچیدگی برنامه، هر برنامه نویسی مجبوره برداره. یک طبقه بندی و تفکیک کدهای درهم تنیدهء برنامه به اجزاء و واحدهای کوچکتر مرتبط که میتونه حتی در زبانهای غیر شیء گرا هم بصورت قابل توجهی با روشهایی که از خیلی وقت قبل از ایجاد زبانهای شیء گرا دراختیار بوده اجرا بشه.
پس شیء گرایی چیز پیچیده و گنده و ایده ای که از پایه جدید باشه نبوده. توسعه و تکمیل فنی یک فرایند طبیعی قدیمی هست.
همونطور که آدم در یک دفتر کار وقتی مقدار کارها زیاد میشه میره دنبال قفسه بندی و خرید پوشه و پرونده درست کردن و تفکیک و طبقه بندی و نامگذاری اشیاء و اسناد مختلف، در زمینهء برنامه نویسی هم نیاز به همین کار هست تا بشه حجم و پیچیدگی رو راحتتر مدیریت کرد.
یک کلاس میتونه بسادگی یک فایل مجزا که محتوی متغییرها و توابع مرتبط با یک کار و الگوریتم و خاص از برنامه هست باشه. اما زبانهای شیء گرا امکانات بیشتری رو برای هرچه سریعتر و راحتتر کردن این کار و افزایش امکانات اطلاعاتی طبقه بندی مورد نیاز دراختیار برنامه نویسان میذارن که کار رو راحتتر و کاملتر میکنه.
درواقع با یک زبان غیر شیء گرا هم میشه همه چیز رو پیاده کرد، اما این کار بخاطر محدودیتهای زبان، دشوارتر هست و خیلی کارها رو که زبانهای شیء گرا بصورت خودکار انجام میدن یا تسهیل میکنن، برنامه نویس باید خودش انجام بده. خیلی وقتها برنامه نویس خیلی چیزها رو فراموش میکنه یا بخاطر تنبلی از خیرشون میگذره، ولی زبانهای شیء گرا این کارها رو بصورت خودکار انجام میدن، یادآوری میکنن، یا برنامه نویس رو بنوعی مجبور به انجامش میکنن. اگر هم کلا طبقه بندی و تقسیم به بخشهای کوچکتر در همون زبان غیر شیء گرا هم صورت نگیره، برنامه نویس درمیان انبوه کدها سردرگم میشه.
ضمنا یک کلاس میتونه خودش کلاسهای دیگری رو در خودش داشته باشه. این کلاسها هم باوجود اینکه هرکدوم محتوی کدهای یک کار خاص هست ولی حتما در یک سطح بالاتر با هم ارتباط دارن و میتونن مشترکا کار کلی تری رو انجام بدن. مثل طبقه بندی، که مثلا پرونده های املاک منقول رو در یک بخش قفسه میذاریم و پروندهء املاک غیرمنقول رو در بخش دیگه. درواقع اون بخشهای قفسه هم یک کلاس و پروندهء سطح بالاتر محسوب میشن.
خودتون با توجه به این توضیحات قضاوت کنید؛ آیا نیازی به مقایسه با اشیاء جهان خارجی مثل میز و صندلی و اتومبیل بود؟ فکر میکنم اینطور مثالها اگر گمراهکننده نباشن، حداقل ضرورت و فایدهء خاصی هم ندارن.
چون اشیاء درون برنامه اغلب خیلی محدودتر و متفاوت تر از این اشیاء دنیای بیرونی هستن. اشیاء دنیای فیزیکی از ابتدا بصورت شیء وجود دارن و ما اونها رو بخاطر طبقه بندی ایجاد نکردیم، بلکه بر اساس وجود اونها و خواصی که دارن اونها رو توصیف و با روشهای دیگری طبقه بندی میکنیم، درحالیکه درمورد شیء گرایی در برنامه نویسی ما داریم عکس این عمل رو انجام میدیم؛ یعنی بخاطر طبقه بندی و دسته دسته کردن عناصر موجود، اشیایی رو ایجاد میکنیم. بنظر من این تفاوت در جهت و هدف، میتونه موجب سردرگمی افراد مبتدی بشه.
چون آدم فکر میکنه حتما صرف ایجاد چیزهایی مثل اشیاء دنیای فیزیکی، در برنامه نویسی هم خاصیت و معنایی ایجاد میکنه. نمیدونم خلاصه مثال مبهمی هست که مقایسه و تفکرهای انحرافی متعددی رو به ذهن متبادر میکنه و ما رو از اصل مطلب و موضوع به این سادگی که اصلا نیازی به چنین مثالهایی نداشت دور میکنه. همون مثال طبقه بندی و پرونده پرونده کردن و قفسه بندی بنظرم خیلی ساده تر و کاراتر هست.
ما مثلا میگیم که یک میز چیزهایی مثل ارتفاع و تعداد پایه داره. درحالیکه اینها جزو ماهیت میز هستن. بنابراین اغلب این تفکر بصورت آگاهانه و ناخودآگاه به افراد القا میشه که منظورمون این هست که حتما باید به بخشهای مختلف یک برنامه و کار و الگوریتم هم خصوصیاتی اختصاص بدیم تا شبیه اشیاء دنیای واقعی بشن و فکر میکنن هدف صرف ایجاد اون شباهت بوده و بر اثر ایجاد این شباهت بین اشیاء دنیای واقعی و کدهای برنامه هست که خصوصیات مطلوبی ایجاد میشن.
ولی تازگی توضیحاتی بنظرم رسید که فکر میکنم مفید باشن. هرکس دیگر هم توضیحی داره میتونه بگه تا روشن بشیم.
خب شیء گرایی بنظر من یک چیز ساده و خیلی عینی هست. نیازی نیست مدام توضیح بدیم که بله شیء مثل اشیاء جهان خارجی که مثلا یک میز یا اتومبیل هست و پایه و چرخ داره و گاز و دنده غیره و غیره!! بنظرم این اسم شیء و شیء گرایی فکر آدم رو یخورده زیادی منحرف میکنن و باعث میشن بیهوده به مثالهایی که ذهن شنوندگان رو کم و بیش منحرف میکنن رو بیاریم.
بنظر بنده اساس شیء در برنامه نویسی درواقع مفهومی به این سادگی هست که ما میایم و تمام متغییرها و توابعی رو که مربوط به یک کار خاص یا یکسری کارهای مشابه/همخانواده و وابسته هستن در یک واحد برنامه نویسی که خودش تقریبا میتونه تاحدودی شبیه یک برنامهء مستقل و ایزوله از بقیهء برنامه تصور بشه، بنام کلاس، جمع میکنیم تا کدها تر و تمیز و خوانا بشه و از تداخل اسم متغییرها و توابع بخشها و کارهای دیگر برنامه با هم جلوگیری بشه و مثلا نگران نباشیم اگر از یک متغییر بنام counter در یک الگوریتم برنامه استفاده میکنیم، متغییر دیگری با همون نام در جای دیگری در برنامه که چیز دیگری رو میشماره وجود داشته باشه (درواقع کلاسها بنوعی نقش فضاهای نامی رو هم در سطح دسته بندی واحدهای کاری مختلف عضو یک برنامه ایفا میکنن). شیء گرایی یه چیزایی در همین حد ساده و عینی هست! یک نوع دسته بندی و بصورت قطعه های مجزا درآوردن. ماجولار کردن بخشهای مختلف کدهای برنامه.
موقعی که آدم روی یک کلاس کار میکنه، دیگه با تعداد زیادی از متغییرها و توابع دیگری که مستقیما به عملیات جاری مربوط نیستن در لابلای کدها و الگوریتم و کاربرد مورد مطالعه برخورد نمیکنه و این به تمرکز و سرعت برنامه نویس خیلی کمک میکنه و خیلی کمتر نیاز به جهش های مداوم از روی کدها و متغییرهای نامربوط و جستجو برای موارد مرتبط با موضوع درمیان کدهای برنامه داره. ضمنا یک کلاس رو میشه داد برنامه نویس دیگری بنویسه، و میشه در یک فایل مستقل ذخیره کرد.
این ویژگیها باوجود اینکه بنظر کوچک میان اما بخاطر نیازها و حساسیت و ظرفیت انسان، در عمل خیلی تاثیر گذار هستن.
یکسری ویژگیهای پیشرفته تر هم به کلاسها اضافه شدن که خودشون جای بحث دارن. مثلا اینکه اصول طراحی صحیح اینترفیس کلاسها چیه و Public و Private و غیره چین. اما اینا مسائل بعدی و فرعی هستن. مثل قواعد نامگذاری استاندارد و بدون تداخل قفسه ها و پرونده ها یا کتابها در یک بایگانی یا کتابخانه.
اصل کلاس همون ماجولار کردن کدهای برنامه با توجه به کارکرد و ارتباط بین کدهای واحدهای مختلف کارها و مراحل متعددی که برنامه انجام میده هست که باعث تفکیک و کم حجم و راحت شدن کدها برای مطالعه و طبقه بندی بخشهای مختلف برنامه میشه.
فرق زبانهای شیء گرا با زبانهای تابعی (ساخت یافته) فقط در این هست که زبانهای شیء گرا، امکانات فنی لازم برای تسهیل و بهینه سازی فرایند این ماجولار و طبقه بندی کردن کدهای برنامه رو توسط سینتاکس خودشون در اختیار برنامه نویس میذارن. وگرنه ما در یک زبان تابعی هم میتونیم فرضا با استفاده از جمع کردن متغییرها و توابع مستقیما مرتبط، در یک بخش از کد و قرار دادن هرکدوم از این قطعه کدها در یک فایل مجزا و احتمالا همچنین استفاده از قواعد نامگذاری طبقه بندی شده، چیزی کم و بیش با کارایی پایهء برنامه نویسی شیء گرا رو ایجاد کنیم.
بخاطر همین هست که لزوما اونایی که از زبانهای غیر شیء گرا استفاده میکنن کارشون غیراصولی و غیربهینه نیست. چون این افراد هم وقتی حرفه ای باشن اکثرا طبقه بندی و ماجولار کردن های مشابهی رو با روشهای دیگر به کدهای خودشون اعمال میکنن و از بخش عمده ای از مزایای شیء گرایی بهره مند میشن.
شیء گرایی بیشتر یک قدم و تکامل طبیعی و منطقی هست که با افزایش حجم و پیچیدگی برنامه، هر برنامه نویسی مجبوره برداره. یک طبقه بندی و تفکیک کدهای درهم تنیدهء برنامه به اجزاء و واحدهای کوچکتر مرتبط که میتونه حتی در زبانهای غیر شیء گرا هم بصورت قابل توجهی با روشهایی که از خیلی وقت قبل از ایجاد زبانهای شیء گرا دراختیار بوده اجرا بشه.
پس شیء گرایی چیز پیچیده و گنده و ایده ای که از پایه جدید باشه نبوده. توسعه و تکمیل فنی یک فرایند طبیعی قدیمی هست.
همونطور که آدم در یک دفتر کار وقتی مقدار کارها زیاد میشه میره دنبال قفسه بندی و خرید پوشه و پرونده درست کردن و تفکیک و طبقه بندی و نامگذاری اشیاء و اسناد مختلف، در زمینهء برنامه نویسی هم نیاز به همین کار هست تا بشه حجم و پیچیدگی رو راحتتر مدیریت کرد.
یک کلاس میتونه بسادگی یک فایل مجزا که محتوی متغییرها و توابع مرتبط با یک کار و الگوریتم و خاص از برنامه هست باشه. اما زبانهای شیء گرا امکانات بیشتری رو برای هرچه سریعتر و راحتتر کردن این کار و افزایش امکانات اطلاعاتی طبقه بندی مورد نیاز دراختیار برنامه نویسان میذارن که کار رو راحتتر و کاملتر میکنه.
درواقع با یک زبان غیر شیء گرا هم میشه همه چیز رو پیاده کرد، اما این کار بخاطر محدودیتهای زبان، دشوارتر هست و خیلی کارها رو که زبانهای شیء گرا بصورت خودکار انجام میدن یا تسهیل میکنن، برنامه نویس باید خودش انجام بده. خیلی وقتها برنامه نویس خیلی چیزها رو فراموش میکنه یا بخاطر تنبلی از خیرشون میگذره، ولی زبانهای شیء گرا این کارها رو بصورت خودکار انجام میدن، یادآوری میکنن، یا برنامه نویس رو بنوعی مجبور به انجامش میکنن. اگر هم کلا طبقه بندی و تقسیم به بخشهای کوچکتر در همون زبان غیر شیء گرا هم صورت نگیره، برنامه نویس درمیان انبوه کدها سردرگم میشه.
ضمنا یک کلاس میتونه خودش کلاسهای دیگری رو در خودش داشته باشه. این کلاسها هم باوجود اینکه هرکدوم محتوی کدهای یک کار خاص هست ولی حتما در یک سطح بالاتر با هم ارتباط دارن و میتونن مشترکا کار کلی تری رو انجام بدن. مثل طبقه بندی، که مثلا پرونده های املاک منقول رو در یک بخش قفسه میذاریم و پروندهء املاک غیرمنقول رو در بخش دیگه. درواقع اون بخشهای قفسه هم یک کلاس و پروندهء سطح بالاتر محسوب میشن.
خودتون با توجه به این توضیحات قضاوت کنید؛ آیا نیازی به مقایسه با اشیاء جهان خارجی مثل میز و صندلی و اتومبیل بود؟ فکر میکنم اینطور مثالها اگر گمراهکننده نباشن، حداقل ضرورت و فایدهء خاصی هم ندارن.
چون اشیاء درون برنامه اغلب خیلی محدودتر و متفاوت تر از این اشیاء دنیای بیرونی هستن. اشیاء دنیای فیزیکی از ابتدا بصورت شیء وجود دارن و ما اونها رو بخاطر طبقه بندی ایجاد نکردیم، بلکه بر اساس وجود اونها و خواصی که دارن اونها رو توصیف و با روشهای دیگری طبقه بندی میکنیم، درحالیکه درمورد شیء گرایی در برنامه نویسی ما داریم عکس این عمل رو انجام میدیم؛ یعنی بخاطر طبقه بندی و دسته دسته کردن عناصر موجود، اشیایی رو ایجاد میکنیم. بنظر من این تفاوت در جهت و هدف، میتونه موجب سردرگمی افراد مبتدی بشه.
چون آدم فکر میکنه حتما صرف ایجاد چیزهایی مثل اشیاء دنیای فیزیکی، در برنامه نویسی هم خاصیت و معنایی ایجاد میکنه. نمیدونم خلاصه مثال مبهمی هست که مقایسه و تفکرهای انحرافی متعددی رو به ذهن متبادر میکنه و ما رو از اصل مطلب و موضوع به این سادگی که اصلا نیازی به چنین مثالهایی نداشت دور میکنه. همون مثال طبقه بندی و پرونده پرونده کردن و قفسه بندی بنظرم خیلی ساده تر و کاراتر هست.
ما مثلا میگیم که یک میز چیزهایی مثل ارتفاع و تعداد پایه داره. درحالیکه اینها جزو ماهیت میز هستن. بنابراین اغلب این تفکر بصورت آگاهانه و ناخودآگاه به افراد القا میشه که منظورمون این هست که حتما باید به بخشهای مختلف یک برنامه و کار و الگوریتم هم خصوصیاتی اختصاص بدیم تا شبیه اشیاء دنیای واقعی بشن و فکر میکنن هدف صرف ایجاد اون شباهت بوده و بر اثر ایجاد این شباهت بین اشیاء دنیای واقعی و کدهای برنامه هست که خصوصیات مطلوبی ایجاد میشن.