خلاصه کتاب Pragmatic Programmer. درس 10

درس10: اُرثوگونالیتی (orthogonality) – (ترجمه لغویشم سنگینه: متعامد، قائم، عمود بر هم)اصل متعامد یک اصل انتقادی است، که به ندرت مستقیم بیان می شود. و البته به صورت ضمنی در برخی از متودولوژی ها و تکنیک ها نهفته است. این اشتباه است که فکر کنیم به محض اینکه این اصل را در سیستم رعایت کردیم، فورا بهبودها در سیستم رخ می دهد.متعامد چیست؟ یک تعریف در علم هندسه است، وقتی دو خط برهم عمود در کنجی به هم میرسند مثل زاویه 90 درجه مثلث قائم الزاویه.در کامپیوتر به نوعی تداعی کننده مفهوم استقلال و جداسازی(decoupling) می باشد. در برنامه نویسی دو یا چند چیز وقتی متعامدن که تغییر در یکی، منجر به تاثیر در تغییر دیگران نشه. در یک سیستم با طراحی خوب، کدهای دیتابیس با یوزراینترفیس متعامدن، یعنی تغییر توی کد دیتابیس نباید تاثیری روی یوای بزاره و بالعکس.قبل از اینکه نگاهی به فواید یک سیستم متعامد بندازیم، بزارید یک مثال از سیستم غیر متعامد بزنیم:فرض کن با یک تور هلیکوپتر به تفریح رفتی، خلبان که برای نهار ماهی زیاد خورده بوده، یهو ناله و بعدم غش میکنه، و شما در ارتفاع بالای صد فیت معلق دور خودتون میچرخید، فک کن که خوشبختانه شب قبلش راجع هلیکوپتر سرچ کردی و تو ویکیپدیا ی چیزایی راجع به پدال و دستگیره کنترل عمودی، افقیش خوندی، میشینی جای خلبان و تو دست راست ی دستگیره کنترل داری زیر پات دو تا پدال و تو دست چپت هم دستگیره کنترل محور عقب، هر کدوم ی وظیفه ای رو دارن و کاملا هم روی هم تاثیر دارن و باید همشونو خیلی حساب شده هندل کنید. امکان نداره خلاف جهت بخای حرکتشون بدی مگر از جونت سیر شده باشی، فرضو بر این میگیرم که تو این داستان گند نزدی و زمینم نشوندی...همونطور که متوجه شدید، سیستم کنترل هلیکوپتر یک سیستم غیر متعامد هستش.دو تا از فواید طراحی سیستم به صورت متعامد افزایش بهره وری و کاهش ریسک هستش.افزایش بهره وری· تغییرات لوکالیزه میشن، در نتیجه تایم توسعه و تست رو پایین میاره. کدهاتونو به کامپوننت های کوچک و مستقل تبدیل میکنید بجای اینکه کامپوننت های واحد بزرگ داشته باشید.· استفاده مجدد، وقتی کامپوننت های مستقل و با یک کارکرد مشخص داشته باشید، میتونید اونها رو در سیستم های دیگه هم رفرنس کنید و استفاده مجدد داشته باشید.کاهس ریسک· قسمت های مریض کد در یک جای ایزوله و کامپوننت مشخص یافت میشن و به راحتی میتونید اونها رو به روز یا جایگزین کنید بدون اینکه به کل سیستم دست بزنید و ایجاد خطا کنید.· از شکنندگی سیستم کم میکنه، در صورتی که در توسعه یا فیکس قسمتی از کد باگی تولید کرده باشید همون قسمت از سیستم لطمه میبینه نه کل سیستمنگاهی به یک سری روش که میتونه کمک کنه به اینکه سیستم متعامد بسازید بندازیم:· طراحیبسیاری از برنامه نویس ها با یکسری مفاهیم که منجر به رعایت اصل متعامد میشه، اشنا هستن، اونها از کلماتی مثل ماژولار، کامپوننت بیس، لایه بندی و ... استفاده میکنن، سیستم باید از یکسری ماژول مستقل تشکیل بشه که مسئولیت هاشونو به صورت کاملا مستقل انجام میدن و این کامپوننت ها به صورت لایه بندی پیاده سازی میشن، این مفهوم لایه بندی یکی از راه های قدرتمند برای رسیدن به سیستم متعامده. لایه ها فقط اینترفیس های همو میبینن و خیلی راحت میتونن به شکلی پیاده سازی بشن که تاثیری روی هم نداشته باشن.· تولکیت و کتابخونه هامیتونیم از ابزارها و کتابخونه هایی که کمک میکنن به متعامد کردن سیستم استفاده کنیم مثلا در جاوا EJB رو داریم انترپرایز جاوا بینز، در سیستم های تراکنش بیس سیستم باید دقیقا استارت و پایان تراکنشها رو مدیریت و رصد بکنه، که با ای جی بی این اطلاعات خارج از اون متودی که قراره تراکنش رو اجرا بکنه مدیریت میشه، ای جی بی یک مثال از پترن دکوریتور هست(decorator pattern)، اضافه کردن قابلیت ها به چیزی، بدون تغییر اون. این استایل کد نویسی حتما لازم به کتابخونه و فریمورک نداره و صرفا یکم رعایت دیسیپلین میخاد حین کد زدن.· کدنویسیوقتی میخاید در بخشی از سیستم کدی بزنید، فقط اون حوزه و ماژولو در نظر نگیرید شاید به صورت لوکالی فکر کنید که دارید تمام اصولو رعایت میکنید ولی از نگاه بالا ممکنه شما یک چیزو تکرار یا قسمتی که از دیدتون کور بوده رو درگیر کنید.- Keep your code decoupledکد خجالتی بنویسید، ماژولی که نیازی نمیبینه اطلاعات اضافه به ماژول های دیگه نشون بده و همچنین وابستگی به پیاده سازی ماژول های دیگه نداره. این بحث دیکاپلینگ رو در درس 28 میگیم مفصل، وقتی لازم دارید استیت ابجکتی رو عوض کنید، جوری بنویسیدش که خودش اونکارو بتونه انجام بده(ینی فانکشنی واسه اینکار براش تعبیه کنید) و از دخالت بیگانگان(میدونم ترجمه سمی بود این تیکه خخخ) بی نیاز باشه.- از دیتاهای گلوبال بپرهیزیدهر زمان که کد شما از گلوبال دیتاها استفاده بکنه بهشون رفرنس داشته باشه، خودش رو مرتبط کرده با تمام کامپوننت هایی که اون دیتا رو استفاده میکنن، حتی گلوبالهایی که فقط به نیت خوندن تعبیه شدن(ریدانلی) هم میتونن مارو تو دردسر بندازن، مخصوصا اوقاتی که کدها میره سمت مولتی تردینگ. پترن سینگلتون هم میتونه بهتون کمک بکنه، در این پترن مدلی پیاده سازی انجام میشه که مطمئنیم فقط و فقط یک اینستنس از یک کلاس وجود داره و ایجاد شده.- از توابع شبیه بهم دوری کنیدممکنه با توابعی مواجه بشید که شباهت زیادی دارن مثلا ورودی و خروجی شون کدهای یکسانی داره و فقط الگوریتم اصلی شون متفاوته، در اینجا باید یک بازنگری به پترنتون داشته باشید و DRY رو هم فراموش نکنید.· تستتست نویسی در یک سیستم متعامد به شدت راحت تره چون شما ماژولها، کامپونتت ها رو مستقل کردید و اینترفیس های بینشونم محدود کردید، خوب این منجر به این میشه که راحت بتونید یونیت تست بنویسید، این خیلی ساده تره تا تست هایی که اینتگریشن ماژولها رو هم لازم و درگیر میکنه. این پروسه تست به عنوان عملیاتی اتوماتیک، مرحله ای از بیلد پروژه باید باشه که در درس 41 راجع بهش میگیم. اگر موقع تست نویسی تو شرایطی قرار گرفتید که برای تست یک ماژول نیاز به ایمپورت ماژولهای زیادی شدید، توی طراحی خودتون شک کنید و حتما بازنگری داشته باشید. توی پروسه باگ فیکسینگ هم فرصت خوبیه که کدتونو بسنجید، شما برای فیکس کردن قسمتی از سیستم، ایا مجبور میشید جاهای دیگه رو هم دستکاری کنید یا فقط همون نقطه کافیه؟· داکیومنشنبه صورت سورپرایز کننده ای این رعایت تعامد توی داکیومنت نویسی هم به دادمون میرسه و قطعا داکیومنت های لوکال و مستقل برای هر کامپوننت یا ماژول خیلی کار و ادبیات راحت تری میخاد تا ماژول های درگیر ...با اصل تعامد زندگی کنیداین اصل بسیار نزدیکه به اصل DRY ، با اصل درای شما سعی میکنی داپلیکیت ها رو کم کنی و از بین ببری، و با تعامد سعی در کاهش عدم استقلال کامپونتتهای سیستم هستید. با رعایت این دو اصل قطعا به سیستم منعطف تر برای توسعه، خوش فهم تر، و راحت تر برای دیباگ و نگهداری میرسید.اگر در یک پروژه دیدی که برنامه نویس ها برای تغییرات درگیری دارند و تغییر در یک قسمت باعث مشکلات و باگ و تلفات در جاهای دیگه سیستم میشه، این پروژه قطعا اصل تعامد رو رعایت نکرده و باید ریفاکتور شه.و در اخر هم یادت باشه اگر خلبان هلیکوپتر هستید، ماهی نخورید...دروس مرتبط: 3, 8, 11, 28, 31, 33, 34, 36منبع کانال تلگرامی: https://t.me/pragmaticprogrammer_fa