آموزش مفاهیم برنامه نویسی شی گرا (بخش اول)

به نام خدامفاهیم برنامه نویسی شی گرا...برنامه نویسی شی گرا چیست؟در دنیای منطقی و روی حساب و کتاب آی تی که سال هاست در حال گسترش و پیشرفت است زمانی برخی به این نتیجه رسیدند که باید روشی برای مفهومی تر نمودن برنامه نویسی رقم زد که آن را به دنیای واقعی نزدیک نمود و روی حساب این تفکر شد که روشی به نام برنامه نویسی شی گرا یا OOP به وجود آمد.در واقع اگر شما این مقاله را می خوانید احتمال دارد که یک برنامه نویس باشید که مدتی است که برنامه نویسی می کنید و یا تازه شروع کرده باشید و در پی این که اصلا OOP چه چیزی هست به این جا رسیده باشید.در هر صورت من سعی می کنم که به نحوی مسئله را تشریح کنم که برای همه قابل فهم باشد. در واقع چون خود بنده روزی در ابتدای راه این کار با ابهامات زیادی در فهم برنامه نویسی شی گرا مواجه می شدم تلاش کرده ام که تمامی سوالات آن زمان خود را در نظر گرفته و در این مجموعه مطالب به آن پاسخ دهم.همان طور که گفتم شاید شما قبلا برنامه نویسی کرده باشید و کمی هم دست به کد شده و کد نوشته باشید شاید تا به حال چندین مقاله در زمینه برنامه نویسی شی گرا مطالعه کرده باشید و با زبان های تابعی (functional) هم کار کرده باشید یا اصلا هیچ پیش زمینه در برنامه نویسی نداشته باشید و تازه با یکی از زبان های شی گرا شروع به کار کرده باشید که از نظر من هیچ مشکلی ندارد. البته اگر قبلا کار کرده باشید طبیعتا فهم این مقاله برای شما آسان تر خواهد بود اما باز هم می توانید اعتماد کنید و مقاله را تا آخر بخوانید.می رویم سراغ اصل مطلب...همان طور که گفته شد برنامه نویسی شی گرا یک پارادایم و یا روش برنامه نویسی است و نه یک زبان یا هر چیز دیگر و در این روش سعی نموده شده برای مفهومی تر نمودن برنامه نویسی دنیای واقعی را شبیه سازی نماید.در این روش برنامه را به بخش هایی تقسیم کرده که بر هر یک از این بخش ها شی گفته می شود و از در کنار هم قرار گرفتن این اشیاء برنامه کامل شده و می توان از آن استفاده نمود.حالا می خواهیم بدانیم حکمت استفاده از این اشیاء چیست و چطور دنیای واقعی شبیه سازی شده است.در دنیای مادی ما به اجسام و اجرام اطراف خودمان شی می گوییم مثلا به ماشین. ماشین در برنامه نویسی شی گرا نیز یک شی قلمداد می شود.ماشین ها قبل از اینکه ما سوارشان بشویم نیاز به تولید شدن دارند که در کارخانه ها انجام می شوند. همان طور که می دانید ابتدا کارگر ها به سمت دستگاه نمی روند و دستگاه را روشن کرده و ماشینی بسازند و وقتی ماشین تولید شد نگاهش کنند و به به چه چه کنند. بلکه اول باید طرح و نقشه ای ماشین توسط مهندسان زده شود تا کاملا مشخص باشد که قرار است که چه چیزی را تولید کنند. و بعد از آن می توان از روی این طرح هزاران ماشین به این شکل و مکانیزم تولید نمود.در برنامه نویسی نیز مفهومی وجود دارد به نام کلاس. البته نه از آن کلاس هایی که در دوره ابتدایی در آن درس می خواندیم بهتر است آن تفکر را درباره کلاس در اینجا دور بریزید و به آن فکر نکنید. کلاس مانند نقشه ای است که شی ما در آن طراحی می شود.حالا وقت این است که بگوییم هر موجودیت در برنامه های شی گرا یک شی محسوب می شوند این اشیاء ابتدا در واحدی به نام کلاس نوشته می شوند و ساز و کار آن ها کاملا مشخص می شوند و سپس از آن مانند طرحی که از روی آن ماشین می سازند، شی ایجاد می شود. ممکن است تا به حال دقیق مطلب را نگرفته باشید.پس بگذارید این را در یک برنامه واقعی جدا از بحث ماشین مثال بزنیم.ما یک برنامه بانکداری داریم که در آن موجودیتی به نام حساب بانکی وجود دارد همان طور که گفته شد ما برای هر موجودیت در برنامه کلاس ایجاد می کنیم.پس ابتدا کلاسی به نام حساب بانکی ایجاد کرده و تمامی ساز و کار یک حساب بانکی را در آن می نویسیم که حکم یک طرح را برای ما پیدا می کند و سپس می تواند از آن تا جایی که دلمان می خواهد شی ایجاد کنیم یعنی حساب ایجاد کنیم.یعنی یک بار یک کلاس را نوشته و می توان از آن به اندازه مشتریان بانک حساب ایجاد نمود تا هر کدام حساب منحصر به فرد خودشان را داشته باشند و آن را مدیریت کنند مثل ماشین هایی که همگی از روی یک طرح ساخته می شوند اما سر آخر در نمایشگاه ماشین به هر کسی که پولش را بدهد ماشین می فروشند.در واقع کلاس فقط یک مفهوم یا concept است که وقتی به عرصه مادی قدم می گذارد تبدیل به شی می شود.بگذارید از زاویه ی دیگری به جز مهندس و نقشه و ماشین رابطه بین کلاس و شی را تشریح کنیم.در واقع اگر به شما بگویند موبایل چیست؟احتمالا وسیله ای مربعی شکل و شیشه ای و لمسی در خاطرتان می آیند که می توان با آن زنگ زد، عکس و ویدئو گرفت، فیلم، به اینترنت متصل شد، در اینستاگرام و تلگرام فعالیت کرد و هزاران فعالیت سالم و ناسالم دیگر را در محیط این مربع کوچک که در دست و جیب جا می شود که خرجش هم فقط چند ماه حقوق بی زبان تان بی کم و کاست است (با کمی اغراق) J.این چیز هایی که در بالا درباره آن صحبت کردیم فقط یک فرض (انتزاع) از موبایل است و شما نمی توانید با فکر و خیالاتی که از موبایل در درون ذهنتان است از آن استفاده کنید و باید نمونه ای از موبایل حالا یا ال جی یا سامسونگ یا اپل در دستتان باشد تا بتوانید از آن بهره ببرید.در واقع کلاس نیز یک فرض از شی است و ابتدا باید از کلاس شی ایجاد کنید تا بتوانید از آن شی استفاده کنید.حالا شاید فکر کنید چرا مثال قبلی مان از ماشین و طرحش با مثال موبایل و فرض (انتزاع) آن با هم فرق می کنند حالا کدامشان دقیقا مفهوم کلاس و شی را می رسانند.باید عرض کنم که این دو مثال در واقع شاید سبک و نوع متفاوتی داشته باشند اما هر دو یک حرف را می گویند و طرح ماشین نیز یک فرض یا انتزاع از ماشین است که هنوز به وجود نیامده مانند فرضی از موبایل که در ذهن ماست اما موبایلی نداریم که از آن استفاده کنیم.بله این است که برنامه نویسی شی گرا را به دنیای روزمره نزدیک می کند. فرض هایی کلی درباره چیزی و اما اشیائی از آن فرض ها که می توانند ویژگی هایی متفاوت داشته باشند.مانند موبایلی که در ذهنمان در بالا توصیف نمودیم حالا این شی از موبایل می توانید ال جی یا سامسونگ یا هوآوی و یا اپل باشد که هر کدام ویژگی های خاص خودشان را دارند دوربین با کیفیت متفاوت، مدل متفاوت، منوی متفاوت، طرز کار متفاوت اما در حقیقت همه ی آنها موبایل هستند و ویژگی هایی یکسان دارند که باعث می شوند به آن ها بگوییم موبایل و فرض بالا را برای آنها در نظر بگیریم.فکر می کنم حالا دیگر درک بسیار خوبی از کلاس و شی و شی گرا پیدا کرده اید.حالا می خواهیم برویم سراغ مطلبی که بسیار مهم است درباره اشیاء در دنیای واقعی و همچنین در دنیای برنامه نویسی......صفات و رفتار ها در اشیا· صفات (attributes)در دنیای واقعی هر شی صفاتی دارد مثل همان ماشین که دارای صفاتی مثل رنگ، اندازه، وزن، نام، نام کمپانی سازنده، مدل، نهایت سرعت و ... است. در برنامه های شی گرا نیز اشیاء یا بهتر است بگوییم کلاس ها (که بعدا از آنها شی ایجاد می شود) صفاتی دارند مثلا در همان کلاس حساب بانکی، صفاتی مانند میزان موجودی، نام صاحب حساب، نوع حساب (سپرده، قرض الحسنه) وجود دارند که توسط برنامه نویس تعریف می شوند. وقتی از کلاس حساب بانکی شی ایجاد می شود هر شی ویژگی های خاص خودش را می گیرد مانند کلاس حساب بانکی که هرچه از آن شی ایجاد شود ویژگی های خودش را دارد.مثلا هر شی صاحب حساب خودش را دارد و میزان موجودی هر شی منحصر به فرد خودش است و اشیاء دیگر به آن دسترسی ندارند.· رفتار ها (behaviors)هر شی رفتار هایی دارد که از او سر می زند مثل یک ماشین که مثلا حرکت می کند، تغییر جهت می دهد، ترمز می کند، گاز می دهد و ... .حال می خواهیم رفتار های ماشین را بررسی کنیم. یکی از رفتار هایی که ماشین انجام می دهد گاز دادن یا به عبارت باکلاس تر افزایش سرعت است که توسط پدال گاز انجام می شود.درون پدال گاز مکانیزمی وجود دارد که باعث می شود سرعت ماشین افزایش پیدا کند.در واقع اینجا پدال گاز مکانیزمی برای رفتار گاز دادن ماشین است.در درون کلاس ها نیز رفتار هایی تعریف می شوند که متعلق به اشیاء هستند و قرار است این کار ها توسط اشیاء انجام شود.همان طور که رفتار گاز دادن ماشین توسط پدال گاز انجام می شود، رفتار ها در کلاس ها توسط "متد" ها انجام می شود.شاید قبلا با کلمه هایی مثل همین متد برخورد داشته اید.بهتر است ابتدا متد را تعریف کنیم.متد بخشی از کد بلوکه شده (تکه برنامه) ای است که کار (رفتار) خاصی را انجام می دهد و برای استفاده از آن می توان در هر کجا از برنامه که خواست آن را فراخوانی نمود یا به عبارت دیگر آن را صدا زد. متدها کمک می کنند که خوانایی کد های برنامه بیشتر شود و در نوشتن کد های اضافه و وقت برنامه نویس صرفه جویی شود زیرا هر وقت بخواهیم از آن قطعه کد که رفتاری را انجام می دهد استفاده کنیم فقط کافی است آن را فراخوانی کنیم.مانند پدال گاز که همیشه در زیر پای راننده موجود است و قبلا در کارخانه (تشبیه برنامه نویس به کارخانه) ساخته شده و حالا هر وقت بخواهیم گاز بدهیم فقط کافی است پدال را با پا فشار دهیم.اگر بخواهیم متد را به پدال گاز تشبیه کنیم. مکانیزم داخل پدال گاز همان کد هایی است که داخل متد وجود دارد که رفتار را توصیف می کند و گاز دادن همان رفتاری است که از متد سر می زند.حالا یک مثال واقعی از یک برنامه می زنیم. همان برنامه بانکداری که کلاسی به نام حساب بانکی داشت. کارت به کارت کردن، واریز وجه، گرفتن موجودی، عوض کردن رمز و تخصیص رمز دوم از رفتار هایی است که کلاس حساب بانکی دارد....فراخوانی متد هاباید یک خبر بد به شما بدهم که باز هم می خواهیم سراغ مثال خز شده ی ماشین و پدالش برویم که در هر مقاله ای که کسی درباره ی شی گرایی می نویسد از مثال ماشین استفاده می کند اما از انصاف نگذرم مثال خوب و جامعی است و بسیاری از مفاهیم شی گرایی را می توان با آن توضیح داد.طبیعتا فقط داشتن یک پدال موجب رفتار گاز دادن ماشین نمی شود و باید برای گاز دادن پای خود را روی پدال فشار دهید تا رفتار اجرا شود.برای اجرا شدن رفتار در برنامه نویسی شی گرا که همان متد ها است باید متد را فراخوانی کنید یا به عبارت دیگر آن را صدا بزنید.خب دوستان بخش اول مقاله ما به پایان رسید.این مقاله در چند بخش است که حتما باید مطالب مهم دیگری را یاد بگیرید تا کاملا مفاهیم شی گرایی را درک کنید. حالا یا در مجموعه مقالات ما یا در مقالات سایت دیگر.ضمنا این نصیحت را از خودم به شما می کنم که شما باید برای فهم عمیق و کامل برنامه نویسی شی گرا قطعا به یک زبان شی گرا مثل پایتون، جاوا، سی شارپ و ... کد نویسی کنید تا مطالب را کاملا درک کنید و فقط با خواندن مقاله نمی توان کار را به جایی رساند گرچه بسیار پر فایده است.با تشکر.منابع:· تعریفی از تابع با کمی تغییر از مهندس عین الله جعفرنژاد قمی· کتاب چگونه با visual C# 2010 برنامه نویسی کنیم اثر «هاروی‌ام دیتل» و «پال‌جی دیتل» ترجمه «مهندس علیرضا انصاری»