اگر دانشجوی رشته نرم افزار باشید احتمالاً درسی به نام «برنامهنویسی شیئگرا» (Object Oriented Programming) و یا «برنامهنویسی پیشرفته» داشتهاید که در هر دوی این دروس مبحث شیئگرایی بیان میشود. (البته متأسفانه بسیاری از اساتید به اشتباه در این دروس به جای بیان مفاهیم زیبای شیئگرایی که تا آخر عمر به درد دانشجو میخورد، یک سری چیزهای ابتدایی مثل کار با Visual C# یعنی آوردن دکمه و textBox در صفحه و تولید برنامههای ویژوال (هر چند پیشرفتهترین برنامهها) را یاد میدهند و هیچ اشارهای به اینکه این دکمه یک شیئ است و شیئ یعنی چه نمیکنند!)
به هر حال، اگر از شما بخواهند شیئگرایی را توضیح دهید به طوری که یک نفر که برنامهنویسی هم نمیداند، متوجه شود، شما چطور توضیح میدهید؟
من خودم در کلاسها با یک مثال توضیح میدهم و آن مثال این است:
فرض کنید خدا امروز میخواهد یک انسان جدید بیافریند، به نظر شما آیا از اول، مفاهیمی مثل «چشم»، «گوش»، «قلب» و امثالهم را تعریف میکند؟ آیا مفاهیمی مثل «گریه»، «خوردن»، «آشامیدن» و عملیات دیگر را مجدداً تعریف میکند؟ یعنی برای هر انسان دوباره تعریف میکند که چشم باید به صورت بیضی شکل با گوشههای تیز باشد، قلب باید فلان شکل باشد و گریه یعنی «جاری شدن اشک از بخشی از بدن به نام چشم به انضمام به هم خوردن عضوهایی به نام تارهای صوتی برای تولید مفهومی به نام صدا» و ...؟
ما میگوییم این کار یعنی اتلاف وقت! (و چیزهای منفی در خدا راه ندارد) بهتر است خدا یک قالب کلی برای انسانها تعریف کند که همه این مفاهیم یک بار برای آن قالب تعریف شده است. قالب کمی هم حالت انعطافپذیری دارد. یعنی مثل خمیرهای بازی میشود کمی اجزایش را کوچک و بزرگ کرد. حالا برای خلقت انسان جدید، یک سری صفات جدید در نظر میگیرد (مثل رنگ چشم آبی و رنگ موی قهوهای و غیره) و این صفات را همراه با گل آدم در آن قالب میریزد و حالا انسان تولید شده را از قالب در میآورد.
دقیقاً از روی همین ماجرا، مبحث شیئگرایی مطرح شد:
فرض کنید یک برنامهنویس دارد برنامه مدیریت ثبت احوال یا دانشگاه را مینویسد. به نظر شما آیا برای هر دانشجو مجدداً مفاهیمی مثل «نام»، «نام خانوادگی»، «نام پدر» و امثالهم را تعریف میکند؟ آیا مفاهیمی مثل «ثبت نام»، «ویرایش»، «ارتقا» و عملیات دیگر را مجدداً تعریف میکند؟ یعنی برای هر دانشجو میگوید: نام باید از نوع String باشد و نهایت طول آن 50 کاراکتر باشد، تاریخ تولد باید از نوع Date باشد و به صورت YYYY-MM-DD در نظر گرفته شود و یا «ثبت نام» یعنی درج مشخصاتی مثل نام و نام خانوادگی و نام پدر و غیره در جدولی به نام students در دیتابیسی به نام university با مجوزی با نام کاربری و پسورد فلان...؟ بعد همه اینها را دوباره در یک فایل دیگر از برنامه تکرار میکند؟
ما میگوییم این کار یعنی اتلاف وقت! (و برنامهنویس باید تا جایی که میتواند از اتلاف وقت جلوگیری کند) بهتر است برنامه نویس یک قالب کلی برای دانشجو تعریف کند که همه این مقاهیم یک بار برای آن قالب تعریف شده است. قالب، کمی حالت انعطافپذیری دارد. یعنی میتوان برخی اجزا را بعداً موقع تولید دانشجوی جدید تغییر داد. حالا برای ایجاد دانشجوی جدید، یک سری مقادیر جدید برای صفات خواهیم داشت (یعنی مقدار نام و نام خانوادگی و نام پدر دانشجوی جدید فرق میکند) این مقادیر جدید را در آن قالب کلی میریزد و حالا دانشجوی تولید شده را از قالب بیرون میآورد و استفاده میکند.
برنامهنویسان در اصطلاح به آن قالب، Class (کلاس) میگویند. به آن اجزا (مثل گوش و چشم و غیره) اصطلاحاً Property Name و به مقادیر آنها (مثل رنگ آبی و گوش بزرگ و غیره) اصطلاحاً Property Value و به آن عملیات (مثل گریه کردن، راه رفتن یا ثبت نام و ارتقا) اصطلاحاً Method میگویند.
اینکه قالبها انعطافپذیر هستند در اصطلاح گفته میشود میتوان صفات و رفتار کلاسها را Override کرد. (یعنی روی صفات قالب پیشفرض تغییراتی داد)
اگر شما از یک کلاس یک نمونه جدید تولید کنید (مثل دانشجویی که از کلاس Student ایجاد شده باشد)، به آن نمونه اصطلاحاً Object یا شیئ گفته میشود.
چون در برنامهنویسیهای جدید، برنامهنویسان ترجیح میدهند تمام کارهایشان را با اشیاء و کلاسها انجام دهند، گفته میشود آنها «برنامهنویسی شیئگرا» انجام میدهند.
میدانید چقدر در این کار صرفهجویی میشود؟ کسانی که برنامهنویسی شیئگرا انجام داده باشند میدانند چقدر کار را راحت کرده است! (اتفاقاً این روزها در حال طراحی یک سیستم تحت وب به صورت شیئگرا هستم و برخلاف سیستم «تستا» که آنزمان نمیدانستم شیئگرایی چیست، در این سیستم از شیئگرایی استفاده کردهام. باور کنید در چند دقیقه یک بخش عظیم از پروژه آماده میشود! در حالی که پیش از این ساعتها وقت صرف میکردم)
خوب، امیدوارم مفهوم شیئگرایی جا افتاده باشد، اما بحث اصلی من چیز دیگری بود.
هر وقت این مثال را در کلاسها میزدم، با خودم فکر میکردم که: آیا واقعاً خدا از مفهوم شیئگرایی برای خلقت انسانها استفاده میکند؟ اصلاً درست است کار خدا را با کار دنیایی خودمان که زمان در آن دخیل است مقایسه کنیم؟
تا اینکه چند شب پیش در مسجد، قرائت قرآن شبانه رسید به سوره نساء. دور اول که در سالهای قبل هر شب یک صفحه از قرآن را خواندند، من به معنی دقت نمیکردم و فقط آیات را میخواندم. این دور گفتم، قاری که قرآن را میخواند من فقط معانی را نگاه کنم.
تا معنی آیه اول سوره نساء را خواندم باور کنید چشمانم اینطور شد:
آیه را بخوانید:
بسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ يَا أَيُّهَا النَّاسُ اتَّقُوا رَبَّكُمُ الَّذِي خَلَقَكُمْ مِنْ نَفْسٍ وَاحِدَةٍ
اى مردم! از پروردگارتان پروا كنيد، آن كس كه شما را از يك نَفْس آفريد.
«نفس واحد» دقیقاً همان مفهوم «کلاس» است! او یک کلاس به نام «کلاس انسان» دارد که برای تولید یک انسان جدید، به قول برنامهنویسها از آن کلاس، یک new میگیرد!
بلاشک خداوند یک برنامهنویس قهار است!
موفق باشید؛
حمید رضا نیرومند
_______________
Added: You may want to have a look at an English version of this post on my English blog:
Object Oriented Programming in Quran!
or another related post:
How Quran is nothing but loss after loss for the unjust!?
کلمات کلیدی: مبحث شیئ گرایی، برنامه نویسی، برنامه نویسی شیئ گرا، رشته نرم افزار، برنامه نویسی پیشرفته، مفهوم شیئ گرایی، توضیح مبحث شی گرایی با استفاده از قرآن، object ، مفهوم شیئ گرایی در برنامه نویسی، اصول برنامه نویسی شیئ گرا