استخدام السحر سلاسل أو الثوابت في معالجة الترقيم ؟
-
05-07-2019 - |
سؤال
ونحن نفعل الكثير من المفردات تجهيز مع التعسفي السلاسل التي تشمل التعسفي علامات الترقيم.أنا منقسمة حول ما إذا كان استخدام السحر الشخصيات/سلاسل أو رمزية الثوابت.
الأمثلة ينبغي أن قراءة لغة مستقلة على الرغم من أن معظمها جافا.
وهناك أمثلة واضحة حيث علامات الترقيم قد الدلالي دور ينبغي تحديد المستمر:
File.separator
لا "/"
أو "\\"
;// عدم التفكير كما أنها هي التي تعتمد على نظام التشغيل
وأنا أكتب XML_PREFIX_SEPARATOR = ":"
;
ومع ذلك دعونا نقول كنت تحتاج إلى استبدال جميع الأمثلة ""
مع سلسلة فارغة `.أستطيع أن أكتب:
s = s.replaceAll("\"\"", "");
أو
s = s.replaceAll(S_QUOT+S_QUOT, S_EMPTY);
(أنا حددت كل علامات الترقيم الشائعة كما S_FOO (سلسلة) و C_FOO (شار))
لصالح السحر سلاسل/الشخصيات:
- إنها أقصر
- فمن الطبيعي أن قراءة (في بعض الأحيان)
- اسمه الثوابت قد لا تكون مألوفة (
C_APOS
مقابل'\''
)
لصالح الثوابت
- من الصعب أن تجعل الأخطاء المطبعية (مثلا ، على النقيض من
"''" + '"'
معS_APOS+S_APOS + C_QUOT
) - فإنه يزيل الهروب من المشاكل يجب أن يكون regex
"\\s+"
أو"\s+"
أو"\\\\s+"
? - فإنه من السهل أن البحث في كود الترقيم
(هناك حد هذا - أنا لا أكتب 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)
(أو ما يعادل كنت تستخدم).
بهذه الطريقة, سوف لا يكون لديك إجابة على الثوابت, سوف تحصل في الواقع أفضل بكثير من التعامل مع مختلف الحالات الحافة التي ربما لا تفكر الآن