سؤال

في الآونة الأخيرة لقد كنت أتحدث مع زميل حول C++ و عبر عن أسفه أنه لم يكن هناك أي وسيلة إلى اتخاذ سلسلة مع اسم فئة الحقل واستخراج الميدان مع هذا الاسم ؛ وبعبارة أخرى ، فإنه يفتقر إلى التفكير.أعطاني نظرة حيرة و طلب عند أي شخص من أي وقت مضى بحاجة إلى أن تفعل مثل هذا الشيء.

من على قمة رأسي لم يكن لدي إجابة جيدة بالنسبة له ، بخلاف "أنا بحاجة إلى أن تفعل ذلك الآن".حتى جلست و جاء مع قائمة ببعض الأشياء التي كنت قد فعلت فعلا مع انعكاس في مختلف اللغات.للأسف معظم من الأمثلة تأتي من برمجة الويب في بيثون ، وكنت آمل أن الناس هنا سيكون لديك المزيد من الأمثلة.هنا قائمة أتيت مع:

  1. نظرا config مع خطوط مثل
    x = "مرحبا العالم!"
    y = 5.0
    تعيين حيوي الحقول من بعض config كائن مساو القيم في هذا الملف.(هذا ما كنت أتمنى أن تفعل في C++, ولكن في الواقع لا تفعل.)

  2. عند فرز قائمة من الكائنات ، الفرز على أساس تعسفي السمة بالنظر إلى أن السمة اسم من ملف التكوين أو طلب ويب.

  3. عند كتابة البرامج التي تستخدم بروتوكول شبكة اتصال, انعكاس يتيح لك استدعاء الأساليب على أساس سلسلة القيم من هذا البروتوكول.على سبيل المثال كتبت IRC bot تترجم
    !some_command arg1 arg2
    إلى استدعاء الأسلوب actions.some_command(arg1, arg2) و الطباعة أيا كانت تلك المهمة عاد إلى المركز القناة.

  4. عند استخدام بايثون __getattr__ وظيفة (الذي هو نوع من مثل method_missing في روبي/Smalltalk) كنت أعمل مع فئة مع الكثير من الإحصاءات ، مثل late_total.كل الإحصائية ، أردت أن تكون قادرا على إضافة _percent للحصول على تلك الإحصائية كنسبة مئوية من إجمالي الأشياء التي كنت أعول (على سبيل المثال, الإحصائيات.late_total_percent).انعكاس جعل هذا من السهل جدا.

لذلك يمكن لأي شخص هنا إعطاء أي أمثلة من البرمجة الخاصة بها تجارب مرات عند انعكاس كانت مفيدة ؟ في المرة القادمة زميل يسأل لماذا كنت "من أي وقت مضى تريد أن تفعل شيئا مثل هذا" أود أن أكون أكثر استعدادا.

هل كانت مفيدة؟

المحلول

أستطيع أن القائمة التالية الاستخدام للتأمل:

  • الربط المتأخر
  • الأمن (التأمل رمز لأسباب أمنية)
  • تحليل رمز
  • ديناميكية الكتابة (بطة الكتابة غير ممكن دون تفكير)
  • Metaprogramming

بعض العالم الحقيقي الأعراف التفكير من تجربتي الشخصية:

  • تطوير نظام المساعد على أساس التفكير
  • تستخدم الجانب المنحى نموذج البرمجة
  • إجراء تحليل رمز ثابت
  • تستخدم مختلف حقن التبعية الأطر
  • ...

التأمل هو شيء جيد :)

نصائح أخرى

لقد استعملت انعكاس على الأسلوب الحالي معلومات عن الاستثناءات, تسجيل, الخ.

string src = MethodInfo.GetCurrentMethod().ToString();
string msg = "Big Mistake";
Exception newEx = new Exception(msg, ex);
newEx.Source = src;

بدلا من

string src = "MyMethod";
string msg = "Big MistakeA";
Exception newEx = new Exception(msg, ex);
newEx.Source = src;

انها مجرد أسهل نسخ/لصق الميراث و رمز جيل.

أنا في الوضع الآن حيث كنت قد دفق XML القادمة عبر السلك وأنا بحاجة إلى إنشاء كيان الكائن الذي سيتم ملء نفسها من عناصر في تيار.فإنه من السهل أن استخدام التفكير لمعرفة أي كيان كائن يمكن التعامل مع أي عنصر XML من أن يكتب عملاق الصيانة-كابوس عبارة شرطية.من الواضح أن هناك تبعية بين مخطط XML وكيف هيكل أسمي الأشياء ، لكن السيطرة على انها ليست مشكلة كبيرة.

هناك الكثير من الأوقات التي تريد بشكل حيوي إنشاء والعمل مع الكائنات حيث نوع غير معروف حتى وقت التشغيل.على سبيل المثال مع أو المخططون أو في الهندسة المعمارية البرنامج المساعد.ساخرا الأطر استخدامها ، إذا كنت تريد أن تكتب تسجيل-مكتبة حيوي تحتاج إلى دراسة نوع و خصائص استثناءات.

إذا فكرت قليلا ربما أستطيع الخروج مع المزيد من الأمثلة.

أجد انعكاس مفيدة جدا إذا كان إدخال البيانات (مثل xml) لديها بنية معقدة بسهولة تعيين وجوه الحالات أو أنا بحاجة إلى نوع من "هو" العلاقة بين الحالات.

كما انعكاس سهلة نسبيا في جاوة ، أنا في بعض الأحيان استخدام بيانات بسيطة (قيمة المفتاح خرائط) حيث لدي صغيرة ثابتة مجموعة من المفاتيح.واحد من جهة انها بسيطة لتحديد ما إذا كان مفتاح صالح (إذا كانت فئة لديها اضع setKey(سلسلة البيانات)) ، من ناحية أخرى لا يمكن تغيير نوع (نصية) إدخال البيانات و إخفاء التحول (هـ.ز بسيطة يلقي الباحث في getKey ()) ، لذلك تبقى من التطبيق يمكن أن تعتمد على كتابتها بشكل صحيح البيانات.إذا كان نوع من بعض قيمة المفتاح زوج التغييرات كائن واحد (مثلا ، شكل الباحث إلى تعويم), لدي فقط إلى تغيير في البيانات وجوه مستخدميها ولكن لا يجب أن نضع في اعتبارنا أن تحقق محلل أيضا.هذا قد لا يكون نهجا معقولا ، إذا كان الأداء قضية...

كتابة المرسلون.الملتوية تستخدم بايثون تعكس قدرات الإرسال XML-RPC و الصابون المكالمات.RMI يستخدم جافا api التفكير في الإرسال.

سطر الأوامر تحليل.بناء التكوين الكائن استنادا إلى معلمات سطر الأوامر التي يتم تمريرها في.

عند كتابة وحدة الاختبارات ، فإنه يمكن أن يكون من المفيد استخدام التفكير ، على الرغم من أن معظمهم لقد استعملت هذا إلى تجاوز معدلات الوصول (جافا).

لقد استعملت التفكير في C# عندما كان هناك بعض داخلية أو طريقة خاصة في إطار أو طرف ثالث المكتبة التي أردت الوصول إليها.

(تنويه:ليس بالضرورة أفضل الممارسات لأن القطاع الخاص و الطرق الداخلية قد تتغير في الإصدارات الأحدث.ولكنها عملت ما احتاجه.)

حسنا, في ثابت كتبته لغات, كنت ترغب في استخدام انعكاس أي وقت كنت بحاجة إلى القيام بشيء ما "ديناميكية".يتعلق الأمر في متناول اليدين بالنسبة الأدوات الأغراض (مسح أعضاء كائن).في جافا انها تستخدم في JMX و وكلاء الديناميكي قليلا جدا.وهناك طن من مرة واحدة الحالات حيث انها الطريقة الوحيدة الذهاب (الى حد كبير في أي وقت كنت بحاجة إلى القيام بشيء ما فإن المترجم لن تسمح لك أن تفعل).

أنا عموما استخدام التفكير من أجل التصحيح.انعكاس يمكن بسهولة أكثر و أكثر دقة عرض الكائنات داخل النظام من مجموعة متنوعة من طباعة البيانات.في العديد من اللغات التي لها وظائف من الدرجة الأولى, حتى يمكنك استدعاء وظائف الكائن دون كتابة رمز خاص.

بيد أن هناك طريقة لفعل ما تريد(ed).استخدام hashtable.متجر مجالات مرتبطا ضد اسم الحقل.

إذا كنت حقا تريد أن ثم إنشاء معيار الحصول على/مجموعة وظائف ، أو إنشاء وحدات الماكرو التي تفعل ذلك على الطاير. #define GetX() Get("X") النوع من الشيء.

حتى يمكن تنفيذ الخاص بك الكمال التفكير بهذه الطريقة.

للمستخدم المتقدم ، إذا كنت تستطيع ترجمة التعليمات البرمجية ، قد يكون من الممكن لتمكين تصحيح إخراج جيل واستخدام ذلك لأداء التفكير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top