নকশার ধরণগুলির উপর: আমি কখন সিঙ্গলটন ব্যবহার করব?


447

মহিমান্বিত গ্লোবাল ভেরিয়েবল - গৌরবময় বৈশ্বিক শ্রেণিতে পরিণত হয়। কেউ কেউ বলেন অবজেক্ট ওরিয়েন্টড ডিজাইন।

পুরানো লগার যেখানে সিঙ্গলটন ব্যবহার করা বোধগম্যতা ব্যতীত আমাকে পরিস্থিতিগুলি দিন।


4
ইরং শিখার পরে, আমি সেই পদ্ধতির পছন্দ করি, নাম অপরিবর্তনীয়তা এবং বার্তা প্রেরণ।
সেটোরি

209
এই প্রশ্নটি সম্পর্কে গঠনমূলক কী নয়? আমি নীচে গঠনমূলক উত্তর দেখতে পাচ্ছি।
এম কে 12

3
একটি নির্ভরতা ইনজেকশন কাঠামো একটি খুব জটিল একক যা আউটপুট দেয় ...
ইয়ান রিংরোজ

1
সিঙ্গেলটন অন্যান্য বস্তুর উদাহরণগুলির মধ্যে ব্যবস্থাপক হিসাবে ব্যবহার করা যেতে পারে, সুতরাং সিঙ্গলটনের কেবলমাত্র একটি উদাহরণ থাকতে হবে যেখানে একে অপরের উদাহরণ সিঙ্গলটন উদাহরণের মাধ্যমে যোগাযোগ করা উচিত।
লেভেন্ট ডিভিলিওগ্লু

আমার একটি পার্শ্ব প্রশ্ন আছে: যে কোনও একক বাস্তবায়ন একটি "স্ট্যাটিক" শ্রেণি ব্যবহার করেও প্রয়োগ করা যেতে পারে ("ফ্যাক্টরি" / "উদ্যোগ" পদ্ধতি সহ) - আসলে কোনও শ্রেণীর উদাহরণ তৈরি না করে (আপনি বলতে পারেন স্ট্যাটিক শ্রেণিটি একটি সিঙ্গলটনের বাস্তবায়ন, কিন্তু ...) - কেন স্থির শ্রেণীর পরিবর্তে একজনকে আসল সিঙ্গলটন (একক শ্রেণীর উদাহরণ যা তার এককটি নিশ্চিত করে) ব্যবহার করা উচিত? আমি কেবলমাত্র "শব্দার্থবিজ্ঞানের" জন্য চিন্তা করতে পারি, তবে এমনকি সেই দিক থেকেও সিঙ্গেলটন ব্যবহারের ক্ষেত্রে সংজ্ঞা অনুসারে সত্যই "শ্রেণি> উদাহরণ" সম্পর্ক প্রয়োজন হয় না ... তাই ... কেন?
যুবাল এ।

উত্তর:


358

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

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

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

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

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


3
@ আর্নেমার্টজ আমার ধারণা এই একটাই।
আক্রমণাত্মক

1
কেন আপনি কেবল একটি বিশ্বব্যাপী অবজেক্ট ব্যবহার করতে পারবেন না? কেন এটি সিঙ্গলটন হতে হবে?
জুতো

1
আমি মনে করি একটি লগিং ব্যবহারের জন্য স্থির পদ্ধতি?
স্কাইনেট

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

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

124

একজন একক প্রার্থীকে অবশ্যই তিনটি প্রয়োজনীয়তা পূরণ করতে হবে:

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

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

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

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


3
আমি পয়েন্ট ২ এর সাথে একমত নই Point পয়েন্ট 3 আসলে কোনও কারণ নয় (কেবল কারণ এটি আপনাকে বোঝানো উচিত নয়) এবং 1 একটি ভাল পয়েন্ট তবে আমি এখনও এর ব্যবহার দেখতে পাচ্ছি না। আসুন বলি যে ভাগ করা সংস্থানটি একটি ডিস্ক ড্রাইভ বা একটি ডিবি ক্যাশে। আপনি অন্য ড্রাইভ যুক্ত করতে পারেন বা একটি ডিবি ক্যাশে অন্য কোনও বিষয়ের উপর দৃষ্টি নিবদ্ধ করে রাখতে পারেন (যেমন একটি থ্রেডের জন্য একটি বিশেষ টেবিলের জন্য একটি ক্যাশে অন্যটির সাধারণ উদ্দেশ্য হ'ল)।

15
আমি মনে করি আপনি "প্রার্থী" শব্দটি মিস করেছেন। একজন একক প্রার্থীকে অবশ্যই তিনটি প্রয়োজনীয়তা পূরণ করতে হবে; কারণ কোনও কিছু প্রয়োজনীয়তার সাথে মেলে, তার অর্থ এটি সিঙ্গলটন হওয়া উচিত নয়। অন্যান্য ডিজাইনের কারণ থাকতে পারে :)
মেটাও

45

কনফিগারেশন ফাইলগুলি পড়া যা কেবল প্রারম্ভকালে পড়তে হবে এবং সেগুলিকে একটি সিঙ্গেলনে আবদ্ধ করতে হবে।


8
.NET- তে অনুরূপ Properties.Settings.Default
নিক বেডফোর্ড

9
@ পল, "নো-সিঙ্গলটন শিবির" জানিয়েছে যে বিশ্বব্যাপী অ্যাক্সেসযোগ্য (ওরফে সিঙ্গেলটন) না করে কনফিগারেশন অবজেক্টটি কেবল প্রয়োজনীয় ফাংশনগুলিতে প্রেরণ করা উচিত।
পেসারিয়ার

2
একমত নন। কনফিগারেশনটি ডাটাবেসে স্থানান্তরিত করা উচিত, সমস্ত কিছু ভুল হয়ে গেছে। কনফিগারেশনের পথটি যদি single সিঙ্গলটনের বাইরের যে কোনও কিছুর উপর নির্ভর করে তবে এই জিনিসগুলিও স্থির হওয়া দরকার।
rr-

3
@ পলক্রোকারিন আপনি কি এটিকে প্রসারিত করতে পারেন এবং ব্যাখ্যা করতে পারেন যে এটি কীভাবে উপকারী?
অ্যালেক্সজি

1
@ আরআর- যদি কনফিগারেশনটি ডাটাবেসে সরে যায় তবে এটি একটি কনফিগারেশন অবজেক্টে আবশ্যক যা এটি প্রয়োজনীয় ফাংশনে চলে যাবে। (পিএস আমি "নো-সিঙ্গলটন" শিবিরে নেই)।
শীপ্পার্ড

36

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

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


30
আমি এই প্রিন্টারের স্পুলার উদাহরণটি শুনেছি এবং আমি মনে করি এটি একপ্রকার খোঁড়া। কে বলে আমার একাধিক স্পুলার থাকতে পারে না? হ্যাক যাইহোক একটি প্রিন্টার স্পুলার কি? আমার কাছে যদি বিভিন্ন ধরণের প্রিন্টার থাকে যা বিবাদী বা বিভিন্ন ড্রাইভার ব্যবহার করতে পারে না?
1800 তথ্য

6
এটি কেবল একটি উদাহরণ ... যে কোনও পরিস্থিতির জন্য যে কেউ উদাহরণ হিসাবে ব্যবহার করে আপনি একটি বিকল্প নকশা খুঁজে পেতে সক্ষম হবেন যা উদাহরণটিকে অকেজো করে তোলে। ভান করতে দিন যে স্পুলার একক সংস্থান পরিচালনা করে যা একাধিক উপাদান দ্বারা ভাগ করা হয়। এটা কাজ করে।
ভিনসেন্ট রামধনি

2
এটি গ্যাং অফ ফোরের সর্বোত্তম উদাহরণ। আমি মনে করি একটি বাস্তব চেষ্টা করে ব্যবহারের ক্ষেত্রে একটি উত্তর আরও দরকারী হবে। আমি এমন একটি পরিস্থিতি বোঝাতে চাইছি যেখানে আপনি প্রকৃতপক্ষে সিঙ্গেলটন অনুভব করাই সেরা সমাধান।
আন্দ্রেই বাজনা দ্বিতীয়

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

হ্যাক একটি প্রিন্টার স্পুলার কি?
রায়লাভলেস

23

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


4
ব্যবহারকারী ভাষাটি কেবলমাত্র এক ব্যবহারকারী সিস্টেমটি ব্যবহার করতে পারে এই ধারণার সাথে সিঙ্গেলন হতে পারে।
স্যামুয়েল -স্লুন্ড

… এবং সেই একজন ব্যবহারকারী কেবল একটি ভাষাতেই কথা বলতে পারেন।
দর্শকরা

17

একটি ডাটাবেসে সংযোগ (বা সংযোগের পুল) পরিচালনা করা।

আমি এটি বাহ্যিক কনফিগারেশন ফাইলগুলিতে তথ্য পুনরুদ্ধার এবং সঞ্চয় করতে ব্যবহার করব।


2
একটি ডাটাবেস সংযোগ জেনারেটর একটি কারখানার উদাহরণ হতে পারে না?
কেন

3
@ আপনি কী চান যে কারখানাটি প্রায় সব ক্ষেত্রেই সিঙ্গলটন হয়ে উঠুক।
ক্রিস মেরিসিক

2
@ ফেডেরিকো, "নো-সিঙ্গেলটন শিবির" বলবে যে এই ডাটাবেস সংযোগগুলি (গুলি) কেবল বিশ্বব্যাপী অ্যাক্সেসযোগ্য (ওরফে সিঙ্গলটন) না করে তাদের প্রয়োজনীয় ফাংশনগুলিতে প্রেরণ করা উচিত।
পেসারিয়ার

3
এর জন্য আপনার সত্যিকারের সিঙ্গলটন দরকার নেই। এটি ইনজেকশন দেওয়া যেতে পারে।
নেস্টার লেডন

11

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

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


3
লগারগুলি বেশিরভাগ ক্ষেত্রে সিলেটলেট হয় যাতে লগিং অবজেক্টগুলি প্রায় পাশ কাটাতে না পারে। লগ স্ট্রিমের যে কোনও শালীন বাস্তবায়ন তা নিশ্চিত করবে যে সমকালীন লেখাগুলি অসম্ভব, এটি সিঙ্গলটন হোক বা না হোক।
মেটাও

10

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

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


8

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


6

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

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

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

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


5

আপনি যখন কোনও কনফিগারেশন প্রোপার্টি অবজেক্ট লোড করেন, তা হয় ডাটাবেস বা কোনও ফাইল থেকে, এটি সিঙ্গলটন হিসাবে রাখতে সহায়তা করে; স্ট্যাটিক ডেটা পুনরায় পড়ার কোনও কারণ নেই যা সার্ভার চলাকালীন পরিবর্তিত হবে না।


2
আপনি কেন কেবল একবারে ডেটা লোড করবেন এবং প্রয়োজনীয়তা অনুসারে কনফিগারেশন অবজেক্টটি পাস করবেন না?
লেগওয়েজলে

চারপাশ দিয়ে কেটে যাচ্ছে ??? আমার যদি প্রয়োজন প্রতিটি অবজেক্টটি অতিক্রম করতে হয় তবে আমার 20 টি যুক্তিযুক্ত
কনস্ট্রাক্টর থাকত

@ এনারসিসিও যদি আপনার এমন কোনও বস্তু থাকে যা 20 টির উপরে অন্য কোনও এনক্যাপসুলেশন না করে নির্ভর করে তবে আপনার ইতিমধ্যে বড় নকশার সমস্যা রয়েছে।
দর্শকদের

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

আপনার যদি এতটা রাজ্য থাকে তবে আপনি নির্দিষ্ট প্রসঙ্গে প্রাসঙ্গিক দিকগুলির দৃষ্টিভঙ্গি প্রদান করে একটি উপদ্বীপ বাস্তবায়ন বিবেচনা করতে পারেন। কেন? কারণ এটি সিঙ্গলটন বা 29-আরগ কনস্ট্রাক্টর অ্যান্টিপাটাইটারগুলি ছাড়া কোনও একটি পরিষ্কার নকশার অনুমতি দেয়। আসলে আপনার জিআই ডায়ালগটি সেই সমস্ত জিনিসকে "একক দায়িত্বের নীতি লঙ্ঘন" বলে চিৎকার করে।
বর্ণা

3

যেমনটি সবাই বলেছে, একটি ভাগ করা সংস্থান - বিশেষত এমন কিছু যা সমবর্তী অ্যাক্সেস পরিচালনা করতে পারে না।

একটি নির্দিষ্ট উদাহরণ যা আমি দেখেছি, সে হ'ল লুসিন অনুসন্ধান সূচক লেখক।


1
এবং তবুও, ইনডেক্স রাইটার সিঙ্গলটন নয় ...
চিহ্নিত করুন

3

রাজ্য প্যাটার্নটি বাস্তবায়নের সময় আপনি সিঙ্গেলটন ব্যবহার করতে পারেন (জিওএফ বইয়ে দেখানো পদ্ধতিতে)। এটি কারণ কংক্রিটের রাজ্য শ্রেণীর নিজস্ব কোনও রাজ্য নেই এবং প্রসঙ্গ শ্রেণীর ক্ষেত্রে তাদের ক্রিয়া সম্পাদন করে।

আপনি বিমূর্ত কারখানাটি একটি সিঙ্গলটনও করতে পারেন।


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

1
@ কিউইকম্বম্ব 123 setState()রাষ্ট্র তৈরির নীতি সিদ্ধান্ত নেওয়ার জন্য আপনার দায়িত্ববান করার চেষ্টা করুন । আপনার প্রোগ্রামিংয়ের ভাষা যদি টেম্পলেট বা জেনেরিকগুলিকে সমর্থন করে তবে এটি সহায়তা করে। সিঙ্গলটনের পরিবর্তে আপনি মনসেটেট প্যাটার্নটি ব্যবহার করতে পারেন , যেখানে কোনও রাষ্ট্রের বস্তু ইনস্ট্যান্ট করে একই গ্লোবাল / স্ট্যাটিক স্টেট অবজেক্টটির পুনরায় ব্যবহার করা শেষ হয়। রাষ্ট্র পরিবর্তন করার বাক্য গঠনটি অপরিবর্তিত থাকতে পারে, কারণ আপনার ব্যবহারকারীদের সচেতন হওয়া উচিত নয় যে তাত্ক্ষণিক রাজ্যটি মনসেটেট।
এমিল কর্মিয়ার

ঠিক আছে তাই আমার রাজ্যগুলিতে আমি কেবল সমস্ত পদ্ধতি স্থির করতে পারি, তাই যখনই কোনও নতুন উদাহরণ তৈরি করা হয় তখন তার একই ওভারহেড থাকে না? আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি, মনসেটেট প্যাটার্ন সম্পর্কে আমার পড়তে হবে।
কিউইকম্ব 123

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

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

3

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

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

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

$gb->config['hostname']

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

$gb->lang['ENTER_USER']

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

$template

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

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


21
আপনি আপনার উত্তরটি একাধিক অনুচ্ছেদে বিভক্ত করতে এবং পাঠযোগ্যতার জন্য কোড বিভাগগুলিকে অবরুদ্ধ করতে চাইতে পারেন।
জাস্টিন

1

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

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


0

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

বিভিন্ন উপায়ে, সিজিআই প্যারামিটারগুলি পরিচালনা করার জন্য একটি সিঙ্গেলটন একইভাবে কাজ করবে যদি আপনি কেবলমাত্র ক্যোয়ারী অনুযায়ী একটি প্রক্রিয়া ব্যবহার করেন (অন্যান্য মোড_ * পদ্ধতিগুলি এটি না করে, তাই এটি সেখানে খারাপ লাগবে - এইভাবে যুক্তি যা আপনাকে বলবে না ' আপনি মোড_পার্ল বা যে কোনও বিশ্ববন্দরে পোর্ট করার ক্ষেত্রে Mod_cgi বিশ্বে সিঙ্গলেটগুলি ব্যবহার করবেন না।


-1

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

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

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

এড।


1
লিঙ্কটি এখন ভাঙা হয়েছে, তবে আপনি যদি একক সিলেটে দেখার তথ্যটি নিবন্ধভুক্ত করছেন, যা অ্যাপ্লিকেশন জুড়ে অ্যাক্সেস করা হবে, আপনি এমভিসির পয়েন্টটি মিস করছেন। একটি ভিউ একটি নিয়ামক (এবং এতে যোগাযোগ করে) দ্বারা আপডেট হয় যা মডেলটি ব্যবহার করে। এখানে যেমন শোনা যাচ্ছে, এটি সম্ভবত সিঙ্গলটনের অপব্যবহার এবং একটি রিফ্যাক্টরিং ক্রমযুক্ত।
dharharris

-9

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

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

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


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

কেন আপনি ইউনিট পরীক্ষা লগিং চান?
এনারসিসিও

"একটি স্ট্যাটিক লগার ক্লাস" এবং একটি স্ট্যাটিক লগার উদাহরণের মধ্যে একটি বিশাল পার্থক্য রয়েছে । সিঙ্গলটন প্যাটার্নটি "আপনার শ্রেণিটিকে স্থিতিশীল করুন" বলে না, এটি কোনও অবজেক্টের স্ট্যাটিকের উদাহরণ অ্যাক্সেস করতে বলে to সুতরাং উদাহরণস্বরূপ, ILogger logger = Logger.SingleInstance();যেখানে এই পদ্ধতিটি স্থির এবং এটি কোনও আইলোগারের একটি স্ট্যাটিকালি সঞ্চিত উদাহরণ প্রদান করে। আপনি "একটি নির্ভরতা ইনজেকশন কাঠামো" উদাহরণ ব্যবহার করেছেন। প্রায় সমস্ত ডিআই পাত্রে সিলেটলেট; তাদের কনফিগারেশনগুলি স্থিতিশীলভাবে সংজ্ঞায়িত করা হয় এবং শেষ পর্যন্ত একক পরিষেবা সরবরাহকারী ইন্টারফেসে / সঞ্চিত থাকে।
জন ডেভিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.