به طور کلی در برنامه نویسی دو رویکرد یا دو الگو برای کدنویسی داریم ، الگوی imperative و declarative. داخل این این مقاله سعی کردم یه مقدار در موردشون توضیح بدم و بعد ازون به یکسری نکات اولیه در مورد functional programming بپردازم.
این الگو بیان میکنه که کدزدن باید به نحوی باشه که برای حاصل شدن یک نتیجه خاص تمام مراحل اون رو قدم به قدم برای برنامه توضیح بدیم. درست مثل دستور پخت غذا. مرحله به مرحله و با جزئیات. مثال زیر رو که با توجه به این الگو نوشته شده درنظر بگیرید.
در این مثال ما یک آرایه داریم که میخوایم یک آرایهی دیگه با عناصر دوبرابر آرایه اول داشته باشم. اگر دقت کرده باشید مرحله به مرحله به برنامه گفتیم چکار کنه. اول اینکه یک متغیر جدید بسازه و اون رو برابر یک آرایه خالی قرار بده. بعد یک حلقه برای اون تعیین کردیم تا به اندازهی طول آرایه اول تکرار بشه و مقادیر آرایه اول رو در ۲ ضرب کنه و در آرایه دوم قرار بده. قشنگ همون طرز پخت غذاس. اول آبو جوش بذار، بعد نمک بریز و بعد فلان کارو بکن تا غذا درست بشه
اما در عوض الگوی declarative میگه که شما باید نتیجهای که میخواید حاصل بشه رو برای برنامه توصیف کنین. درواقع اینطور درنظر بگیرید که الگوی قبلی do to How و این الگو do to What هست. دیگه ما مرحله به مرحله تسکها رو به برنامه امر نمیکنیم. دیگه طرز پختی درکار نیست. فقط غذایی رو که میخوایم توصیف میکنیم.
مثال قبل رو ایندفعه با الگوی declarative نوشتیم.
اینجا اومدیم از متد map استفاده کردیم و درواقع خیلی ساده برای برنامه توضیح دادیم که ما یه آرایه doubled میخوایم که عناصرش دوبرابر آرایه اول باشه.
الگوی declarative یک الگوی محبوب در برنامهنویسی هستش که رفته رفته توسعه پیدا کرده و مفاهیم و زیرالگوهای جدیدی از اون نشأت پیدا کردن که یکی از اونها programming functional هستش. functional programming درواقع بر پایهی این ایدهست که ما برناممون رو تبدیل کنیم به مجموعها ی ازpure function ها که از side effect ها (در ادامه به اینا میپردازیم) جلوگیری میکنن. درواقع programming functional و کدزنی با استفاده از الگوی declarative روش مدرن پیادهسازی برنامه ها در javascript هستش.
حالا بپردازیم به یکسری از مفاهیم اولیه programming functional.
۱) ساید افکت ( side effect ) : اگر داخل یک تابع دیتایی بیرون از تابع رو تغییر بدیم باعث ایجاد effect side شدیم.
۲) پیور فانکشن ( pure furnction ) : توایعی هستند که منجر به ایجاد side effect نمیشن و و همیشه به ازای یک ورودی مشخص یک خروجی مشخص به ما میدن
۳) ایمیوتبیلیتی ( immuability ) : به معنای اینه که state دیتا هیچوقت تغییر نکنه
درعوض state دیتا کپی بشه و تغییرات روی اون کپی انجام بشه و state اصلی دیتا دست نخورده بمونه
حالا چطور برناممون رو بنویسیم که این اصول رو رعایت کنه؟
هیچوقت نمیتونیم ۱۰۰ درصد از side effect ها جلوگیری کنیم ولی یکسری تکنیک هست که میتونیم ازشون کمک بگیریم :
- توابعمون رو به صورتی بنویسیم که فقط یک کار مشخص انجام بدن ( single resposibility ) و دیتای خارج از تابع رو تغییر ندن.
- برای تغییر فرم دیتا از متدهایی مثل filter , map , reduce و ... استفاده کنیم.
همچنین استفاده از این موارد کمک میکنه تا کد برناممون بیشتر از الگوی declarative پیروی کنه :
- destructuring object
- operator spread (...)
- operator ternary ( condition ? do this : do that )
قصد دارم بعدا بصورت مفصل تر در مورد اصول و تکنیکهای functional programming صحبت کنم و فعلا به همین تکات بسنده کنیم. همچنین در مورد اینکه اگر در javascript به صورت OOP برنامهنویسی کردیم چه اصولی رو رعایت کنیم تا کدمون بهتر بشه.
مرسی از اینکه وقت گذاشتید :)