من می خواهم برنامه نویس شوم - قسمت ششم

سلام به همه دوستان، قسمت پنجم شما را با سودو کد آشنا کرد. این قسمت شما را با پایه‌ای ترین و مهمترین مفهوم زبان های برنامه نویسی امروز یعنی شی گرایی آشنا خواهد کرد همچنین با مفاهیم تابع، نیز آشنا می‌شوید نهایتا با بررسی مختصری، راجع به مراحل طراحی یک برنامه آشنا می شویم.

پس از پشت سر گذاشتن آموزش های لازم در صورتی که به عنوان نیروی تازه کار قرار باشد در جایی کار کنید از شما در مصاحبه راجع به اصول شی گرایی صحبت خواهد شد. و این بحث مهم است و در ادامه با چیستی آن آشنا خواهید شد. پس از ابتدا بهتر است به شیوه ای استاندارد آموزش خود را دنبال کنید و حتی اولین خط برنامه خود را نیز که در مقاله بعدی خواهیم آموخت به شیوه شی گرایی بنویسید.

شما با هر زبانی که برنامه بنویسید نیاز به مفهوم شی گرایی خواهید داشت و در کار حرفه ای از شما انتظار می‌رود که با رعایت استاندارد ها، برنامه نویسی کنید. البته روشهای دیگری همچون طراحی عامل گرا هم وجود دارد که برای طراحی برنامه های بسیار خاص است.

فرض کنید کارفرما از شما می خواهد فرایند کاغذی تحویل یک رسید به مشتری را به کامپیوتر متصدی منتقل کنید تا فرم را در یک برنامه پر کند و آن را چاپ کند و تحویل مشتری دهد. این برنامه نیز هم می تواند تحت وب نوشته شود و هم تحت هر نوع سیستم عاملی اما برگردیم سراغ شی گرایی، برای آنکه نگاهی شی گرایی به یک برنامه داشته باشیم هرچه در این برنامه وجود حقیقی و فرضی دارد مثل کاربری که قرار است فرم را پر کند و یا یک دسته بندی صرفا ذهنی (مثلا نحوه تسویه و ...) را یک موجودیت در نظر می گیریم.

در این مثال در ساده ترین حالت موجودیت های اولیه ما: کاربر سیستم، فرم و مشتری هستند. حال می پرسید پس مثال دسته بندی چه شد؟ برای تعیین موجودیت ها باید دید آیا آن ها صرفا یک نام (مثلا اسم دسته) یا عدد هستند یا دارای خصوصیت های دیگری نیز هستند. آیا فقط در یک قسمت از برنامه استفاده خواهند شد یا برنامه دارای بخش های دیگری خواهد بود که از همین خصوصیت در آن بخش ها نیز استفاده خواهد شد؟

مثلا به صورت محال فرض کنید از مشتری فقط و فقط نام او مورد نیاز ماست. از آنجا که در این صورت نام مشتری را در فرم قرار خواهیم داد می‌تواند موجودیت نباشد بلکه تنها یکی از خصوصیت های فرمی باشد که قرار است پر شود. اما چون مشتری حاوی اطلاعات ارزشمندی است که بعدها از آنها استفاده های دیگری برای افزایش کارایی سیستم خواهیم داد باید در نظر داشته باشید علاوه بر اینها می تواند حاوی اطلاعات دیگری نیز باشد که صحیح نیست همه آن ها را متعلق به فرم ببینیم (البته هرکاری ممکن است). تشخیص مرز خصوصیت و موجودیت دانستن یک مفهوم به عهده شماست. اما نکاتی وجود دارد:

  • در صورتی که مفهوم مورد نظر شما بیش از یک خصوصیت دارد (مثلا نام، نام خانوادگی، کد ملی، سن و ...) بهتر است موجودیت جدا برای آن در نظر گرفت
  • در صورتی که این مفهوم قرار است در جای دیگری استفاده شود و یا چند بار تکرار شود بهتر است موجودیت در نظر گرفته شود زمانی که شما یک موجودیت دارید که با موجودیت دیگری ارتباط دارد (مثل مشتری و فرم) موجودیت مشتری در محلی جدا ذخیره می شود و تنها عددی به نمایندگی از آن موجودیت در محل ذخیره سازی فرم قرار می‌گیرد که آن را id می نامیم. حال مثلا برای اصلاح نام مشتری نیاز نیست همه فرم هایی که نام مشتری در آن است را اصلاح کنید. با اصلاح نام مشتری در محل خود همه چیز درست خواهد شد چون id که به نمایندگی در فرم ها وجود دارد تغییر نکرده و به همان موجودیت قبلی که اصلاح شده اشاره می‌کند.

در مورد خصوصیت «نحوه تسویه» در فرم فرض کنید به شما بگویند این سیستم قرار است ارتقاء پیدا کند و شما در آینده به این ویژگی در جاهای دیگر سیستم نیز نیاز خواهید داشت، پس بهتر است از هم اکنون آن را موجودیت جدا در نظر بگیرید.

هم نمی‌توان و هم می توان گفت اینگونه تفکر یعنی شی گرایی. چون این مفهوم در پیاده سازی نمودهای دیگری نیز دارد که با آن آشنا خواهید شد اما شروع شی گرایی همین طرز تفکر در مورد حتی ساده ترین برنامه‌ها است.

مثلا در برنامه جمع دو عدد، کل برنامه را می‌توانید یک موجودیت در نظر بگیرید و آن را شی اصلی بنامید یا برنامه یا ماشین حساب، فرقی نمی‌کند.

فرض کنید برنامه‌ای می نویسید برای روشن و خاموش کردن تنها یک لامپ led کوچک. باز هم میتوان کل برنامه را یک موجودیت (مثلا با نام فلاشر) در نظر گرفت. از این پس فرض کنید لفظ «کلاس - class» همان موجودیت است.

یعنی می‌گوییم برنامه فلاشر می تواند یک کلاس باشد. یا کل برنامه در یک کلاس نوشته شود یا برنامه تحویل فرم دارای چندین کلاس است که با هم ارتباط دارند.

شی چیست؟

فرض کنید شما برنامه روشن کردن یک لامپ کوچک را نوشته اید بدین صورت فرض کنید که شما فقط آدرس فیزیکی محل لامپ را به آن میدهید و شروع به روشن و خاموش کردن آن لامپ می کند. حال به شما می گویند برنامه دیگری بنویسید که چندین لامپ را روشن کند.

یک روش این است که برنامه را چند بار اجرا کنید و روش صحیح تر این است که برنامه را ارتقا دهید. حال برنامه شما پخته تر شده. صرفا یک فلاشر نیست. فلاشری است که چندین لامپ را روشن و خاموش می کند. پس الان علاوه بر موجودیت فلاشر (کلاس اصلی) موجودیت لامپ (یا کلید به صورت کلی تر فارغ از اینکه چه چیزی به آن وصل است) نیز دارید. پس برنامه اصلی باید چندین مصداق از کلاس کلید را بسازد. به هر مصداق یک شی گفته می شود. برنامه شما یک بار اجرا شده در نتیجه یک شی از آن درست می شود و به ازای هر کلیدی از کلاس کلید استفاده می کند (هر کدام متفاوت است چون خاصیت آدرس متفاوتی دارند) پس چندین شی از کلاس کلید ساخته می شود. شما یک بار کلاس فلاشر و کلاس کلید را می نویسید اما بنا به استفاده ممکن است چندین شی از آنها ساخته و مقادیر داخل آن متفاوت باشد. یا یک بار ساخته شود و چندین بار استفاده شود.

به طور ساده فرض کنید یک فرم طراحی کرده اید. هر موقع نیاز آن داشتید می توانید یک کپی بگیرید و مقادیر متفاوتی را با خودکار در آن بنویسید. فرم شما یک کلاس و هر پرینت از آن یک شی است.

توابع و خصوصیات کلاس

در قسمت قبل متغیر توضیح داده شده شد. هنگام توضیح موجودیت، برخی مفاهیم را خصوصیت نامیدیم. یک کلاس دارای یکسری خصوصیات است. این خصوصیات مقادیری را در خود جای می دهند، مثلا نام که رشته «سعید» در آن موقتا ذخیره می شود. خصوصیات یک کلاس در حقیقت متغیر های آن هستند.

پس کلاس شما می تواند یکسری متغیر داشته باشد. به این متغیر ها attribute های یک کلاس نیز میگویند.

کلاس «مشتری» می تواند متغیر های زیادی داشته باشد اما کلاس «فلاشر» اگر همچنان فرض کنیم قرار است با آدرس فیزیکی لامپ کار کند تنها همان متغیر را نیاز دارد.

یک کلاس می تواند یک یا چند مجموعه دستورالعمل داشته باشد مثلا دستورات مربوط به ذخیره، دستورات مربوط به بررسی صحیح بودن یک فیلد از فرم یا دستورات مربوط فراخوانی یک فرم جدید. هر کدام از این مجموعه دستورات که حتی می تواند یک خط و یک دستور مجزا باشد را تابع (function) یا متد (method) مینامیم. البته در زبان های مختلف ممکن است برای این دو لفظ تفاوت هایی قائل باشند اما در کل مفاهیم یکسانی هستند.

در کلاس فلاشر یک تابع می تواند وجود داشته باشد برای روشن کردن لامپ و یک تابع دیگر نیز برای شروع زمان و متوقف کردن آن. با ساخت یک شی فلاشر جز آنکه در حافظه فضایی به آن اختصاص داده می شود و یا به اصطلاح در فضای رم بارگزاری می شود اتفاق دیگری نمی افتد در حقیقت با اجرای توابع موجود در کلاس دستورات داخل آن برنامه اجرا می شود و به عبارت دیگر برنامه شما اجرا می شود.

پس از ساخت شی از کلاس می توان تابع زمان آن را فرخوانی (invoke) کرد و آن نیز می تواند تابع روشن و خاموش شدن را فراخوانی کند و ... . در قسمت های بعد و همچنین با دنبال کردن منابع آموزشی که برای زبان مورد علاقه خود تهیه کرده و در حال مطالعه آن هستید مثال هایی را در دنیای واقعی خواهید دید.

این مقاله برای آماده کردن ذهن شما و پاسخ برخی سوالات از پیش بود که در هنگام رسیدن به این موضوع توفقی نداشته باشید.

می دانم منتظر نوشتن اولین خط برنامه اجرایی هستید. در قسمت بعد اولین خط اجرایی را با شش مورد از زبانهای یاد شده در قسمت بعد خواهیم نوشت (جاوا، سی پلاس پلاس، پی اچ پی، سی شارپ، پایتون و سوئیفت).

https://virgool.io/CodeLovers/%D9%85%D9%86-%D9%85%DB%8C%D8%AE%D9%88%D8%A7%D9%87%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D8%B4%D9%88%D9%85-%D9%82%D8%B3%D9%85%D8%AA-%D9%87%D9%81%D8%AA%D9%85-o7zzlikl2nmu