فصل سوم Clean Architecture - مروری بر پارادایم‌ها

1. مقدمه:سه پارادایم برنامه نویسی که در این قسمت تعریف خواهیم کرد عبارتند از:برنامه نویسی شی گرابرنامه نویسی ساخت‌یافتهبرنامه نویسی تابعیسه پارادایم برنامه نویسی2. برنامه نویسی ساخت‌یافته:اولین روش برنامه نویسی که مورد اقبال عمومی قرار گرفت، برنامه‌نویسی ساخت‌یافته بود که البته اولین روش ابداع شده نبود. این روش توسط دانشمند هلندی آقای ادسخر ویبه دِیکسترا در سال 1968 به جامعه توسعه دهندگان معرفی گردید. آقای دیکسترا نشان داد وجود نامحدود و بدون برنامه دستورات Jump یا همان gotoها در برنامه لطمه بسیار زیادی به ساختار برنامه‌ها وارد می‌کند. در فصل‌ بعدی جزئیات بیشتری در مورد برنامه‌نویسی ساخت‌یافته خواهیم دید اما در اینجا به بیان این نکته اکتفا می‌کنیم که بسیاری از دستورات کنترلی و شرطی و تکرار مانند if, then, else, do, while, until که این روزها بسیار پر استفاده هستند حاصل تلاش‌های این دانشمند فقید برای حذف goto و پیاده سازی ساختاری صحیح در برنامه نویسی است. اگر بخواهیم این روش برنامه نویسی را در یک جمله خلاصه کنیم، می‌توانیم بگوییم:برنامه‌نویسی ساخت‌یافته نظم و انضباط را در انتقال مستقیم کنترل در برنامه‌ها به ارمغان می‌آورد.3. برنامه‌نویسی شی‌گرا:دومین روش برنامه‌نویسی که فراگیر شد، دست بر قضا 2 سال زودتر از روش قبل یعنی در سال 1966 معرفی شده بود. این روش برنامه‌نویسی توسط آقایان اوله-یوهان دال و کریستین نیگارد به جامعه برنامه نویسی معرفی گردید. این برنامه‌نویسان متوجه شدند function call stack frame در زبان ALGOL این قابلیت را دارد که به Heap منتقل شود. با توجه به این شرایط متغیر‌های داخل توابع این اجازه را دارند که بعد از پایان فراخوانی توابع نیز باقی بمانند. در این شرایط توابع تبدیل به سازنده‌های کلاس شدند. متغیر‌های داخل توابع به عنوان Instance variable در نظر گرفته شدند و توابعی که به صورت تو در تو در تابع سازنده تعریف می‌شدند نیز تبدیل به متد‌های کلاس‌ها شدند. با مرتب سازی و دسته بندی توابع به این شکل، رفته رفته مفهوم چند ریختی نیز شکل گرفت. در فصل پنجم به طور کامل این روش توسعه را بررسی خواهیم کرد اما اگر بخواهیم به طور خلاصه پارادایم شی‌گرا را در یک جمله تعریف کنیم به جمله زیر می‌رسیم:برنامه نویسی شی گرا نظم و انظباط را در انتقال غیر مستقیم کنترل به ارمغان می‌آورد.4. برنامه‌نویسی تابعی:سومین روش برنامه‌نویسی که اخیر بسیار مورد توجه قرار گرفته است، اولین روشی بود که به دنیای برنامه‌نویسی معرفی شده است. در واقع ابداع این روش به قبل از دوران برنامه‌نویسی باز می‌گردد. برنامه‌نویسی تابعی حاصل مستقیم تلاش‌های آقای آلونزو چرچ است که در سال 1936 محاسبات لاندا را ارائه کرد. محاسبات لاندا پایه زبان برنامه نویسی LISP که در سال 1958 توسط آقای جان مک کارتی ابداع شد را بنا نهاد. مفهوم بنیادی در محاسبات لاندا تغییرناپذیری (Immutability) است. در این روش گفته می‌شود که مقدار یک نماد تغییر نخواهد کرد. با توجه به این مفهوم می‌توانیم بگوییم "تخصیص دادن" در این روش برنامه‌نویسی بی معنا است. البته اغلب زبان‌های برنامه‌نویسی تابعی دستوراتی را برای تغییر مقدار متغیر‌ها در شرایط خاص در اختیار توسعه دهندگان قرار می‌دهند. برنامه نویسی تابعی نظم و انضباط را در تخصیص مقدار به ارمغان می‌آورد.5. زنگ تفکر:با کمی تفکر متوجه خواهید شد که هریک از این روش‌های برنامه‌نویسی توانایی‌هایی را از دسترس برنامه‌نویسان حذف کرده است. هیچ کدام از این روش‌های برنامه‌نویسی ویژگی جدیدی به داشته‌های توسعه دهندگان اضافه نکرده است. هرکدام از این روش‌ها قواعدی را به سیستم تحمیل کرده تا ویژگی‌هایی که مخالف اهداف آن‌ها است را از دسترس توسعه دهندگان خارج کند. این روش‌های برنامه نویسی بیشتر از اینکه به ما بگویند چه کارهایی انجام دهیم، میگویند چه کارهایی نباید انجام دهیم. اگر به گونه ای دیگر نگاه کنیم، هر کدام از این روش‌های برنامه نویسی توانایی‌های ما را در توسعه کم کرده اند. این سه روش در مجموع goto، function pointer و assignment را از ما گرفته‌اند. با این اوصاف با پیشرفت علم و اضافه شدن روش‌های دیگر آیا چیز دیگری برای ادامه این راه باقی می‌ماند؟به لطف خدا با بررسی شرایط متوجه می‌شویم که در طی دهه 1958 تا 1968 هر سه این روش‌ها به دنیای برنامه‌نویسی معرفی گردید و هرآنچه نیاز بود از برنامه نویسان گرفته شود، گرفته شد. اکنون با گذشت سال‌های بسیار زیاد از آن زمان روش جدیدی به دنیای برنامه نویسی معرفی نشده است.6. خلاصه:شاید با خود فکر کنید معرفی روش‌های برنامه نویسی چه ارتباطی به معماری نرم‌افزار دارد. باید بگویم بسیار مرتبط است. ما از چندریختی به عنوان مکانیزمی جهت عبور از مرز‌های معماری استفاده می‌کنیم. از قواعد برنامه‌نویسی تابعی جهت تعیین محل و نحوه دسترسی به داده‌ها استفاده می‌کنیم و از برنامه نویسی ساخت یافته برای طراحی و پیاده سازی الگوریتم‌های خود استفاده می‌کنیم. دقت کنید که چطور این سه مفهوم و روش برنامه‌نویسی پاسخی به سه نگرانی بزرگ هنگام معماری می‌دهند: چگونگی عملکرد، جدا بودن اجزا و مدیریت داده‌ها.در سه فصل آینده به شرح و بسط کاملتری از این سه روش برنامه‌نویسی خواهیم پرداخت.