سؤال

هنا هي المشكلة لقد عانيت من أي وقت مضى منذ بدأت تعلم البرمجة وجوه المنحى:كيف ينبغي للمرء أن تنفيذ مسجل في "الصحيح" OOP الرمز ؟

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

نحن لا نريد أن إنشاء مسجل كائن عالمي متغير ، لأن المتغيرات العالمية سيئة, صحيح ؟ لكننا أيضا لا نريد أن يكون تمرير مسجل وجوه المعلمات في كل طريقة نسميه في كل كائن واحد.

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

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

المحلول

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

نصائح أخرى

هناك بعض جدا مدروسة الحلول.بعض تنطوي على تجاوز OO واستخدام آلية أخرى (اوب).

قطع الأشجار لا تصلح جيدا أن OO (وهو حسن وليس كل شيء).إذا كان لديك لتنفيذ ذلك بنفسك ، أقترح فقط إنشاء "تسجيل" في الجزء العلوي من كل فئة:

خاص النهائي سجل=سجل جديد(هذا) ؛

و تسجيل المكالمات ثم تافهة:السجل.print("أنت");

مما يجعل من الاسهل بكثير استخدام من المفرد.

لديك مسجل معرفة لأي فئة كنت تمر في استخدام هذا تعليم السجل.لأن ثم لديك مثيل من السجل ، ثم يمكنك أن تفعل أشياء مثل:

السجل.addTag("القانون");

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

log4j و المنشار هي الكمال من خارج منطقة الجزاء حل من ذلك. إذا كنت لا مجرد كونها الأكاديمية استخدام تلك.

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

public class MyLogger 
{
    public static void Log(String Message) {}
}

كيف يمكنك استبدال ذلك مع وهمية?

أفضل:

public interface ILog 
{
    void Log(String message);
}

public class MyLog : ILog 
{
    public void Log(String message) {}
}

لقد استعملت دائما نمط سينغلتون لتنفيذ تسجيل كائن.

هل يمكن أن ننظر إلى المفرد النمط.

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

أعتقد أنك يجب أن تستخدم اوب (الجانب المنحى البرمجة) على هذا بدلا من OOP.

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

حذار من أجل overdesign على الرغم من أن أجد في الممارسة فئة واحدة فقط مع الأساليب العالمية يمكن أن تعمل بشكل جيد جدا.

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

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

هناك تطبيقات أخرى مماثلة: log4net ، log4j, log4cxx

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

أنا اوب مع log4*.هذا ساعدنا حقا.جوجل أعطاني هذه المادة على سبيل المثال.يمكنك محاولة البحث أكثر في هذا الموضوع.

(IMHO) كيف 'تسجيل' يحدث ليس جزءا من الحل الخاص بك تصميم, هو أكثر جزء من بيئة ما كنت يحدث ليكون في تشغيل مثل نظام التقويم في جاوة.

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

استخدام فئة ثابتة ، فقد الأقل النفقات العامة يمكن الوصول إليها من جميع أنواع المشاريع في غضون فترة بسيطة الجمعية المرجعية

علما أن المفرد هو ما يعادل ، ولكن ينطوي على لزوم تخصيص

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

أيضا إذا كان لديك العديد من المواضيع قد تحتاج إلى قفل حول تسجيل وظائف لتجنب التداخل الناتج

IMHO تسجيل وحدها غير كافية ، وهذا هو السبب في أنني كتبت الهدوء

حظا سعيدا!

ربما إدخال التسجيل بطريقة شفافة بدلا تنتمي في الجانب برمجة لغة.ولكن نحن نتحدث OO التصميم هنا...

المفرد النمط قد تكون أكثر فائدة في رأيي:يمكنك الوصول إلى خدمة تسجيل الدخول من أي سياق خلال العام ، ثابت طريقة LoggingService الدرجة.

على الرغم من أن هذا قد يبدو مثل الكثير عالمي متغير ، فإنه ليس من:هو صحيح مغلفة داخل الطبقة المفرد و ليس الجميع لديه حق الوصول إليها.هذه تمكنك من تغيير طريقة تسجيل الدخول يتم التعامل معها حتى في وقت التشغيل ، ولكن يحمي العامل من الدخول من vilain' رمز.

في نظام العمل على إنشاء عدد من تسجيل 'ووحدانية', من أجل أن تكون قادرة على التمييز بين الرسائل من النظم الفرعية المختلفة.هذه يمكن أن تحول على/قبالة في وقت التشغيل, مرشحات يمكن تعريفها الكتابة إلى الملف ممكن...سمها ما شئت.

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

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

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

لدي مشاكل مع ساكنة قطع الاشجار مما تسبب permgen مشكلات في الذاكرة (على الأقل ، أعتقد هذا ما المشكلة) لذا ربما يكون إعادة النظر في قطع الاشجار قريبا.

لتجنب المتغيرات العالمية ، أقترح إنشاء سجل عالمي وتسجيل globals هناك.

للتسجيل, أنا أفضل أن توفر المفرد الدرجة أو الفئة التي توفر بعض أساليب ثابتة لقطع الأشجار.

في الواقع, كنت استخدم واحد من القائمة تسجيل الأطر.

آخر حل ممكن هو أن يكون هناك تسجيل الدرجة التي بتغليف قطع الأشجار/الإجراء المخزن.بهذه الطريقة يمكنك فقط إنشاء مثيل new Log(); كلما كنت في حاجة إليها دون الحاجة إلى استخدام المفرد.

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

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