روی خط زندگی

گشت و گذار من در هنر نرم افزار

روی خط زندگی

گشت و گذار من در هنر نرم افزار

۳ مطلب با کلمه‌ی کلیدی «Polymorphism» ثبت شده است

چند ریختی در سطح کلان یعنی ما رفتار مناسب را در هنگام استفاده از یک شی داشته باشیم. یک مثال خوب، عملگر جمع (+) است. مثال های زیر را در نظر بگیرید:

  1. 2+3
  2. ‘a’+’b’
  3. “Hello” + “world”

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

دو شکل از چند ریختی یا همان Polymorphism وجود دارد:

شکل اول) Static Polymorphism

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

Add (int a, int b)

Add  (string a, string b)


شکل دوم) Dynamic Polymorphism

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


۱ نظر موافقین ۰ مخالفین ۰ ۱۰ فروردين ۹۴ ، ۱۹:۴۵
حسین گویا

مفاهیم برنامه نویسی شی گرا یا (Object Oriented Programming (OOP بر محور چهار ایده اصلی بنا شده است. این چهار ایده و مفهوم زیربنایی عبارتند از:

  • انتزاع یا تجرید (Abstraction)
  • چند ریختی (Polymorphism)
  • وراثت (Inheritance)
  • کپسوله سازی (Encapsulation)

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


۰ نظر موافقین ۱ مخالفین ۰ ۰۲ بهمن ۹۳ ، ۲۰:۲۱
حسین گویا

GRASP مخفف General Responsibility Assignment Software Pattern است که همان طور که از نامش پیداست، به مبحث تعیین و توزیع مسئولیت ها بین موجودیت ها می پردازد. مانند اینکه چه کسی وظیفه تولید این اطلاعات را دارد، یا چه کسی مسئولیت نگه داری از اطلاعات را دارد، یا چه کسی باید پیام های ارسالی سیستم را مدیریت کند و مانند آن.


GRASP از نه عدد الگو تشکیل شده است. این نه الگو به ما کمک می کنند تا مسئولیت هر موجودیت در سیستم را تعیین کنیم:

1) Creator

چه کسی مسئول ایجاد یک شی است؟ برای یافتن فردی که این مسئولیت را به وی بدهیم سوالات زیر را می پرسیم:

  • آیا موجودیت این شی، موجودیت شی یا اشیای دیگری را هم ایجاب می کند؟ (همان رابطه Composition در نمودار کلاس ها)
  • آیا کلاسی هست که اطلاعات لازم برای تولید این شی را داشته باشد؟

2) Controller

هیچگاه مستقیما یک عنصر مرتبط با رابط کاربری (UI) را مستقیما به Business Class متصل نکنید (این امر یکی از دلایل افزایش Coupling می باشد). بهتر است یک کلاس Controller در بین آنها قرار دهیم که این دو با واسطه کلاس Controller به هم متصل شوند. الگوی MVC یکی از بهترین نمونه ها برای این مطلب است.


3) Pure Fabrication

اگر دیدید که یک مسئولیت قواره تن هیچ یک از کلاس های موجود نیست، بهتر آن است که یک کلاس جدید بسازیم و مسئولیت را به آن کلاس دهیم، چرا که در صورتی که مسئولیت مورد نظر را به یکی از کلاس های موجود بدهیم، در واقع Cohesion را کاهش داده ایم.


4) Information Expert

مسئولیت را به کسی (کلاسی) بدهیم که اطلاعات لازم برای انجام آن کار را در اختیار دارد.


5) High Cohesion

شاید اگر برای این یکی مثال عکس بزنم راحت تر بتوان توضیح داد، فرض کنید که یک کلاس داریم با تعداد بالایی از Property  ها و Method ها، که این Property ها و Method ها هیچ کاری با هم ندارند و هر کدام برای خودشان کار خود را انجام می دهند. این یعنی Low Cohesion که ناقض اصول طراحی شی گرا، مانند اصل تک مسئولیت ای (Single Responsibility) و God Object Code Smell است.


6) Indirection

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


7) Low Coupling

یعنی ارتباطات بین موجودیت ها را به نحوی کاهش دهیم که کمترین وابستگی را به یکدیگر داشته باشند. این بدان معنی نیست که موجودیت ها نباید هیچ وابستگی به هم داشته باشند، بلکه باید این وابستگی ها را تا حد ممکن کاهش داد.


8) Polymorphism

هر موجودیت، رفتار خودش را با توجه به نوع خود ، به صورت خودکار تعیین و اصلاح کند!


9) Protected Variation

ذات سیستم ها تغییر است. مهم نیست حجم تغییرات چه میزان ست، بلکه مهم آن است که سیستم را در برابر تغییرات ایمن سازی کنیم. اگر اصولی مانند وراثت، یا Open Close Principle (OCP) را رعایت کنیم، می توانیم تغییرات را در سیستم مدیریت کنیم.


۰ نظر موافقین ۱ مخالفین ۰ ۲۸ دی ۹۳ ، ۲۰:۴۳
حسین گویا