برای یه دولوپر که عاشق آشنا شدن با زبونای برنامهنویسی جدید و سر و کله زدن باهاشونه یه اتفاق خیلی خوب میوفته اونم اینه که با روشها و الگوهای جدید از حل مسئله روبرو میشه. شیوههایی که بهش کمک میکنن یاد بگیره از زاویههای مختلف به مسئله نگاه کنه و ذهنش به جای قفل شدن روی یه راه حل، به حل کردن مسئله آشنا بشه.
در طول عمر نه چندان بلند دنیای برنامهنویسی یک سری الگو برای کد نوشتن شکل گرفت که یا مبنای یک زبون بودن یا راهگشای کاستیهای یه زبون. به همین دلیل هم هست که برنامههای بزرگ نه کاملا بر اساس یک الگو که بر اساس چندین الگو که هرکدوم برای حل یکی از مسائلشون بهتر هست نوشته میشن.
سعی کردم معروفترین شیوههای برنامهنویسی رو تو این پست مرور کنم تا هم به عنوان داکیومنت برای خودم بمونه هم شما.
این پارادایم یکی از قدیمیترین پارادایمهای برنامهنویسیه و روالش خیلی به روال دستوری که کامپیوتر باهاش کار میکنه شبیهه. یعنی برنامهنویس قدم به قدم مشخص میکنه متغیرها به چه نحو تغییر داده بشن تا به جواب نهایی برسه.
مثال خوبی از این روش برنامهنویسی رو توی ویکیپدیا دیدم که نوشته بود:
به عنوان مثال اگر قصد باز کردن دری را داشته باشیم اگر با زبان دستوری بیان کنیم خواهیم گفت بلند شو، به طرف در نزدیک شو، دستگیره را بگیر و در را به طرف بیرون هل بده.
در حقیقت این پارادایم شامل چندین دستوره که قدم به قدم روی یک یا چند متغیر اجرا میشه و در انتها نتیجهی به دست اومده پاسخیه که برنامهنویس مد نظر داره.
برنامهنویسی دستوری به سه دستهی بزرگ تقسیم میشه
۱. برنامهنویسی پروسهای (Procedural programming)
به زبان ساده در این روش روال همون روش کلی برنامهنویسی دستوری هست با این خصوصیت که برای کنترل و نظم بیشتر در طول برنامه، مجموعهای از دستورات رو در قالب توابع قرار میدیم و این توابع رو با متغیرهای مورد نیازشون اجرا میکنیم. مهمترین دستاورد این روش code reuse یا همون قابلیت استفادهی چندین باره از یک تکه کد و جلوگیری از تکرار چند بارهی دستورات یکسان بود.
معروفترین زبانهای برنامهنویسی این پارادایم C و Pascal هستن.
بعد از این بود که برنامهنویسی شئگرا ظهور کرد.
۲. برنامهنویسی شئگرا (object oriented programming, OOP)
در این روش برنامه به صورت مجموعهای از کلاسها و آبجکتها نوشته میشه که با هم در ارتباطن. کوچکترین موجودیت در برنامه آبجکتها هستن که انواع محاسبات و تغیرات روشون اعمال میشه. در این روش تاکید بیشتر بر روی دادهها هست تا دستورات. oop میتونه راهکار مناسبی برای اکثر مشکلات دنیای برنامهنویسی باشه و یکی از پر استفادهترین پارادایمهای دنیای برنامهنویسی امروزه.
اولین زبان برنامهنویسی شئگرا Simula بود و زبانهای دیگهای مثل C++, Java, C#, Objective C هم از این پارادایم پیروی میکنن.
۳. رایانش موازی (Parallel processing)
برای این پارادایم به توضیح کامل و شفاف ویکیپدیا بسنده میکنم:
رایانش موازی یا محاسبات موازی به اجرای همزمان یک برنامه (که به بخشهای کوچکتری تقسیم شدهاست) بر روی چند پردازنده به منظور دستیابی به سرعت بیشتر اطلاق میشود. ایدهٔ اصلی این است که فرایند حل یک مسئله را معمولاً میتوان به زیروظایف خردتری تقسیم کرد که با اجرای همزمان این زیروظایف و هماهنگ کردن آنها مسئله اصلی در زمان کوتاهتری حل میشود.
از زبان NESL که یکی از قدیمیترینهای این پارادایمه میشه به عنوان نمونه نام برد و البته با استفاده از برخی کتابخانهها میشه در C و ++C از این الگو استفاده کرد.
بگو چیمیخوای نه اینکه میخوای چطور انجام شه.
این پارادایم بر خلاف برنامهنویسی دستوری بجای ( چطور انجام بده ) روی ( چه کاری انجام بده ) تمرکز داره. در این روش شرح منطق و هدف محاسبات بجای توضیح نحوهی محاسبات مورد تاکید قرار میگیره.
۱.برنامهنویسی منطقی (logical programming)
پایههای این روش بر منطق ریاضی استواره. مثلا میگیم دونالد آدمه (fact). بعد اعلام میکنیم آدمایی که گاهی نمیفهمن چی میگن دیوونن .(rule) بعد میگیم دونالد گاهی نمیفهمه چی میگه (fact). در انتها میپرسیم آیا دونالد دیوونس؟ (query). که جواب بله به دست میاد.
معروفترین زبانی که بر مبنای این پارادایم ساخته شده prolog هست.
۲. برنامه نویسی تابعی (functional programming)
در این روش برنامه به چندین تابع کوچیک تبدیل میشه که باید pure باشن. مفهوم pure function یعنی:
برای تشخیص pure نبودن در نظر داشته باشید که اگر تابعی رو اجرا میکنید ولی از مقادیر بازگشتیش استفاده نمیکنید احتمالا اون تابع side effect داره و pure نیست.
با این پیش فرضها یک سری توابع داریم که میشه به آسونی درستی کارکردشون رو تست کرد. بعد از نوشتن توابع و برقرار بودن تستها میشه نحوهی کار هر تابع رو فراموش کرد و صرفا اونها رو مثل پازل در کنار هم چید و به خروجیهای مورد نظر رسید.
از معروفترین زبانهای برنامه نویسی که بر مبنای این پارادایم ایجاد شدن میشه haskell, Clojure, lisp, F#, Scala و javascript اشاره کرد. اگرچه نکتهی مهم در زبانهای تابعی اینه که توابع رو first class citizen میدونن یعنی میشه باهاشون توابع رو در متغیرها ذخیره کرد و اونها رو به عنوان پارامتر به توابع دیگه فرستاد اما در سالهای اخیر یک سری از خاصیتهای این پارادایم به دلیل محبوبیت و سادگی و گویایی به زبانهای دیگه وارد شدن. مثل lambda expression ها که این روزها تقریبا تو اکثر زبانهای برنامه نویسی میبینیمشون.
۳. برنامهنویسی واکنشی (reactive programming)
چند سال اخیر اکثر ما با کتابخونههای ReactiveX آشنا شدیم که تقریبا برای همهی زبانهای برنامه نویسی وجود دارن مثل Rxjs یا RxJava یا RxDart یا Rx .Net و …
برنامهنویسی واکنشی یعنی برنامهنویسی با جریان دادههایی که در طول زمان ایجاد میشن. اگرچه ممکنه به خاطر گرایش شدید دنیای مدرن برنامهنویسی امروز به این پارادایم، فکر کنیم یک کشف جدیدیه باید بگم که نه. Event Bus ها یا حتی همین کلیک event ساده که هممون استفاده کردیم، برنامهنویسی با جریان eventهایی که در طول زمان ایجاد میشن هستن که ما observeشون میکنیم و بر اساسشون state برنامه رو تغییر میدیم.
برنامهنویسی Reactive همون ایدهس که یکم خفنتر شده. حالا نه تنها از چیزایی مث click و hover بلکه میتونیم از هرچیزی یه جریان داده (data stream) بسازیم. متغیرها، ورودیها، پروپرتیها و … . مثلا فید توییترمون میتونه مث همون click یه data stream باشه که observeش کنیم و به مقادیر جدیدش واکنش نشون بدیم.
قابلیتهای برنامهنویسی تابعی میتونن همین چیز شگفتانگیز رو جذابتر کنن مثلا stream توییتهایی که میاد رو با filter تبدیل کنیم به یه stream دیگه از توییتهایی که کمتر از ۶۰ کاراکتر طول دارن و جداگانه observeشون کنیم.
پارادایم برنامهنویسی واکنشی به هیچ زبان برنامهنویسی وابسته نیست و همونطور که در ابتدا گفتم پیاده سازیش با کتابخانههای ReactiveX تقریبا برای همهی زبانها سادهسازی شده.
پارادایمهای برنامهنویسی قطعا تعدادشون از موارد ذکر شده بیشتره و بعضیاشون نیاز به توضیحات خیلی بیشتری دارن. تو پستهای بعدی روی چند موردشون بیشتر تمرکز میکنم و با نمونه کد سعی میکنم چند مسئله رو باهاشون حل کنم تا بهتر ساز و کارشون رو ببینیم و فلسفشون رو متوجه بشیم.