Anophel-آنوفل برنامه نویسی Functional در مقابل برنامه نویسی شی گرا OOP

برنامه نویسی Functional در مقابل برنامه نویسی شی گرا OOP

انتشار:
3
0

دو مورد از رایج ترین پارادایم های (رویکرد های) برنامه نویسی مورد استفاده برنامه نویسی شی گرا و برنامه نویسی Functional است.

پس از مطالعه چندین مقاله از داده های موجود به صورت آنلاین، ممکن است هنوز دلیلی برای استفاده از برنامه نویسی Functionalنسبت به برنامه نویسی شی گرا یا برعکس پیدا نشود! پاسخ این است که این یک ترجیح شخصی بیشتر از این است که این سوال باشد که کدام یک بهتر از دیگری است؟ بیایید در هر دو به اندازه کافی عمیق شویم تا خودمان انتخاب کنیم!

ساختار خوب مشخصه کدهای خوب نوشته شده است. ماهیت این ساختار با پارادایم برنامه نویسی مورد استفاده تعیین می شود. پارادایم برنامه نویسی مجموعه ای منسجم از اصول و تکنیک ها است که رویکرد اتخاذ شده در هنگام طراحی و کدگذاری برنامه های کامپیوتری را تعریف می کند.

پارادایم های برنامه نویسی زیادی مانند رویه ای، امری، اعلامی، شی گرا و Functional وجود دارد. برخی از زبان ها تنها به چند پارادایم محدود می شوند. به عنوان مثال، SQL زبانی است که یک زبان اعلامی است. با این حال، بسیاری از زبان‌های مدرن، از جمله پایتون، PHP از چندین پارادایم برنامه‌نویسی پشتیبانی می‌کنند که امکان انعطاف‌پذیری را فراهم می‌کند.

بسیاری از برنامه نویسان به طور پیش فرض از یک الگوی برنامه نویسی ترجیحی استفاده می کنند، که اغلب آن را ابتدا یاد گرفته اند. برنامه نویسان پیشرفته تر مزایا و نقاط ضعف این پارادایم های برنامه نویسی را درک می کنند و می توانند از هر یک از نقاط قوت آنها در سناریوهای مختلف استفاده کنند. بیایید به دو مورد از رایج ترین الگوهای برنامه نویسی مورد استفاده بپردازیم: برنامه نویسی Functional و برنامه نویسی شی گرا (OOP).

برنامه نویسی Functional چیست؟

برنامه نویسی Functional شکلی از برنامه نویسی است که سعی می کند از تغییر وضعیت و داده های قابل تغییر جلوگیری کند. در یک برنامه Functional، خروجی یک تابع باید همیشه یکسان باشد، با توجه به ورودی های دقیق یکسان برای تابع.

این به این دلیل است که خروجی های یک تابع در برنامه نویسی Functional صرفاً به آرگومان های تابع متکی است و هیچ جادویی که در پشت صحنه اتفاق می افتد وجود ندارد. به این می گویند از بین بردن side effects در کد شما.

برای مثال، اگر تابع ()getSum را فراخوانی کنید، مجموع دو ورودی را محاسبه کرده و مجموع را برمی گرداند. با توجه به ورودی های یکسان برای x و y، ما همیشه خروجی یکسانی را برای مجموع خواهیم داشت.

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

برنامه نویسی Functional مزایایی مانند کارایی، ارزیابی lazy، توابع تو در تو، کد بدون باگ، برنامه نویسی موازی را ارائه می دهد. به زبان ساده، برنامه نویسی Functional عبارت است از نوشتن تابع دارای دستوراتی برای اجرای یک کار خاص برای برنامه. هر تابع کوچک قسمت خود و فقط قسمت خود را انجام می دهد. تابع را می توان به راحتی در هر نقطه فراخوانی و مجددا استفاده کرد. همچنین به مدیریت کد کمک می کند و نیازی به نوشتن دوباره و دوباره همان چیز یا عبارات نیست. این امکان ایجاد کدهای بسیار ماژولار و تمیز را فراهم می کند که همه در هماهنگی با هم کار می کنند.

OOP (برنامه نویسی شی گرا) چیست؟

برنامه نویسی شی گرا یک الگوی برنامه نویسی است که در آن شما با استفاده از اشیاء برنامه ریزی می کنید تا چیزهایی را که در مورد آنها برنامه نویسی می کنید نمایش دهید (گاهی اوقات مواردی از دنیای واقعی). این اشیاء می توانند ساختار داده باشند. اشیاء داده های مربوط به خود را در ویژگی ها (properties) نگهداری می کنند. ویژگی های موجود در اشیا از طریق متد ها یا توابعی که به شی داده می شود دستکاری می شوند.

به عنوان مثال، ممکن است یک شی Person داشته باشیم که نشان دهنده تمام داده هایی است که یک فرد دارد: وزن، قد، رنگ پوست، رنگ مو و غیره. اینها صفات خواهند بود. سپس شی شخص دارای کارهایی است که می تواند انجام دهد مانند: جعبه را بردارید، جعبه را پایین بگذارید، بخورید، بخوابید، و غیره. اینها متد هایی هستند که با داده هایی که شی ذخیره می کند بازی می کند.

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

مقیاس پذیری دو پارادایم (برنامه نویسی شی گرا (OOP) و برنامه نویسی تابعی (FP)

هر دو پارادایم برنامه نویسی شی گرا (OOP) و برنامه نویسی تابعی (FP) را می توان برای نوشتن کدهای مقیاس پذیر استفاده کرد، اما وقتی صحبت از مقیاس پذیری به میان می آید، رویکردها و مبادلات متفاوتی دارند.

OOP بر اساس مفهوم اشیا است که می تواند برای مدل سازی دامنه مشکل استفاده شود و اغلب برای ایجاد سیستم های بزرگ و پیچیده استفاده می شود. OOP امکان ایجاد کد قابل استفاده مجدد را با استفاده از وراثت و چندشکلی فراهم می کند که می تواند به کاهش مقدار کد و افزایش مقیاس پذیری سیستم کمک کند. با این حال، OOP می‌تواند در مورد مقیاس‌پذیری نیز دارای معایبی باشد، مانند کلاس‌های بهم پیوسته، سلسله مراتب کلاس‌های پیچیده، و استفاده از حالت جهانی، که می‌تواند درک، آزمایش و نگهداری کد را سخت‌تر کند.

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

هر دو OOP و FP را می توان برای ایجاد کدهای مقیاس پذیر استفاده کرد، اما آنها مبادلات متفاوتی دارند. OOP برای ایجاد سیستم های بزرگ و پیچیده مناسب تر است، در حالی که FP برای ایجاد اجزای کوچک و قابل استفاده مجدد مناسب تر است. انتخاب پارادایم مناسب برای مشکل مورد نظر و اعمال بهترین شیوه ها و الگوهای طراحی برای افزایش مقیاس پذیری بسیار مهم است.

مقایسه معایب و مزایای برنامه نویسی Functional و OOP

معایب برنامه نویسی Functional برای نزدیک شدن به کد شما از نقطه نظر Functional، واقعاً ذهنیت متفاوتی لازم است. فکر کردن با عبارات شی گرا آسان است، زیرا شبیه به نحوه اتفاق افتادن شیء مدل سازی شده در دنیای واقعی است. برنامه نویسی Functional همه چیز در مورد دستکاری داده ها است. تبدیل یک سناریوی دنیای واقعی به داده‌ها می‌تواند به تفکر بیشتری نیاز داشته باشد.

به طور مشابه، چند مشکل در برنامه نویسی شی گرا وجود دارد. اولاً، شناخته شده است که قابل استفاده مجدد نیست. از آنجایی که برخی از توابع شما به کلاسی که از آنها استفاده می کند بستگی دارد، استفاده از برخی از توابع با کلاس دیگر دشوار است. همچنین مشخص است که معمولاً کارایی کمتری دارد و پرداختن به آن پیچیده تر است. بسیاری از اوقات، برخی از طرح های شی گرا برای مدل سازی معماری های بزرگ ساخته می شوند و می توانند بسیار پیچیده باشند.


مزایای OOP

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

معایب OOP

OOP می تواند منجر به کدهایی شود که پرمخاطب تر و پیچیده تر است، که می تواند درک و نگهداری آن را دشوارتر کند.
تاکید OOP بر تغییر وضعیت اشیا می تواند منجر به کدهایی شود که استدلال و آزمایش آنها سخت تر است.
استفاده زیاد OOP از side effects و تغییرات حالت می تواند استدلال در مورد ترتیب اجرای کد را دشوارتر کند.
اتکای OOP به حالت اشتراکی می تواند نوشتن کد همزمان و موازی را دشوارتر کند.
 

مزایای FP

FP استفاده از تغییرناپذیری را ترویج می‌کند، که به جلوگیری از تغییرات ناخواسته در داده‌ها کمک می‌کند و کد را قابل پیش‌بینی‌تر و قطعی‌تر می‌کند.
تمرکز FP بر توابع به عنوان شهروندان درجه یک می تواند کد را ماژولارتر، قابل استفاده مجدد و آزمایش آسان تر کند.
استفاده FP از توابع بازگشتی و مرتبه بالاتر می‌تواند نوشتن کد ظریف و رسا را آسان‌تر کند.
تاکید FP بر شفافیت ارجاعی می تواند استدلال در مورد رفتار کد را آسان تر کند.
 

معایب FP

FP می تواند به کدهایی منجر شود که درک آن پیچیده تر و سخت تر است، به خصوص برای توسعه دهندگانی که با مفاهیم برنامه نویسی کاربردی آشنا نیستند.
تمرکز FP بر تغییر ناپذیری می‌تواند آن را در سناریوهای خاص، مانند هنگام کار با مجموعه داده‌های بزرگ، کارآمدتر کند.
استفاده زیاد FP از بازگشت می‌تواند نوشتن کد همزمان و موازی را سخت‌تر کند.
استفاده FP از توابع و بسته های مرتبه بالاتر می تواند استدلال در مورد رفتار کد را دشوارتر کند.

چه زمانی از برنامه نویسی شی گرا یا Functional استفاده کنیم؟

برخی از زبان های برنامه نویسی فقط یک پارادایم خاص را مجاز می دانند. به عنوان مثال، Haskell طبق تعریف یک زبان برنامه نویسی تابعی است زیرا حالت آن نمی تواند تغییر کند. دیگر زبان های برنامه نویسی در درجه اول تابعی بودن عبارتند از #Lisp، F و Erlang. برخی از زبان‌های OOP یا زبان‌هایی که بیشتر به سمت پارادایم شی گرا متمایل هستند، جاوا، سی شارپ و سی پلاس پلاس هستند. چندین زبان برنامه نویسی مانند TypeScript و PHP چند پارادایم هستند و تا حدی از برنامه نویسی OOP و تابعی پشتیبانی می کنند. این زبان ها دارای مجوزهای خاصی برای استفاده از توابع خالص و اشیاء تغییرناپذیر به میل توسعه دهنده هستند.

پایتون یکی از محبوب‌ترین زبان‌ها است و نشان‌دهنده سطح میانی در این طیف از تغییرپذیر به غیرقابل تغییر یا شی گرا به تابعی است. پایتون دارای انواع داخلی است که تغییر ناپذیر هستند: رشته ها، اعداد و بولی ها، به نام چند. کلاس‌های سفارشی در پایتون، معمولاً داده‌های قابل تغییر هستند. با زبانی مانند پایتون، تقریباً به طور کامل به برنامه نویس بستگی دارد که در درجه اول از چه پارادایم استفاده می کند.

OOP در حال حاضر پارادایم مورد استفاده اکثر توسعه دهندگان است، بیشتر برای دسترسی به آن. برنامه نویسی Functional برای سمت سرور برنامه ها، دستکاری داده ها و خزیدن وب عالی است. به عنوان مثال، تمام فیلترهای اسپم فیس بوک با استفاده از برنامه نویسی Functional در Haskell ساخته شده است. در بیشتر موارد، هیچ پاسخ روشنی در مورد اینکه کدام پارادایم در آموزش و حرفه توسعه نرم‌افزار شما بهترین خدمت را خواهد داشت، وجود ندارد. مهندسان نرم افزار خوب از تکنیک ها و عاداتی استفاده می کنند که می تواند هم برای برنامه نویسی شی گرا و هم برای برنامه نویسی Functional تجویز شود.

حتی اگر اصولاً در یک محیط OOP کدنویسی می‌کنید، می‌تواند برای پیاده‌سازی برخی از محدودیت‌های برنامه‌نویسی Functional مفید باشد. با انجام این کار، ممکن است متوجه شوید که کد شما واضح تر است و اشکال زدایی آن آسان تر است. یکی از بزرگترین موانع برای ایجاد یک API موثر و با استفاده آسان، کدهای تکراری است، بنابراین یادگیری و تمرین مفاهیم برنامه نویسی Functional در حال حاضر ممکن است در آینده سودمند باشد.

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

نتیجه

زبان‌های شی‌گرا زمانی خوب هستند که مجموعه‌ای از عملیات ثابت روی چیزها داشته باشید، و با تکامل کدتان، در درجه اول چیزهای جدیدی اضافه می‌کنید. این را می توان با افزودن کلاس های جدید که متدهای موجود را پیاده سازی می کنند، انجام داد و کلاس های موجود به حال خود رها می شوند.

زبان‌های Functional زمانی خوب هستند که مجموعه‌ای ثابت از چیزها داشته باشید، و با تکامل کدتان، در درجه اول عملیات جدیدی را روی چیزهای موجود اضافه می‌کنید. این را می توان با افزودن توابع جدید که با انواع داده های موجود محاسبه می شود، انجام داد و توابع موجود به حال خود رها می شوند.

به بیان ساده، وقتی در مرزهای مختلف کار می کنید، OOP یک روش عالی برای بسته بندی و ایمن نگه داشتن همه چیز از استفاده خارجی ناخواسته است. از آنجایی که به عنوان، برنامه نویسی Functional زمانی که پیچیدگی وجود دارد به خوبی کار می کند.

هم برنامه نویسی Functional و هم برنامه نویسی شی گرا از روش های متفاوتی برای ذخیره و دستکاری داده ها استفاده می کنند. در برنامه نویسی تابعی، داده ها را نمی توان در اشیاء ذخیره کرد و تنها با ایجاد توابع می توان آنها را تبدیل کرد. در برنامه نویسی شی گرا، داده ها در اشیا ذخیره می شوند. برنامه نویسی شی گرا به طور گسترده توسط برنامه نویسان استفاده می شود و همچنین موفقیت آمیز است.

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

در نهایت، برای نتیجه گیری، همیشه بر عهده برنامه نویسان یا توسعه دهندگان است که مفهوم زبان برنامه نویسی را انتخاب کنند که توسعه آنها را سازنده و آسان می کند.

#برنامه_نویسی_تابعی#برنامه_نویسی_شی_گرا#oop#FP#Functional_programming
نظرات ارزشمند شما :
Loading...