روی خط زندگی

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

روی خط زندگی

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

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

در بسیاری از اوقات، برنامه نویسان و توسعه دهندگان، تنها تفاوت بین Interface و abstract class را در این می دانند که یک Interface پیاده سازی ندارد ولی abstract class می تواند رفتار ها یا در واقع متد ها را پیاده سازی کند. اما این تنها تفاوت این دو نیست و به واقع این دو از نقطه نظر ماهیت با هم تفاوت دارند و نه پیاده سازی.


وقتی یک کلاس از یک Interface ارث بری می کند، در واقع به مانند آن است که یک قرارداد را امضا می کند. کلاس با ارث بری از این Interface به ما تضمین می دهد که متد های آن را من پیاده سازی خواهم کرد و این یعنی من این رفتار ها را دارم. بدین جهت است که اگر به اسم Interface ها دقت کرده باشید، عموما به able، Provider و مانند آن ختم می شوند، مانند ICloneable . حتی آن کاراکتر «I» که در ابتدای این نام می آید اذعان می کند که من می توانم! یا من فراهم می کنم!

در مستندات راهنمای مایکروسافت، برای نام گذاری Interface ها توصیه شده که از نام ها، اصطلاحات یا صفت هایی استفاده شود که بیان کننده رفتاری باشد که آن Interface به کلاس ها القا می کند.


و اما abstract class.

وقتی به یک مفهوم از دیدگاه abstraction نگاه می کنیم، نتیجه آن پیاده سازی آن مفهوم در قالب یک abstract class است. در واقع یک abstract class مفهوم مجازی یک واقعیت است. مفهومی که ممکن است در دنیای واقعی وجود مستقیم نداشته باشد ولی کلاس هایی که از آن به ارث می روند در دنیای واقعی وجود دارند. مثلا وقتی می گوییم «نمایش دهنده» یک مفهوم مبهم به ذهن متبادر می شود و نه یک تصویر مشخص. ولی در دنیای واقعی اشیایی هستند که ماهیت این مفهوم را در خود دارند، مانند تلویزیون یا مانیتور کامپیوتر. برای همین به کلاس هایی که از یک abstract class ارث بری می کنند می گوییم: concrete class یعنی کلاس های واقعی! 


در واقع اگر بخواهیم در روابط ارث بری از دیدگاه کلاس پدر به مساله نگاه کنیم، به لحاظ ماهیتی، یک interface یک مجموعه رفتار مرتبط را به اشتراک می گذارد مانند IPrintable ولی یک abstract class یک مفهوم مجازی را به ما عرضه می کند مانند Person.

و اگر بخواهیم از دیدگاه فرزندان به مساله نگاه کنیم، کلاس هایی که از یک Interface ارث بری می کنند، در واقع می گویند ما می توانیم فلان کار را انجام دهیم یا ما این رفتار را با خود به همراه داریم و کلاس هایی که از یک abstract class ارث بری می کنند به ما می گویند ما پیاده سازی واقعی یک مفهوم مجازی هستیم.

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

مفهوم Abstraction یا همان انتزاع دیدگاهی انتزاعی به اشیا یا همان Object های می باشد. در دنیای واقعی وقتی می گوییم میز، یک انتزاع کلی از مفهوم میز به ذهن متبادر می شود. کلمه میز لزوما تصویر خاصی از یک میز در ذهن نمی سازد ولی وقتی می گوییم میز ناهارخوری، برای هر شخص با مقتضیات فکری که دارد یک تصویر از یک میز نهارخوری که احتمالا آن را در خانه دارد یا در جایی مشاهده کرده در ذهن ساخته می شود.

در دنیای مجازی ما، Object ها نمونه هایی از یک Class هستند. در واقع کلاس ها دیدگاه های انتزاعی به یک شی می باشند. توجه داشته باشید که در مورد مفهوم انتزاع یا Abstraction صحبت می کنیم و نه در مورد abstract class (در واقع abstract class ها خود دیدگاهی انتزاعی از یک class می باشد که در ادامه راجعه به آن هم صحبت می کنیم)

مثلا کلاسی که برای مدیریت یک حساب بانکی است حاوی اطلاعاتی به مانند زیر است:


کلاس حساب بانکی (مثلا بانک ملت) :

  • صفت ها (attributes)
    • شماره حساب
    • نام صاحب حساب
    • موجودی
    • نوع حساب (جام، کوتاه مدت، طلایی)
  • رفتار ها (behaviors)
    • افزایش موجودی
    • کاهش موجودی
    • افتتاح حساب
    • بستن حساب

کلاس حساب بانکی، یک مفهوم انتزاعی از حساب بانکی افراد (مثلا حساب بانکی موسسه خیریه کهریزک) می باشد. در واقع اینجا مشخص نیست که شماره حساب چند است و صاحب حساب کیست. این یعنی ما یک کلاس برای حساب بانکی احمد و یک کلاس برای حساب بانکی محمود ایجاد نمی کنیم، بلکه یک کلاس برای حساب بانکی ایجاد می کنیم.

وقتی از منظر انتزاعی یا Abstraction به اشیا و مسائل نگاه می کنیم به این معنی است که:
  • به چیز های ضروری و اساسی دقت می کنیم.
  • از جزییات و موارد بی ربط به اساس مساله پرهیز می کنیم.
در بسیاری از مصاحبه های استخدامی که تاکنون با برنامه نویسان مختلف انجام داده ام وقتی می پرسم: abstraction چیست؟ می گویند: «کلاسی است که هیچ پیاده سازی ندارد.». این در حالی است که تاکید می کنم که اولا ما در حوزه مفاهیم صحبت می کنیم و نه در حوزه پیاده سازی، دوما abstraction مفهومی است که abstract class از آن نشئت می گیرد و این دو را با هم اشتباه نگیرید. برای روشن تر شدن کمی به abstract class بپردازیم تا تفاوت آن با مفهوم abstraction مشخص شود.

فرض کنید در همان مثال حساب بانکی، بخواهیم یک موجودیت انتزاعی تر از این کلاس خلق کنیم که وابستگی به یک بانک خاص نداشته باشد. برای این منظور می بایست دیدگاه انتزاعی خود را یک پله ارتقا دهیم و آنچه که موجب وابستگی این کلاس به یک بانک خاص می باشد (در این مثال نوع حساب که ممکن اسن برای هر بانک متفاوت باشد) را حذف می کنیم و موجودی به نام abstract class را با توجه به موجودیت کلاس قبلی ایجاد می کنیم.

با توجه به این مطلب، پر واضح است که abstraction مفهومی است که abstract class بواسطه آن ایجاد می شود و نباید این دو را معادل هم گرفت.
۹ نظر موافقین ۱ مخالفین ۰ ۰۹ بهمن ۹۳ ، ۲۱:۰۰
حسین گویا