سؤال

أقوم بتصميم خدمة WCF ستعود قائمة الكائنات التي تصف الشخص في النظام.

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

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

المحلول

القليل جدا من النقطة التحول إلى منطق ؛ الذي هو أكبر:

<gender>male</gender> (or an attribute gender="male")

أو

<isMale>true</isMale> (or an attribute isMale="true")

ليس كثيرا في ذلك

عدد السجلات كبير حقًا ...

إذا أصبح عرض النطاق الترددي مشكلة ، و يمكنك التحكم في كلا طرفي الخدمة, ، ثم بدلاً من تغيير كياناتك ، يمكنك النظر في بعض الخيارات الأخرى:

  • قبل ضغط البيانات مسبقًا (على سبيل المثال) GZIP ، وتمرير (بدلاً من ذلك) أ byte[] أو Stream, ، مع ملاحظة تمكين MTOM على الخدمة
  • (أو) التبديل المسلسل ؛ يحتوي ProObuf-Net على خطافات WCF ، ويمكنه تحقيق تحسينات كبيرة في النطاق الترددي على الافتراضي DataContractSerialier (مرة أخرى: تمكين MTOM). في اختبار يستند إلى بيانات NorthWind (هنا) خفضت 736،574 بايت إلى 133،010. و خفض وحدة المعالجة المركزية المطلوبة لمعالجة ذلك (الفوز: الفوز). للحصول على معلومات ، فإنه يقلل من التعدادات إلى الأعداد الصحيحة ، وعادة ما تتطلب بايت واحد فقط لقيمة التعداد و 1 بايت لتحديد الحقل ؛ على النقيض من <gender>Male</gender>, ، والتي تحت UTF8 هي 21 بايت (المزيد لمعظم الترميزات الأخرى) ، أو gender="male" في 14 بايت.

ومع ذلك ، سيقوم أي من التغيير بخرق خدمتك إذا كان لديك المتصلين الخارجيين يتوقعون صابونًا منتظمًا ...

نصائح أخرى

سبب عدم استخدام enum هو أن مخطط XML ليس لديه مفهوم مكافئ لـ enum. أي أنه ليس لديه مفهوم للقيم المسماة. والنتيجة هي أن التعداد لا تترجم دائمًا بين المنصات.

استخدم منطقيًا ، أو حقلًا أحاديًا بدلاً من ذلك.

أقترح عليك أن تصممها بأي طريقة تبدو أكثر طبيعية حتى تواجه مشكلة محددة أو تواجه شرطًا للتغيير.

تم تصميم WCF لتجريد التفاصيل الأساسية ، وإذا كان عرض النطاق الترددي مصدر قلق ، فأعتقد أن Bool أو Int أو Enum سيكونون جميعًا 4 بايت. يمكنك تحسين باستخدام Bitmask أو استخدام بايت واحد.

مرة أخرى ، ربما تكون سهولة استخدام واجهة برمجة التطبيقات والصيانة أكثر أهمية ، ما الذي تفضله؟

if( user[i].Sex == Sexes.Male )

if( user[i].IsMale == true; ) // Could also expose .IsFemale

if( user[i].Sex == 'M' )

وما إلى ذلك بالطبع يمكنك فضح عدة.

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