انتزاع داده (Data Abstraction) در ++C

منظور از چکیده‌سازی داده فراهم کردن حداقل اطلاعات برای دنیای خارج و مخفی‌سازی جزئیات پس زمینه است، یعنی اطلاعات مورد نیاز بدون ارائه جزئیات نمایش داده می‌شود.

چکیده‌سازی داده یک تکنیک برنامه‌نویسی و طراحی است که مبتنی بر جداسازی رابط میانجی (interface) از پیاده‌سازی (implementation) می‌باشد.

اجازه دهید با یک مثال از زندگی واقعی ادامه دهیم، یک تلویزیون را تصور کنید که می‌توان آن را روشن یا خاموش کرد، کانال را عوض کرد، صدا را تنظیم کرده و اجزای خارجی مانند بلندگو، VCR و پخش کننده DVD را به آن متصل کرد، اما شما از جزئیات درونی آن هیچ اطلاعی ندارید، یعنی اطلاع ندارید که چگونه سیگنال‌ها را از کابل یا هوا دریافت کرده، چگونه این سیگنال‌ها را منتقل می‌کند و در نهایت بر روی صفحه نمایش می‌دهد.

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

در ++C، کلاس‌ها سطح بالایی از چکیده‌سازی داده را فراهم می‌کنند. این کلاس‌ها توابع عمومی‌ کافی را برای دنیای خارج از خود فراهم کرده تا قابلیت‌های اشیا نمایان شده و امکان دستکاری داده‌های شی مثل وضعیت (state)، بدون اطلاع از نحوه‌ی پیاده‌سازی درونی کلاس فراهم گردد.

مطلب پیشنهادی:  وراثت در ++C

برای مثال، برنامه شما می‌تواند برای مرتب‌سازی، تابع ()sort را بدون اطلاع از الگوریتم به کار رفته در آن فراخوانی کند. در حقیقت، پیاده‌سازی پشت پرده این تابع مرتب‌ساز، با انتشار نسخه‌های کتابخانه آن ممکن است تغییر کند، اما تا زمانی‌که رابط آن ثابت بماند، فراخوانی تابع شما کماکان کار می‌کند.

در ++C از کلاس‌ها  برای تعریف چکیده‌سازی نوع داده (Abstract Data Type- ADT) استفاده می‌شود. می‌توان از شی cout از کلاس ostream برای استریم کردن داده به خروجی استاندارد استفاده کرد، مانند مثال زیر:

#include <iostream>
using namespace std;

int main() {
   cout << "Hello C++" <<endl;
   return 0;
}

در اینجا، نیازی نیست که بدانید cout چگونه متن را روی صفحه نمایش نشان می‌دهد. تنها چیزی که باید بدانید رابط عمومی ‌آن است و بنابراین هیچ محدودتی برای تغییر در پیاده‌سازی پشت پرده cout بوجود نمی‌آید.

برچسب‌های دسترسی (Access Label) منجر به چکیده‌سازی می‌شود

در ++C، با استفاده از برچسب‌های دسترسی برای یک کلاس رابط چکیده تعریف می‌کنیم. یک کلاس می‌تواند تعدادی برچسب دسترسی داشته باشد یا هیچ برچسبی نداشته باشد.

  • اعضای تعریف شده در یک کلاس با برچسب عمومی ‌از همه بخش‌های برنامه قابل دسترسی هستند. نمای چکیده شده یک نوع داده از طریق اعضای عمومی‌اش تعریف می‌شود.
  • اعضای تعریف شده در یک کلاس با برچسب خصوصی، برای کدهای استفاده کننده قابل دسترسی نیستند. بخش‌های خصوصی کلاس، پیاده‌سازی آن را از دید کاربران مخفی می‌کند.
مطلب پیشنهادی:  Overloading عملگر و تابع در ++C

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

مزایای چکیده‌سازی داده

چکیده‌سازی داده دو مزیت مهم مهیا می‌سازد.

  • بخش‌های درونی کلاس را از اشتباهات سهوی کاربر، که منجر به خراب کردن وضعیت شی شود در امان نگه می‌دارد.
  • پیاده‌سازی تابع در طول زمان و در پاسخ به مقتضیات یا گزارش خرابی‌ها ممکن است تکامل پیدا کند.

با تعریف داده‌های عضو در بخش‌های خصوصی کلاس، نویسنده کلاس برای تغییر در داده‌ها آزادی عمل پیدا می‌کند. اگر پیاده‌سازی تغییر کند، برای مشاهده تاثیرات این تغییر، تنها کافی است که کد کلاس آزمایش شود. اگر داده‌ها عمومی‌ باشند، آنگاه ممکن است هر تابعی که مستقیماً به این داده‌های عضو دسترسی دارد  نیز از کار بیفتد.

مثال چکیده‌سازی داده

هر برنامه ++Cای که یک کلاس را با اعضای خصوصی و عمومی ‌پیاده‌سازی کند، نمونه ای از چکیده‌سازی داده می‌باشد. مثال زیر را ملاحظه کنید.

#include <iostream>
using namespace std;

class Adder {
   public:
      // constructor
      Adder(int i = 0) {
         total = i;
      }
      
      // interface to outside world
      void addNum(int number) {
         total += number;
      }
      
      // interface to outside world
      int getTotal() {
         return total;
      };
      
   private:
      // hidden data from outside world
      int total;
};

int main() {
   Adder a;
   
   a.addNum(10);
   a.addNum(20);
   a.addNum(30);

   cout << "Total " << a.getTotal() <<endl;
   return 0;
}

با اجرای کد فوق، خروجی زیر حاصل می‌شود.

Total 60

 کلاس بالا دو عدد را باهم جمع کرده و حاصل جمع را برمی‌گرداند. اعضای عمومی، addNum و getTotal رابط‌های میانجی به دنیای خارج از کلاس بوده و کاربر برای استفاده از کلاس باید با آنها آشنا شود. عضو خصوصی total چیزی است که کاربر نیازی به آشنایی با آن ندارد، اما برای عملکرد صحیح کلاس ضروری است.

مطلب پیشنهادی:  اورلود کردن عملگر دسترسی کلاس (->) در ++C

استراتژی طراحی

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

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

منبع: ترجمه از سایت tutorialspoint.com

در جلسه بعدی آموزش ++C با ما همراه باشید.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *