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

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

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


توی ویدیو ایونت یکسری مقالات و کتاب ها آورده بودم که در آخر لینک هارو قرار میدهم.
جلسه بعد در مورد Pure Function صحبت خواهیم کرد، تمامی جلسات از لینکدین و یوتوب در دسترس هست و همه جلسات به صورت لایو هستند و پرسش و پاسخ هارو مثل همیشه داریم.
تا دیدار بعدی موفق باشید.