سؤال

في فئة Java معينة لتطبيق ويب Struts2 ، لدي هذا السطر من التعليمات البرمجية:

try {
    user = findByUsername(username);
} catch (NoResultException e) {
    throw new UsernameNotFoundException("Username '" + username + "' not found!");
}

يريدني أستاذي أن أغير بيان الرمي إلى شيء مثل هذا:

static final String ex = "Username '{0}' not found!" ;
// ...
throw new UsernameNotFoundException(MessageFormat.format(ex, new Object[] {username}));

لكنني لا أرى الهدف من استخدام MessageFormat في هذا الموقف. ما الذي يجعل هذا أفضل من سلسلة السلسلة البسيطة؟ كما يقول API JDK لـ Messageformat:

يوفر MessageFormat وسيلة لإنتاج رسائل متسلسلة بطريقة محايدة اللغة. استخدم هذا لبناء الرسائل المعروضة للمستخدمين النهائيين.

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

هل يجب أن أقوم بتغيير سطر الكود أو التمسك بالتيار؟

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

المحلول

هل يجب أن أقوم بتغيير سطر الكود أو التمسك بالتيار؟

وفقا لمعلمك يجب عليك.

ربما يريدك أن تتعلم مقاربات مختلفة لنفس الشيء.

بينما في العينة التي قدمتها ، لا معنى لها ، سيكون مفيدًا عند استخدام أنواع أخرى من الرسائل أو لـ I18N

التفكير في هذا:

String message = ResourceBundle.getBundle("messages").getString("user.notfound");

throw new UsernameNotFoundException(MessageFormat.format( message , new Object[] {username}));

يمكن أن يكون لديك messages_en.properties ملف و messages_es.properties

الأول مع السلسلة:

user.notfound=Username '{0}' not found!

والثاني مع:

user.notfound=¡Usuario '{0}' no encontrado!

ثم سيكون من المنطقي.

تم وصف استخدام آخر للرسائل في مستند

 MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
 double[] filelimits = {0,1,2};
 String[] filepart = {"no files","one file","{0,number} files"};
 ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
 form.setFormatByArgumentIndex(0, fileform);

 int fileCount = 1273;
 String diskName = "MyDisk";
 Object[] testArgs = {new Long(fileCount), diskName};

 System.out.println(form.format(testArgs));

الإخراج بقيم مختلفة لـ fileCount:

 The disk "MyDisk" contains no files.
 The disk "MyDisk" contains one file.
 The disk "MyDisk" contains 1,273 files.

لذلك ربما يتيح لك معلمك معرفة الاحتمالات التي لديك.

نصائح أخرى

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

لكني لا أرى الهدف من استخدام messageformat في هذا الموقف

في هذا محدد الوضع لا يشتري لك الكثير. بشكل عام ، يتيح لك استخدام MessageFormat إجراء خارجي من هذه الرسائل في ملف. هذا يتيح لك:

  • توطين الرسائل باللغة
  • قم بتحرير الرسائل في الخارج دون تعديل رمز المصدر

أنا شخصياً أود التمسك بالطريقة المتسلسلة ، لكنها مجرد مسألة تفضيل. يعتقد بعض الأشخاص أنه من النظيف أن تكتب سلسلة مع متغيرات كسلسلة واحدة ، ثم تمرير المعلمة كقائمة بعد السلسلة. كلما زاد عدد المتغيرات التي لديك في السلسلة ، زاد استخدام MessageFormat ، لكن لديك واحدة فقط ، لذلك ليس فرقًا كبيرًا.

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

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

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

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

ميزة واحدة أراها في استخدامها MessageFormat هل هذا عندما تقرر خارجي أوتارك ، سيكون من الأسهل بكثير بناء الرسالة وأيضًا ، من المنطقي رؤية "اسم المستخدم" {0} "لم يتم العثور عليه!" في ملف المورد الخاص بك كسلسلة واحدة يمكن الوصول إليها بواسطة معرف واحد فقط.

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