Developing.OO.Orthogonality

ترجمه ی http://www.artima.com/intv/dry3.html

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

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

این همون اتفاقیه که توی کد برنامه میفته. همه مون تا حالا روی سیستمهای این مدلی کار کردیم. که یه تغییر کوچیک روی این ور برنامه، چند تا مشکل اون ور برنامه درست کنه. میری اون ورو درست کنی، باز چند تا مشکل یه جای دیگه درست میشه. و بخاطر یه تغییر باید یکسره با Error ها قایم موشک بازی کنی و بنظر میاد که اصلاحشون هیچ وقت تموم نمیشه.

اگه سیستمتون، Orthogonal (متعامد) نباشه و اجزای سیستم، بیش از حد نیاز با هم در تعامل باشن، همیشه درگیر این مدل Debugging پخش و پلا خواهید بود.

نکته جالبش اینه که من (Dave Thomas) خلبان هلیکوپتر نیستم و واسه اینکه مطمئن شم از مثالی که آوردم، این مطلب رو واسه ی یه خلبان واقعی فرستادم تا نظرشو بدونم. و نوشتم:
"این چیزیست که قصد دارم راجع به کنترلهای هلیکوپتر بنویسم. آیا درست است؟"
و خلبان هلیکوپتر به من ایمیل زد:
"چیزیو که راجع به کنترل هلیکوپتر نوشتید، خوندم.
تمام شب خوابم نبرد."

3 comments:

  1. but object oriented design patterns solve the problem to great deal, right?

    ReplyDelete
  2. Salaam :)

    Man kheili az neveshtehaye in webloget khosham miyaad :)

    ReplyDelete
  3. to shabnam: thanks:)

    to anonymous: without the help of OO it's almost impossible to provide orthogonality, however using an object oriented design itself does not guaranty a fully orthogonal design.

    ReplyDelete