استخدام السحر سلاسل أو الثوابت في معالجة الترقيم ؟

StackOverflow https://stackoverflow.com/questions/1807348

سؤال

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

الأمثلة ينبغي أن قراءة لغة مستقلة على الرغم من أن معظمها جافا.

وهناك أمثلة واضحة حيث علامات الترقيم قد الدلالي دور ينبغي تحديد المستمر:

File.separator لا "/" أو "\\";// عدم التفكير كما أنها هي التي تعتمد على نظام التشغيل

وأنا أكتب XML_PREFIX_SEPARATOR = ":";

ومع ذلك دعونا نقول كنت تحتاج إلى استبدال جميع الأمثلة "" مع سلسلة فارغة `.أستطيع أن أكتب:

s = s.replaceAll("\"\"", "");

أو

s = s.replaceAll(S_QUOT+S_QUOT, S_EMPTY);

(أنا حددت كل علامات الترقيم الشائعة كما S_FOO (سلسلة) و C_FOO (شار))

لصالح السحر سلاسل/الشخصيات:

  1. إنها أقصر
  2. فمن الطبيعي أن قراءة (في بعض الأحيان)
  3. اسمه الثوابت قد لا تكون مألوفة (C_APOS مقابل '\'')

لصالح الثوابت

  1. من الصعب أن تجعل الأخطاء المطبعية (مثلا ، على النقيض من "''" + '"' مع S_APOS+S_APOS + C_QUOT)
  2. فإنه يزيل الهروب من المشاكل يجب أن يكون regex "\\s+" أو "\s+" أو "\\\\s+"?
  3. فإنه من السهل أن البحث في كود الترقيم

(هناك حد هذا - أنا لا أكتب regexes هذه الطريقة على الرغم من regex جملة واحدة من أكثر معرفيا مختلة أجزاء من جميع البرامج.أعتقد أننا في حاجة إلى أفضل صيغة.)

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

المحلول

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

الاستخدام يمكن أن تبدو مثل هذا:

s = s.replaceAll(CharConfig.Quotation + CharConfig.Quotation, CharConfig.EmtpyString);

نصائح أخرى

العامة معالجة سلسلة, لا استخدام الرموز الخاصة.الفضاء هو دائما ما يكون الفضاء ، و انه من الطبيعي أن قراءة (والكتابة!):

s.replace("String", " ");

من:

s.replace("String", S_SPACE);

وأود أن تأخذ الرعاية الخاصة إلى استخدام أشياء مثل " " لتمثيل علامات, على سبيل المثال, نظرا لأنها لا يمكن بسهولة أن تميز من المساحات في سلسلة.

أما بالنسبة أشياء مثل XML_PREFIX_SEPARATOR أو FILE_SEPARATOR, ربما عليك أن لا تضطر إلى التعامل مع الثوابت مثل ذلك ، حيث يجب استخدام المكتبة للقيام بهذا العمل بالنسبة لك.على سبيل المثال, يجب أن لا تكون الكتابة باليد: dir + FILE_SEPARATOR + filename, وإنما تكون الدعوة: file_system_library.join(dir, filename) (أو ما يعادل كنت تستخدم).

بهذه الطريقة, سوف لا يكون لديك إجابة على الثوابت, سوف تحصل في الواقع أفضل بكثير من التعامل مع مختلف الحالات الحافة التي ربما لا تفكر الآن

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