অন্যরা সাধারণভাবে সিলেটলেটগুলির সাথে সমস্যাটি খুব ভালভাবে ব্যাখ্যা করেছেন। আমি কেবল লগারের নির্দিষ্ট কেস সম্পর্কে একটি নোট যুক্ত করতে চাই। আমি আপনার সাথে একমত যে কোনও স্থির getInstance()
বা getRootLogger()
পদ্ধতির মাধ্যমে একটি সিঙ্গলটন হিসাবে কোনও লগার (বা রুট লগার, সুনির্দিষ্ট হওয়া) অ্যাক্সেস করা কোনও সমস্যা নয় । (যদি না আপনি যদি পরীক্ষা করে দেখেন যে ক্লাসটি কী লগ হয়েছে তা যদি না দেখতে চান - তবে আমার অভিজ্ঞতায় আমি এই জাতীয় ঘটনাগুলি খুব কমই স্মরণ করতে পারি যেখানে এটি প্রয়োজনীয় ছিল। তারপরে, অন্যদের জন্য এটি সম্ভবত আরও উদ্বেগজনক উদ্বেগ হতে পারে))।
আইএমও সাধারণত একটি সিঙ্গলটন লগার উদ্বেগের বিষয় নয়, কারণ এতে আপনি যে শ্রেণীর পরীক্ষা করছেন তার সাথে সম্পর্কিত কোনও রাজ্য নেই। অর্থাৎ পরীক্ষিত শ্রেণীর অবস্থার উপর লগারের রাষ্ট্র (এবং তার সম্ভাব্য পরিবর্তনগুলি) এর কোনও প্রভাব ফেলবে না। সুতরাং এটি আপনার ইউনিট পরীক্ষাগুলি আরও কঠিন করে তোলে না।
বিকল্পটি হ'ল আপনার অ্যাপ্লিকেশনটিতে প্রতিটি ক্লাসে (প্রায়) কন্সট্রাক্টরের মাধ্যমে লগার ইনজেকশন করা। ইন্টারফেসের ধারাবাহিকতার জন্য, এটি বর্তমানে ইনজেকশন করা উচিত এমনকি যদি প্রশ্নে থাকা বর্গটি বর্তমানে কিছু লগ না করে - বিকল্পটি হ'ল আপনি যখন এই মুহুর্তে আবিষ্কার করেন যে এই ক্লাসটি থেকে আপনাকে এখন কিছু লগইন করতে হবে, সুতরাং আপনাকে একটি লগার প্রয়োজন সমস্ত ক্লায়েন্ট কোড ভঙ্গ করে আপনাকে ডিআই এর জন্য কনস্ট্রাক্টর পরামিতি যুক্ত করতে হবে। আমি এই দুটি অপশনই অপছন্দ করি এবং আমি অনুভব করি যে লগ করার জন্য ডিআই ব্যবহার করা কোনও তাত্ত্বিক নিয়ম মেনে চলার জন্য আমার জীবনকে জটিল করে দেবে, কোনও প্রকারের সুবিধা ছাড়াই।
সুতরাং আমার নীচের লাইনটি হ'ল: একটি শ্রেণী যা সর্বজনীনভাবে ব্যবহৃত (প্রায়) তবে আপনার অ্যাপ্লিকেশনটির সাথে প্রাসঙ্গিক রাষ্ট্রটি ধারণ করে না, নিরাপদে সিঙ্গলটন হিসাবে প্রয়োগ করা যেতে পারে ।