سؤال

النظر في أنماط مارتن فاولر لعمارة تطبيق المؤسسة ، ونمط وحدة التحكم الأمامية: http://martinfowler.com/eaacatalog/frontcontroller.htmlعلى ما يبدو ، يستخدم نمط المفرد. حسنًا ، لديّ مجموعة من الفئات في تطبيق PHP تعمل معًا (مثل حزمة وحدة تحكم Zend) ، وهناك فئة واحدة تجعلها جميعًا قابلة للاستخدام ولأنها تشبه الكثير من مفاهيم وحدة التحكم الأمامية ، فقد أطلق عليها اسم Packagename_Front. لكن لا ينبغي أن يكون فئة مفردة (على عكس وحدة التحكم الأمامية) ، فهل ما زلت أتركها الاسم المقدمة؟ إذا لم يكن كذلك ، فماذا أسميها؟ نظرًا لأنها حزمة كبيرة جدًا ، فأنا فقط بحاجة إلى اتباع الاتفاقيات قدر الإمكان (وليس بطريقة عقائدية!) لذلك سيكون قابلاً للقراءة للمطورين الآخرين.

مزيد من المعلومات: لا يتعلق الأمر بأدوات التحكم. إنه مجرد كائن يعمل مثل Zend_Form (الذي يدمج استخدام جميع الكائنات الأخرى مثل Zend_Form_Element_X و Zend_Validate في كائن واحد) ولكن لا يمكنني فقط تسمية اسمه. يجب أن يكون packagename_something ، وأنا فقط لا يسيطر على شيء يجب أن يكون. ربما "معالج"؟ ... أريد فقط أن أتأكد عندما يقرأ شخص ما اسمه ، ولا يربك دوره في الحزمة بأكملها :)

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

المحلول

على ما يبدو ، ذلك Frontcontroller يستخدم نمط المفرد.

لا يجب تنفيذ Frontcontroller كـ Singleton. الكتاب لا يقترح أي شيء مثل هذا. يستخدم المثال في الكتاب servlet للمعالج.

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

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

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

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

نصائح أخرى

فقط من عرض تصميم بحت ، يبدو أنك تستخدم هذا packagename_front كواجهة عندما تقول:

هناك فئة واحدة تجعلهم جميعًا قابلاً للاستخدام

يقول تطبيق فاولر للنمط:

تعمل وحدة التحكم الأمامية على دمج جميع معالجة الطلبات عن طريق توجيه الطلبات من خلال كائن معالج واحد

هذا يلمح إلى أنه قد يتم استخدام المفرد لتنفيذ فئة وحدة التحكم الأمامية ، لكنه بالتأكيد لا يقيدها على استخدامها. إنه لا يذكر ذلك صراحة.

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

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

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

سنتي هنا ، لأنني لست مؤلف كتاب أو شيء من هذا القبيل.

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