سؤال

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

حتى قبل بضعة أسابيع, كنت ببساطة قد صفي استدعاء الزائفة البرمجية التالية في مكان ما:

     PermissionManager.getInstance().isReadPermissionEnabled(this)

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

لذا يجب أن تتطلب فعلا API للمستخدمين تمر في PermissionManager سبيل المثال في منشئ فئة ؟ على الرغم من أنني فقط أريد واحد PermissionManager سبيل المثال موجودة على طلبي ؟

أو أنا ذاهب عن كل هذا خطأ و يجب أن يكون غير منشئ العام و مصنع في مكان الذي يمر في حالة من PermissionManager لي ؟


معلومات إضافية ملاحظة: عندما أقول "حقن التبعية" ، أنا أتحدث عن دي نمط...أنا لا تستخدم أي دي الإطار مثل Guice أو الربيع.(...بعد)

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

المحلول

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

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

أنت الصحيح أنه عادة غير عملي بالنسبة للعملاء من فئة إلى معرفة أين يمكن العثور على الصحيح PermissionManager سبيل المثال ونقله في (أو حتى إلى الرعاية عن حقيقة أن الطبقة يستخدم PermissionManager).

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

PermissionManager mManager = null;
public PermissionManager Permissions
{
  if (mManager == null)
  {
    return mManager;
  }
  return PermissionManager.getInstance();
}

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

نصائح أخرى

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

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

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

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

وفي كلتا الحالتين ، على الرغم من الكلاسيكية "رأس المال-S" المفرد عموما يعتبر مضاد نمط في سياق التبعية الحقن.

هذه الوظائف قد تم الثاقبة بالنسبة لي في الماضي:

لذا يجب أن تتطلب فعلا API للمستخدمين تمر في PermissionManager سبيل المثال في منشئ فئة ؟ على الرغم من أنني فقط أريد واحد PermissionManager سبيل المثال موجودة على طلبي ؟

نعم, هذا هو كل ما عليك القيام به.إذا كانت التبعية هو المفرد / في طلب / في موضوع أو مصنع الأسلوب هو مسؤولية حاوية التكوين.في .صافي العالم سوف يكون مثاليا الاعتماد على IPermissionsManager واجهة للحد من زيادة اقتران ، أفترض أن هذا هو أفضل الممارسات في جافا جدا.

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

في هذه الحالة أود أن جعل PermissionManager فئة ثابتة إلا إذا لأي سبب من الأسباب كنت بحاجة إلى أن يكون instanciable نوع.

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