رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

برنامه نویسی

  • نوشته‌
    7
  • دیدگاه
    2
  • مشاهده
    1,262

مشارکت‌کنندگان این وبلاگ

استفاده از تکنیک بازتاب در ++C با کتابخانه RTTR

فرهاد شیری

50 بازدید

با سلام 

هدف از تدوین این مقاله نحوه استفاده از مفاهیم بازتاب (Reflection)  در نرم افزار های تولید شده با استفاده از زبان ++C می باشد.

همانطور که می دانید کامپایلرهای++C به صورت پیش فرض از مفاهیم بازتاب که در پلت فرم های مدیریت شده مانند #C و Java  وجود دارد پشتیبانی نمیکند. که البته بحث بر سر اینکه چرا توسعه دهندگان استانداردهای ++C از چنین تکنیک هایی استفاده نمیکنند خارج از حوصله این مقاله هست و البته جستجوی مقالات زیادی که راجع به این بخش وجود دارد را هم به خود شما خواننده محترم می سپارم.

کتابخانه RTTR چه مکانیزمی دارد؟

RTTR به معنای بازتاب نوع زمان اجرا است. این قابلیت یک برنامه کامپیوتری را برای درک و تغییر یک شی در زمان اجرا توضیح می دهد. 

هدف از این کتابخانه ارائه راه ساده و بصری برای استفاده از انعکاس در C++ است.

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

تصور کنید زمانی که یک اتصال دایمی دشوار اما همچنین پویا بین ماژول های نرم افزاری مورد نیاز است.

موارد اصلی استفاده از بازتاب برای مثال سریال سازی اشیاء، ایجاد UI، اتصال به زبان های برنامه نویسی دلخواه ، ارتباطات شبکه ، کلاسهای ORM برای کار با دیتابیس ها می باشد.

نحوه استفاده از این کتابخانه 

رجیستر کردن کلاس ها

خواص، متدها و سازنده های خود را در فایل های منبع خود ثبت کنید.

تنظیم رابط کلاس فقط زمانی لازم است که از ارث بری استفاده شود.

#include <rttr/registration>
using namespace rttr;

struct MyStruct { MyStruct() {}; void func(double) {}; int data; };

RTTR_REGISTRATION
{
    registration::class_<MyStruct>("MyStruct")
         .constructor<>()
         .property("data", &MyStruct::data)
         .method("func", &MyStruct::func);
}

استفاده از تکرار گرها در بازتاب

با نوع شی شما می توانید از اعضای قبلا ثبت شده خود پرس و جو کنید.

البته شامل تمامی کلاسهای پایه قبلا ثبت شده نیز خواهد شد.

type t = type::get<MyStruct>();
for (auto& prop : t.get_properties())
    std::cout << "name: " << prop.get_name() << std::endl;

for (auto& meth : t.get_methods())
    std::cout << "name: " << meth.get_name() << std::endl;

استفاده از نوع Constructor برای ساخت اشیاء در زمان اجرا.

از طریق نوع شی یا شیء سازنده می توانید نمونه هایی از نوع خود را ایجاد کنید.

type t = type::get_by_name("MyStruct");
variant var = t.create();    // will invoke the previously registered ctor

constructor ctor = t.get_constructor();  // 2nd way with the constructor class
var = ctor.invoke();
std::cout << var.get_type().get_name();  // prints 'MyStruct'

استفاده از متدهای دسترسی در بازتاب 

به راحتی می توانید در زمان اجرا با بازتاب به فیلدهای عضو کلاس دسترسی داشته باشید.

MyStruct obj;

property prop = type::get(obj).get_property("data");
prop.set_value(obj, 23);

variant var_prop = prop.get_value(obj);
std::cout << var_prop.to_int(); // prints '23'

فراخوانی متدها در زمان اجرا
فراخوانی یک متد مستقیم است.همچنین ممکن است از شی مورد استفاده برای فراخوانی یک متد استفاده شود.

MyStruct obj;

method meth = type::get(obj).get_method("func");
meth.invoke(obj, 42.0);

variant var = type::get(obj).create();
meth.invoke(var, 42.0);

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


  • تشکر شده 1


0 دیدگاه


نظرهای پیشنهاد شده

هیچ دیدگاهی برای نمایش وجود دارد.

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری
  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×