<برنامه نویسی موفق /> قسمت دوم

سلام به همگی... دقیقا یک هفته پیش من اولین پست خودم رو توی ویرگول نوشتم با عنوان «برنامه‌نویسی موفق» و توی هفته ای که گذشت بجز این پُست، مجموعا ۶ مطلب دیگه هم نوشتم که شامل آموزش گیت، آشنایی با ادیتور ویژوال استودیو کد و همچنین آموزش فریمورک Next.js میشد و کم کم کانال یوتیوب رو هم راه انداختم و ۵ ویدیو ساختم و آپلود کردم... ۳۶ نفر اینجا و ۶ نفر توی یوتیوب سابسکرایب کردند و امروز من تصمیم گرفتم که یک برنامه‌ریزی منطقی برای نوشتن مطلب و ارسال اونها داشته باشم... تقریبا دوران تعطیلات کرونایی حداقل برای ما ایرانی‌ها داره تموم و زمان برای این سبک، کار تفننی کمتر میشه.شنبه و چهارشنبه هر هفته راس ساعت ۱۶:۳۰ بصورت منظم من قصد دارم مطالب رو طبق سرفصل زیر ارسال کنم (هم اینجا و هم یوتیوب حداقل یک پُست و ویدیو یا بیشتر):ادامه آموزش آفیشیال نکست جی اس (قدم به قدم با داکیومنت رسمی) (۲ قسمت مونده)ادامه آشنایی با ویژوال استودیو کد (۱۱ قسمت مونده)ادامه آموزش گیت (۱۰ قسمت مونده)ساخت وب‌سایت «دیتابیس موزیک» (با قابلیت آپلود فایل و فیلتر کردن موزیک‌ها و ساخت player برای پخش توی سایت) با Next.jsآموزش کامل و حرفه‌ای Nginx، وب سرور و لودبالانسر بسیار محبوبساخت وب‌لاگ با تمام قابلیت‌های ویرگول + قابلیت‌های پیشنهادی شما با فریمورک Next.js به همراه Authentication کاربر بوسیله JWT و یک API رستفول و ستاپ داکر و دیپلوی روی سرور.آموزش ۰ تا ۱۰۰ پایتون و یادگیری فریمورک‌های محبوب Flask و Djangoآموزش وب پکآموزش تایپ اسکریپتآموزش داکرآموزش Node.js و Expressمشخصا زمانبندی ارایه این مطالب بر اساس علاقه سابسکرایبرها خواهد بود و هر کدوم از این مبحث‌ها که محبوب‌تر بشه و دنبال کننده بیشتری داشته باشه توی اولویت قرار میگیره.بنابر این اگر دوست دارید از شروع این مسیر همراه من باشید همین الان به کانال یوتیوب من با نام 3DLN سابسکرایب کنید و کمکی که شما میتونید توی این راه به من بکنید همین سابسکرایب و لایک هست و اینکه برام زیر ویدیوها کامنت بگذارید و نظرتون رو در مورد هر ویدیو به من بگید و راهنماییم کنید که کدوم مطالب بیشتر مورد پسندتون بوده و سوال و جواب کنید، میدونم که دسترسی به یوتیوب سخته اما برنامه برای آینده این هست که کانال رو گسترش بدم پس قصد ورود به پلتفرم‌های ایرانی مثل آپارات رو ندارم.خوب بریم سراغ <برنامه نویسی موفق /> و امروز میخوایم در مورد یک موضوعی صحبت کنیم که احتمالا چیزی در موردش گوشه و کنار اینترنت به چشمتون خورده باشه و شاید تا حدودی و حتی کاملا در موردش اطلاعات داشته باشید... قضیه از اینجا شروع شد که هفته پیش من یک پُست توی ویرگول دیدم به نام «خداحافظ برنامه نویسی شیئ گرا» که ترجمه ای بود از یک مقاله میدیوم مربوط به سال ۲۰۱۶... البته قدیمی بودن مقاله مهم نبود چون مفهوم کهنه نشده بود، ترجمه مقاله اصلا جالب نیست و با جمله‌هایی مثل «بنابراین من سلسله مراتب خود را کم عمق می کنم و آنها را چرخه ای نگه می دارم.» و یا «با واسط ها ، محدودیتی برای تعداد رفتارهای مختلف که می توانید با هم مخلوط کنید وجود ندارد» اعصابتون رو خط خطی میکنه ولی مقاله اصلی از Scalfani Charles جالب بود و تصمیم گرفتم در این مورد صحبت کنم...آیا عمر برنامه نویسی شیئ‌گرا یا Object Oriented واقعا به سر اومده؟ و اگر اومده جایگزین اون چیه...پاسخ سریع سوال اول اینه که «خیر... حداقل برای مدت طولانی‌ای OOP جوابگوی نیازهای ما خواهد بود و شما میتونید حتی برای شروع یادگیری اون اقدام کنید» و پاسخ تیتروار سوال دوم «برنامه نویسی فانکشنال» هست. اما این دو پاسخ قاعدتا به این شکل یا برای شما قابل درک و یا قابل قبول نیست.وقتی به موضوع کدنویسی صحیح می‌رسیم سریعا میتونیم بحث رو فلسفی کنیم و بگیم اصلا کُد چجوری باید باشه که بهش بگیم کد خوب و چه پارادایمی رو برای نوشتنش باید دنبال کنیم.پس بیاید ببینیم چند پارادایم (الگو) برای برنامه نویسی وجود داره و هر کدوم از اینها چه مزایا و معایبی دارند.Procedural Programming Object Oriented ProgrammingFunctional Programmingسه الگوی برنامه نویسی هستند که شما میتونید هرکدوم از اینها رو دنبال کنید... دقت کنید که بعضی از زبان‌ها شما رو محدود به یکی از این پارادایم‌ها میکنند ولی ما امروز میخوایم از یک زبانی استفاده کنیم که شما رو به الگوی برنامه نویسی مشخصی محدود نمیکنه و به این شکل قصد داریم این سه پارادایم رو با هم مقایسه کنیم (اینکه من یکی در میون از الگو و پارادایم استفاده میکنم به این دلیله که میخوام معنی کلمه پارادایم توی ذهنتون بمونه) و این زبون همون‌طور که حدس میزنید یکی از بی در و پیکرترین، بی‌قاعده‌ترین و محبوب‌ترین زبان‌‌های دنیاست به نام جاوااسکریپت.اول یک صورت مسئله بسیار ساده تعریف میکنیم، بعد با سه پارادایم مختلف راه حل اون رو بازنویسی میکنیم که شما فرق این سه سبک رو متوجه بشید... بعد از اون اگر علاقه‌مند شدید به مطلب یک ویدیو توی کانال یوتیوب میگذارم و یک برنامه ساده رو جداگانه با هر کدوم از این سه پارادایم میسازم (سابسکرایب کردن خیلی آسونه در حد فشار دادن یک دکمه و اگر روی زنگوله کنار دکمه هم کلیک کنید میتونید از آپدیت‌های کانال من به راحتی باخبر بشید)صورت مسئله: کد جاوااسکریپت ما قراره یک Html DOM رو که از نوع button هست بخونه و یک event کلیک رو به اون bind کنه که این event هم قراره یک متد خیلی ساده که توی کنسول اسم پارادایم استفاده شده رو لاگ میکنه تریگر کنه.موافقید که خیلی آسونه... شاید هرکدوم از ما صدها بار این کارو کردیم که وقتی روی یک دکمه توی پیج htmlمون کلیک میشه یک اتفاقی بیفته... اما هر بار شما از چه متدی استفاده کردید؟ شاید توجه نکرده باشید...الگوی Procedural Programming:یک الگوی قدیمی که اگر با زبان‌های فورترن، بیسیک، C و پاسکال کار کرده باشید اون رو خوب میشناسید و اگر راه حل رو با این الگو براتون بنویسم احتمالا متوجه میشید که بسیاری از ماها احتمالا زیاد از این الگو استفاده میکنیم یعنی اجرا کردن دستورات به صورت خط به خط.const button = document.querySelector('submitBTN'); const showParadigm = () => { console.log('This is Procedural Programming Paradigm'); } button.addEventListener('click', showParadigm);آشنا بود نه؟ ?الگوی Object Oriented Programming:یک پارادایم معروف که بر پایه مفهوم آبجکت‌ها (اشیا) ساخته شده که خودشون حاوی دیتا و متدهایی خودش هستند و بنابر این مفاهیم جدیدی مثل کلاس و اینترفیس و وراثت و... رو با خودشون یدک میکشند.class Paradigm { constructor() { this.button = document.querySelector('submitBTN'); this.button.addEventListener('click', show); } show() { console.log('This is Object Oriented Paradigm;); } } new Paradigm();البته خوب این یکم زیاده رویه برای یک کار ساده... اما قراره شما متوجه بشید که قضیه چیه دیگه.الگوی Functional Programming:خوب پس برنامه نویسی فانکشنال چیه؟ و آیا بهترین روش برنامه نویسیه؟ قطعا نه... این هم فقط یک روش دیگه برای مرتب کردن ساختار کدتونه... این روش میگه همه عملکردهای برنامه‌تون رو با فانکشن‌ها بنویسید و خیلی هم به قول خارجیا اکسپلیسیت نیست یعنی سخت نمیگیره. برای خودتون یک معیار بگذارید که مثلا تا یک حدی من فانکشنال مینویسم قرار نیست خودتون رو خیلی محدود کنیدfunction findElement(elementTag) { return document.querySelector(elementTag); } function showParadigm() { console.log('This is Functional Programming Paradigm`); } function connectInput() { const btn = findElement('submitBTN'); btn.addEventListener('click', showParadigm); } connectInput(); اصولا ایده این الگوی برنامه نویسی این هست که شما کد تون رو به صورت مجموعه ای از فانکشن‌ها مینویسید که "هر فانکشن داره کار خودش رو انجام میده". این بخش آخرش مهمه، هر فانکشن بایستی Stateless و Pure باشه و همچنین تولید Side effect نکنه. یعنی چی؟ هدف برنامه نویسی موفق اینه که شما رو با مفاهیم علوم کامپیوتر یا Computer Sciences آشنا کنه:تعریف فانکشن Pure:یک فانکشن پیور (خالص) فانکشنی ست که مقداری که برمیگردونه فقط به مقادیر ورودیش بستگی داره، دقیقا مثل توابع ریاضی مثلا تابع سینوس X همیشه با ورودی یکسان خروجی یکسانی هم داره و محاسبه X هم مقدار خود X رو تغییر نمیده (معنی ساید افکت یا اثر جانبی). فانکشن پیور هیچوقت توی یک فایل لاگ نمینوسه، هیچ ریکوئستی به شبکه ارسال نمیکنه و از کاربر مقدار ورودی نمیگیره و State برنامه شما رو هم تغییر نمیده! عملکردش خیلی خیلی ساده‌ست. وقتی یک فانکشن هر عملکرد دیگری بجز محاسبه مقداری که قراره return کنه انجام بده دیگه خالص نیست و بهش impure گفته میشه. یک روش جالب برای اینکه بفهمید یک فانکشن پیور هست یا نه اینه که بجای خود فانکشن، مقداریو که برمیگردونه بگذارید و ببینید فرقی توی برنامه‌تون میکنه یا نه ? اگر نکرد یعنی فانکشن شما پیوره.تعریف Side Effect در علوم کامپیوتر: هر عملکرد یا فانکشن یا expressionی که بجز متغیرهای لوکال خودش، متغیر دیگری رو خارج از Scope خودش تغییر بده یعنی ساید افکت داشته مثال ساده زیر رو ببینید:let paradigm = 'OOP'; const multiplier = (x, y) => { paradigm = 'Functional'; return x*y; }فانکشن بالا دو تا آرگومان لوکال داره که x و y هستند و اونها رو میگیره و نتیجه ضرب اونها رو برمیگردونه اما قبل از اون داره مقدار یک متغیر خارج از اسکوپ خودش رو تغییر میده پس ساید افکت داره.خوب واضحه که بعضی وقت‌ها مجبوریم فانکشن‌های impure بنویسیم هیچ ایرادی هم نداره گفتم که ذهنتون رو باز بگذارید بنا به اقتضا نوع برنامه ای که مینویسید یک پارادایم برای خودتون انتخاب کنید حتی این پاردایم‌ها رو گاهی با هم ترکیب کنید و یادتون نره هدف اینه که خودتون راحت باشید، کارتون مرتب باشه و خوش بگذرونید قرار نیست به خودتون سخت بگیرید.خوب اگه از مبحث خوشتون اومد یادتون نره به کانال من سابسکرایب کنید و زنگوله رو بزنید، فردا چهارشنبه‌ست و ویدیوی مربوط به این مطلب رو که توی اون یک برنامه ساده رو سه بار با هر کدوم از این پارادایم‌ها میسازیم آپلود میکنم و با هم خوش میگذرونیم.فعلا بدرود