سؤال

لدي بعض الكود الذي يحتوي على نظام ديناميكي في C ++ الذي يحتوي على عضو يسمى GetClassName ()، وهو اسم غير ضار واحد يتصور. ومع ذلك عندما يتم تضمينه في مشروع كبير مع رؤوس Windows، كسر كل الجحيم. على ما يبدو يستخدم Windows GetClassName #Define GetClassName (GetClassnamna Sea أو GetClassNameW) الذي تسليف كل شيء، وأصبحت شجار مكالوتي الافتراضية جميعها تجعلني أخسر يوما في تصحيح التحويل البرمجي الغبي في الظلام، في محاولة لمعرفة ما كان خطأ.

لذلك إلى جانب النقطة التي أقوم بها لجنس Microsoft لاستخدام مثل هذا الاسم من السهل الصدام بشكل فظيع ل # Define (أعني أن شخصا ما يجب أن يتم تصويره بصدق لهذا!) أسأل عن 3 أغراض.

  1. ما اسم جيد آخر ل GetClassName ()؟
  2. هل هناك على أي حال لإصلاح هذا، لذلك في المستقبل، لن يعاني مطورو آخرون في قاعدة التعليمات البرمجية من مصير مماثل
  3. وبالنسبة للأجيال القادمة عندما يواجه شخص آخر هذا خطأ لا يمكن تفسيره بالمثل
هل كانت مفيدة؟

المحلول

أود إعادة تسمية الطريقة.

بالطبع يمكن للمرء أن يقول

#include <windows.h>
#undef GetClassName

لكنه غير نظيف، يجب أن يتذكر المستخدمون من رمز المرء أن يكتبوا :: getclassnamew عند استدعاء وظيفة Win32.

يمكن للمرء توفير GetClassnamea وأساليب GetClassNameW في فصله، لكنه قبيح عادي.

أرى طريقتان: إما إطالة أو تقصير الاسم :)

1) إضافة بادئة لجميع الوظائف في النظام الفرعي، FE TI_ (معلومات النوع):

TI_GetClassName() 
TI_GetBaseClass() 
TI_IsDerivedFromClass()
etc  

2) أو ضعها في بعض واجهة iClass

interface IClass {
GetName();
GetBase(); 
IsDerivedFrom();
etc

وإرجاع هذه الواجهة من طريقة واحدة،
بحيث تصبح GetClassName ()

GetClass()->GetName()

نصائح أخرى

  1. ClassGetName()
  2. #undef GetClassName
  3. Winapi هو API C. لا أعاسب. تحاول بعض المنصات الأخرى تخفيف ذلك من خلال البادئة جميع أسماء الرموز، ولكن في النهاية تسقط أيضا. أفضل رهان: إذا كنت تكتب التعليمات البرمجية التي لا تعتمد على رؤوس Windows Platform SDK، ثم لا #include هم.

getwindowclassname ربما؟ في الواقع GetClassName ليس اسما سيئا لهذا واجهة برمجة التطبيقات الخاصة به لأنه يتعلق بصفات النوافذ. المشكلة الحقيقية هي أنه يعتبر إعلان C و C API و C أية طريقة لإدخال إعلان إعادة استخدامه لا يلوث مساحة الاسم العالمية.

هذا أكثر فاشلا في لغة C من Microsoft.

إن Windows API هو Chock الكامل من وحدات الماكرو بأسماء نظيفة تتوسع إلى أسماء الوظائف مع لاحقة تشير إلى ASCII / UTF-16، معتمدة على خيارات البناء. كان من الجيد أن يكون لطيفا إذا قاموا بادئة كل شيء ب "W32" أو مماثلة (A لا "NS" على نظام التشغيل X)، لكنهم اختاروا عدم الفائيل للحفاظ على API "نظيفة".

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

1) تعلم واجهة برمجة تطبيقات Windows (أنها في الواقع ليست كبيرة!)، أو على الأقل تصبح على دراية MSDN. بحيث يمكنك البحث عن اشتباكات اسم عند مواجه تدفق برنامج لا يمكن تفسيره.

2) استخدم دقة النطاق الصريحة في التعليمات البرمجية حيث يمكنك (MyClass :: GetClassName ()). لسوء الحظ، فإن هذا سيؤدي إلى إيفاد الوظيفة الافتراضية، لذلك كن حذرا مع هذا.

3) استخدم اتفاقية تسمية مختلفة في التعليمات البرمجية الخاصة بك. تستخدم MS دائما Camelcase، حتى لا تصطدم إذا اخترت بعض الاتفاقية الأخرى (get_class_name ()، getclassname ()، إلخ).

4) شخصيا، أنا أكره تسمية my getters و setters "getx ()" و "setx ()"، ولكنه تفضل أن تتكئ على آلية التحميل الزائد واستخدام "XType X () const" للحصول على getters و "void x (xtype newval) "بالنسبة للخضار. قد تختلف الأميال الخاص بك، لكنني أجدها نظافة وأن GET / SET واضح من الحجج. من الواضح أن عليك أن تكون حذرا إذا كنت تستخدم الوسائط الافتراضية.

حظ سعيد!

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