design patterns - নকশা নিদর্শনগুলিতে: আমি কখন সিঙ্গল্ট ব্যবহার করব?




design-patterns singleton (12)

মহিমান্বিত গ্লোবাল পরিবর্তনশীল - একটি মহিমান্বিত বিশ্বব্যাপী শ্রেণী হয়ে। কিছু বিরতি বস্তু ভিত্তিক নকশা বলে।

আমাকে সিঙ্গলটন ব্যবহার করার জন্য ইন্দ্রিয়দীপ্ত করে তুললে ভাল পুরানো লগার ছাড়াও পরিস্থিতিগুলি দিন।


1 - প্রথম প্রশ্নের একটি মন্তব্য:

আমি একটি স্ট্যাটিক লগার ক্লাস সঙ্গে একমত না। এটি একটি বাস্তবায়ন জন্য ব্যবহারিক হতে পারে, কিন্তু এটি ইউনিট পরীক্ষার জন্য প্রতিস্থাপনযোগ্য হতে পারে না। একটি স্ট্যাটিক ক্লাস একটি পরীক্ষা দ্বিগুণ দ্বারা প্রতিস্থাপিত করা যাবে না। যদি আপনি ইউনিট পরীক্ষা না করেন তবে আপনি এখানে সমস্যাটি দেখতে পাবেন না।

2 - আমি হাত দ্বারা একটি singleton তৈরি করার চেষ্টা করুন। আমি শুধু কন্সট্রাক্টরদের সাথে একটি সাধারণ বস্তু তৈরি করি যা আমাকে বস্তুর মধ্যে সহযোগীকে ইনজেক্ট করার অনুমতি দেয়। যদি আমার একটি সিঙ্গলটনের প্রয়োজন হয়, আমি একটি নির্ভরতা inyection ফ্রেমওয়ার্ক (Spring.NET, নেটের জন্য ইউনিটি, জাভাস্ক্রিপ্টের জন্য স্প্রিং), অথবা অন্য কিছু ব্যবহার করব।


আপনি একটি ভাগ করা সম্পদ পরিচালনা করার প্রয়োজন হলে আপনি একটি singleton ব্যবহার করুন। উদাহরণস্বরূপ একটি প্রিন্টার স্পুলার। একই সংস্থার দ্বন্দ্বমূলক অনুরোধ এড়ানোর জন্য আপনার অ্যাপ্লিকেশনটিতে স্পুলারের একমাত্র উদাহরণ থাকা উচিত।

অথবা একটি ডাটাবেস সংযোগ বা একটি ফাইল ম্যানেজার ইত্যাদি।


আমি এককোনাট ব্যবহার ডেটাবেসে একাধিক সম্পর্ক হিসাবে একই হিসাবে চিন্তা করা যেতে পারে। যদি আপনার কোডের বিভিন্ন অংশ থাকে তবে কোনও বস্তুর একক দৃষ্টান্তের সাথে কাজ করার প্রয়োজন হয়, যেখানে এটি এককটি ব্যবহার করে বোঝা যায়।


একক বা গ্লোবাল ভেরিয়েবল হিসাবে নির্দিষ্ট অবকাঠামো উদ্বেগ কনফিগার করার জন্য এটি খুব ব্যবহারিক হতে পারে। এই আমার প্রিয় উদাহরণ নির্ভরতা ইনজেকশন ফ্রেমওয়ার্ক যা ফ্রেমওয়ার্কের সংযোগ বিন্দু হিসাবে কাজ করার জন্য একত্রে ব্যবহার করে।

এই ক্ষেত্রে আপনি লাইব্রেরি ব্যবহার করে সহজতর করার জন্য এবং অব্যবহৃত জটিলতার এড়াতে অবকাঠামোর উপর নির্ভরতা নিচ্ছেন।


একটি সিঙ্গলটন প্রার্থী তিনটি প্রয়োজনীয়তা সন্তুষ্ট করতে হবে:

  • একটি ভাগ সম্পদ থেকে একযোগে অ্যাক্সেস নিয়ন্ত্রণ।
  • সম্পদ অ্যাক্সেস অনুরোধ করা হবে একাধিক, সিস্টেমের বিভিন্ন অংশ থেকে।
  • শুধুমাত্র একটি বস্তু হতে পারে।

যদি আপনার প্রস্তাবিত সিঙ্গল্টনের এই প্রয়োজনীয়তাগুলির মধ্যে মাত্র এক বা দুইটি থাকে তবে একটি পুনর্নির্মাণ প্রায় সবসময় সঠিক বিকল্প।

উদাহরণস্বরূপ, একটি প্রিন্টার স্পুলার একাধিক স্থানে (মুদ্রণ মেনু) থেকে বলা যেতে পারে না, তাই আপনি সমতুল অ্যাক্সেস সমস্যা সমাধানের জন্য নিঃশব্দ ব্যবহার করতে পারেন।

একটি সহজ লগার সম্ভবত একটি সম্ভাব্য-বৈধ এককোননের সর্বাধিক সুস্পষ্ট উদাহরণ, তবে এটি আরও জটিল লগিং স্কিমগুলির সাথে পরিবর্তন করতে পারে।


একটি সিঙ্গল্টনের একটি বাস্তব উদাহরণ Test::Builder পাওয়া যায়, যা কেবলমাত্র প্রতিটি আধুনিক পার্ল টেস্টিং মডিউল ব্যাক করে। টেস্ট :: বিল্ডার সিঙ্গলটনের দোকানে এবং দালালরা পরীক্ষা প্রক্রিয়ার রাজ্য এবং ইতিহাস (ঐতিহাসিক পরীক্ষার ফলাফল, পরীক্ষা চালানোর সংখ্যা গণনা) পাশাপাশি পরীক্ষা আউটপুট যা হচ্ছে সেগুলির মতো বিষয়। একক পরীক্ষার স্ক্রিপ্টে একসাথে কাজ করার জন্য, বিভিন্ন লেখক দ্বারা লিখিত একাধিক পরীক্ষার মডিউল সমন্বয় করার জন্য এটি সমস্ত প্রয়োজনীয়।

টেস্ট ইতিহাস :: বিল্ডার এর সিঙ্গলটন শিক্ষাগত। new() কলিং new() সবসময় আপনাকে একই বস্তু দেয়। প্রথম, সমস্ত তথ্য বস্তুর মধ্যে কিছুই দিয়ে ক্লাস ভেরিয়েবল হিসাবে সংরক্ষণ করা হয়। আমি নিজেই টেস্ট :: বিল্ডার পরীক্ষা করতে চেয়েছি পর্যন্ত এটি কাজ করে। তারপরে আমাকে দুটি টেস্ট :: বিল্ডার বস্তু, একটি ডামি হিসাবে একটি সেটআপ, তার আচরণ এবং আউটপুট ক্যাপচার এবং পরীক্ষা করতে এবং একটি প্রকৃত পরীক্ষা বস্তু হিসাবে প্রয়োজন। সেই সময়ে টেস্ট :: বিল্ডারকে প্রকৃত বস্তুর মধ্যে পুনঃবিবেচনা করা হয়েছিল। সিঙ্গলটন বস্তুটি ক্লাসের ডেটা হিসাবে সংরক্ষণ করা হয়েছিল এবং new() সর্বদা এটি ফেরত পাঠাবে। create() একটি তাজা অবজেক্ট তৈরি এবং পরীক্ষার সক্ষম করতে যুক্ত করা হয়েছে।

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

মনে হচ্ছে তথ্য সংহতকরণ এবং আচরণের নমনীয়তার মধ্যে টান আছে এবং এটি এককভাবে ডেটা অখণ্ডতা নিশ্চিত করতে যতটা সম্ভব সম্ভব আচরণের সাথে একমাত্র ভাগ করা ডেটা সহ একক্টনকে সংক্ষেপে সরিয়ে দেওয়া যেতে পারে।


কিছু গ্লোবাল স্টেট (ব্যবহারকারীর ভাষা, সাহায্য ফাইলপথ, অ্যাপ্লিকেশন পথ) সংরক্ষণ করা একমাত্র একক পাঠ্য যুক্তিসঙ্গত। ব্যবসা যুক্তি নিয়ন্ত্রণ করতে singletons ব্যবহার সতর্কতা অবলম্বন করা - একক প্রায় সবসময় একাধিক হচ্ছে শেষ


কোড সঙ্গে একটি উদাহরণ, সম্ভবত।

এখানে, কংক্রিট রেজিস্ট্রি একটি জুজু খেলাতে একটি সিঙ্গলটন যা প্যাটার্ন ট্রিটিকে সমস্ত উপায়ে অ্যাক্সেসের অনুমতি দেয়, গেমের মূল ইন্টারফেসগুলি (যেমন, মডেল, ভিউ, কন্ট্রোলার, পরিবেশ ইত্যাদির ফ্যাকড) অ্যাক্সেস করে।

http://www.edmundkirwan.com/servlet/fractal/cs1/frac-cs40.html

এড।


প্লাগযোগ্য মডিউলগুলির সাথে ডিল করার সময় আমি কমান্ড-লাইন প্যারামিটারগুলিকে এনক্যাপুলুল করার জন্য এটি ব্যবহার করি। কমান্ড-লাইন প্যারামিটারগুলি লোড হওয়া মডিউলগুলির জন্য কী (এবং সর্বদা এমনকি কোনও মডিউল লোড হচ্ছে না তাও জানেন না) প্রধান প্রোগ্রামটি জানে না। উদাহরণস্বরূপ, প্রধান লোড A, যা কোনও প্যারামিটারের প্রয়োজন হয় না (তাই কেন এটি অতিরিক্ত পয়েন্টার / রেফারেন্স / যাই হোক না কেন, আমি নিশ্চিত নই - দূষণের মত দেখায়), তারপর মডিউল এক্স, ওয়াই এবং জেড দুটি লোড করে। এগুলির মধ্যে X এবং Z, প্যারামিটার দরকার (বা গ্রহণ), তাই তারা কমান্ড-লাইন একক্টনকে আবার বলার জন্য এটি কোন প্যারামিটার গ্রহণ করতে পারে তা বলার জন্য, এবং রানটাইম সময়ে তারা ফিরে আসার জন্য কল করে, যদি ব্যবহারকারী আসলে কোনও নির্দিষ্ট করে তাদের মধ্যে.

অনেক উপায়ে, সিজিআই প্যারামিটারগুলি পরিচালনা করার জন্য একটি সিঙ্গলটন একইভাবে কাজ করবে যদি আপনি শুধুমাত্র ক্যোয়ারির জন্য একটি প্রক্রিয়া ব্যবহার করছেন (অন্য mod_ * পদ্ধতিগুলি এটি না করে, তাই এটি খারাপ হবে - এইভাবে আপনি যা বলছেন তা ' আপনি mod_perl বা যাই হোক না কেন বিশ্বের পোর্ট ক্ষেত্রে mod_cgi বিশ্বের singletons ব্যবহার করবেন না)।


ভাগ করা সম্পদ। বিশেষ করে পিএইচপি, একটি ডাটাবেস ক্লাস, একটি টেম্পলেট ক্লাস, এবং একটি গ্লোবাল পরিবর্তনশীল ডিপো ক্লাস। সমস্ত কোড জুড়ে ব্যবহার করা হয় যে সমস্ত মডিউল / ক্লাস দ্বারা ভাগ করা আছে।

এটি একটি সত্য বস্তু ব্যবহার -> টেমপ্লেট শ্রেণিতে তৈরি করা হচ্ছে এমন পৃষ্ঠা টেমপ্লেট রয়েছে, এবং এটি পৃষ্ঠা আকারে যুক্ত করা মডিউলগুলি দ্বারা পরিবর্তিত, যোগ করা হয়েছে। এটি একটি একক দৃষ্টান্ত হিসাবে রাখা উচিত যাতে এটি ঘটতে পারে, এবং একই ডাটাবেসের জন্য যায়। একটি ভাগ করে নেওয়া ডাটাবেস সিঙ্গলটনের সাথে, সমস্ত মডিউল ক্লাসগুলি অ্যাক্সেসগুলিতে অ্যাক্সেস পেতে পারে এবং তাদের পুনর্নবীকরণ ছাড়াই তাদের পেতে পারে।

একটি বিশ্বব্যাপী পরিবর্তনশীল ডেপট সিঙ্গলটন আপনাকে একটি বিশ্বব্যাপী, নির্ভরযোগ্য এবং সহজে ব্যবহারযোগ্য পরিবর্তনশীল ডিপো সরবরাহ করে। এটি আপনার কোড একটি মহান অনেক tidies আপ। একটি singleton মধ্যে একটি অ্যারে সব কনফিগারেশন মান থাকার মত কল্পনা করুন:

$gb->config['hostname']

বা একটি অ্যারের মধ্যে সব ভাষা মান থাকার মত:

$gb->lang['ENTER_USER']

পৃষ্ঠাটির কোডটি চালানোর শেষে, আপনি এখন বলবেন, এখন একটি পরিপক্ক:

$template

সিঙ্গলটন, একটি $gb জিবি সিঙ্গলটন যা এতে প্রতিস্থাপনের জন্য ল্যাং অ্যারে রয়েছে, এবং সমস্ত আউটপুট লোড এবং প্রস্তুত। আপনি কেবল তাদের এমন কীগুলিতে প্রতিস্থাপন করুন যা এখন পরিপক্ক টেম্পলেট অবজেক্টের পৃষ্ঠা মানতে উপস্থিত রয়েছে এবং তারপরে ব্যবহারকারীর কাছে এটি সরবরাহ করুন।

এর সবচেয়ে বড় সুবিধা হল আপনি যে কোনও পোস্ট-প্রক্রিয়াকরণ করতে পারেন যা আপনি পছন্দ করেন। আপনি গুগল অনুবাদের জন্য সমস্ত ভাষা মান পাইপ করতে পারেন, অথবা অন্য অনুবাদ পরিষেবা এবং তাদের ফিরিয়ে আনতে পারেন, এবং উদাহরণস্বরূপ, তাদের স্থানগুলিতে তাদের প্রতিস্থাপন করতে পারেন। অথবা, আপনি পৃষ্ঠার কাঠামো, বা বিষয়বস্তু স্ট্রিংগুলি প্রতিস্থাপন করতে পারেন, আপনি চান।


সত্যের জন্য আমার অনুসন্ধানে আমি আবিষ্কার করেছি যে সিঙ্গল্টন ব্যবহার করার জন্য খুব কম "গ্রহণযোগ্য" কারণ রয়েছে।

ইন্টার্নেটগুলিতে আবার ওঠার এক কারণ হল "লগিং" শ্রেণির (যা আপনি উল্লেখ করেছেন)। এই ক্ষেত্রে, একটি ক্লাসের একক দৃষ্টান্তের পরিবর্তে সিঙ্গলটন ব্যবহার করা যেতে পারে কারণ লগিং ক্লাসটি সাধারণত একটি প্রকল্পে প্রতি ক্লাসে বার বার বিজ্ঞাপন ব্যবহার করতে হবে। প্রতিটি ক্লাস এই লগিং ক্লাস ব্যবহার করে, নির্ভরতা ইনজেকশন গুরুতর হয়ে।

লগিং একটি "গ্রহণযোগ্য" সিঙ্গলটন এর একটি নির্দিষ্ট উদাহরণ, কারণ এটি আপনার কোডটি কার্যকর করার প্রভাবকে প্রভাবিত করে না। লগিং নিষ্ক্রিয়, কোড নির্বাহ একই থাকে। এটি একই সক্রিয় করুন। মিক্সো সিঙ্গলেটসের রুট কজিতে নিম্নোক্ত উপায়ে এটি রাখে, "এখানে তথ্যটি এক প্রবাহে প্রবাহিত হয়: আপনার অ্যাপ্লিকেশন থেকে লগগারে। যদিও লগগারগুলি বিশ্বব্যাপী হয় তবে লগগারগুলি থেকে আপনার কোনও তথ্য প্রবাহিত হয় না, তবে লগগারগুলি গ্রহণযোগ্য।"

আমি পাশাপাশি অন্যান্য বৈধ কারণ আছে নিশ্চিত নই। " প্যাটার্নস আমি ঘৃণা " এ অ্যালেক্স মিলার, পরিষেবা লোকেটার এবং ক্লায়েন্ট পার্শ্ব UI এর কথাও সম্ভবত সম্ভাব্য "গ্রহণযোগ্য" পছন্দ।

সিঙ্গলটন এ আরো পড়ুন আমি তোমাকে ভালোবাসি, কিন্তু আপনি আমাকে নিচে আনছেন।


সমগ্র অ্যাপ্লিকেশন দ্বারা ভাগ করা একটি সংস্থান অ্যাক্সেস পরিচালনা করার সময় একটি সিঙ্গলটন ব্যবহার করা উচিত, এবং সম্ভবত একই শ্রেণীর একাধিক দৃষ্টান্তের জন্য এটি বিধ্বংসী হবে। শেয়ার করা সংস্থানগুলির থ্রেড অ্যাক্সেস অ্যাক্সেস নিশ্চিত করা একটি অত্যন্ত ভাল উদাহরণ যেখানে এই ধরণের প্যাটার্ন অতীব গুরুত্বপূর্ণ হতে পারে।

Singletons ব্যবহার করার সময়, আপনি নিশ্চিতভাবে দুর্বলতা নির্ভরতা গোপন করা হয় না তা নিশ্চিত করা উচিত। আদর্শভাবে, সিঙ্গলনগুলি (অ্যাপ্লিকেশনে সর্বাধিক স্ট্যাটিক ভেরিয়েবলগুলির মতো) অ্যাপ্লিকেশনের জন্য আপনার প্রাথমিককরণ কোডটি কার্যকর করার সময় (# স্ট্যাটিক অকার্যকর মুখ্য () C # এক্সিকিউটেবলগুলির জন্য, স্ট্যাটিক অকার্যকর প্রধান () জাভা এক্সিকিউটেবলগুলির জন্য) এবং তারপরে তাত্ক্ষণিক যে সমস্ত অন্যান্য ক্লাস এটি প্রয়োজন। এই আপনি testability বজায় রাখতে সাহায্য করে।







singleton