সিলেটলেট সম্পর্কে এত খারাপ কী? [বন্ধ]


1982

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

স্ট্যাক ওভারফ্লোটি বিশেষত ধরে নিয়েছে বলে মনে হয় যে প্রত্যেকে সিঙ্গলেটগুলি মন্দ বলে সম্মত হয়। কেন?

আপনার উত্তরগুলিকে " তথ্য, তথ্যসূত্র, বা নির্দিষ্ট দক্ষতা " দিয়ে সহায়তা করুন


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

71
উত্তরে 'কনস' প্রচুর রয়েছে, তবে খারাপের সাথে বিপরীতে তুলনা করার জন্য প্যাটার্নটি ভাল হওয়ার কয়েকটি ভাল উদাহরণও দেখতে চাই ...
ডিজিএম

50
আমি কয়েক মাস আগে এই বিষয়ে একটি ব্লগ পোস্ট লিখেছিলাম: jalf.dk/blog/2010/03/… - এবং আমাকে কেবল এটুকু বলতে দিন। আমি ব্যক্তিগতভাবে এমন একক পরিস্থিতি সম্পর্কে ভাবতে পারি না যেখানে একটি সিঙ্গলটনই সঠিক সমাধান। এর অর্থ এই নয় যে এইরকম পরিস্থিতি বিদ্যমান নয়, তবে ... তাদের বিরল বলা একটি সংক্ষিপ্ত বিবরণ।
জলফ

8
@ অ্যাডমস্মিথ এর অর্থ এই নয় যে আপনার দরকার আছে , তবে এর অর্থ আপনি এটির মতো অ্যাক্সেস করতে পারবেন । এবং যদি আপনি এটির মতো অ্যাক্সেস করতে চান না, তবে এটিকে প্রথম স্থানে সিঙ্গলটন করার সামান্য কারণ আছে। সুতরাং আপনার যুক্তি কার্যকরভাবে "যদি আমরা এটিকে সিঙ্গলটন হিসাবে না বিবেচনা করি তবে সিঙ্গলটন তৈরিতে কোনও ক্ষতি নেই Y হ্যাঁ, দুর্দান্ত My আমার গাড়িটিও যদি গাড়ি চালনা না করে তবে দূষিত হয় না But তবে তারপরে এটি কেবল সহজ প্রথম স্থানে গাড়ি অর্জন করবেন না।;) (সম্পূর্ণ প্রকাশ: আমার কাছে আসলে গাড়ি নেই)
জাল্ফ

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

উত্তর:


1292

ব্রায়ান বোতাম থেকে প্যারাফ্রেস করা:

  1. এগুলি সাধারণত একটি বিশ্বব্যাপী উদাহরণ হিসাবে ব্যবহৃত হয়, কেন এত খারাপ? কারণ আপনি আপনার অ্যাপ্লিকেশনটির নির্ভরতাগুলি ইন্টারফেসের মাধ্যমে প্রকাশ করার পরিবর্তে আপনার কোডটিতে লুকিয়ে রেখেছেন। এটিকে ঘিরে এড়াতে বৈশ্বিক কিছু তৈরি করা কোডের গন্ধ

  2. তারা একক দায়িত্বের নীতি লঙ্ঘন করে : এ কারণে যে তারা নিজের তৈরি এবং জীবনচক্র নিয়ন্ত্রণ করে।

  3. এগুলি সহজাতভাবে কোডটিকে দৃ ly ়ভাবে সংযুক্ত করার কারণ দেয় । এটি তাদের পরীক্ষার অধীনে অনেক ক্ষেত্রে জটিল করে তোলে।

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


324
আমি আপনার সাথে একমত নই. যেহেতু মন্তব্যে কেবল 600০০ অক্ষর অনুমোদিত, তাই আমি এই বিষয়ে মন্তব্য করার জন্য একটি ব্লগ পোস্ট লিখেছি, দয়া করে নীচের লিঙ্কটি দেখুন। jorudolph.wordpress.com/2009/11/22/singleton-considerations
জোহানেস রুডল্ফ

61
পয়েন্ট 1 এবং 4 এ, আমি মনে করি সিলেটলেটগুলি দরকারী, এবং প্রকৃতপক্ষে ডেটা ক্যাশে করার জন্য প্রায় উপযুক্ত (বিশেষত একটি ডিবি থেকে)। মডেলিং ইউনিট পরীক্ষার সাথে জড়িত জটিলতার বাইরে কর্মক্ষমতা বৃদ্ধি।
দাই বোক

56
@ ডাই বোক: "ক্যাচিং ডেটা (বিশেষত একটি ডিবি থেকে)" এটি করার জন্য প্রক্সি প্যাটার্ন ব্যবহার করুন ...
paxos1977

55
বাহ, দুর্দান্ত প্রতিক্রিয়া। আমি সম্ভবত এখানে অত্যধিক আক্রমণাত্মক শব্দ ব্যবহার করেছি, সুতরাং দয়া করে মনে রাখবেন আমি একটি নেতিবাচক গিয়ার প্রশ্নের উত্তর দিচ্ছিলাম। আমার উত্তরটি বোঝানো হয়েছিল 'অ্যান্টি প্যাটার্নগুলির' একটি সংক্ষিপ্ত তালিকা যা খারাপ সিঙ্গেলটন ব্যবহার থেকে ঘটে। সম্পূর্ণ প্রকাশ; আমিও সময়ে সময়ে সিঙ্গলেটন ব্যবহার করি। এসও-তে আরও নিরপেক্ষ প্রশ্নাবদ্ধ প্রশ্ন রয়েছে যা সিঙ্গেলটনকে একটি ভাল ধারণা হিসাবে বিবেচনা করা যেতে পারে তার জন্য দুর্দান্ত ফোরাম তৈরি করবে। উদাহরণস্বরূপ, stackoverflow.com/questions/228164/…
জিম বার্গার

21
বহুবিবাহিত পরিবেশে ক্যাশে দেওয়ার জন্য এগুলি এত দুর্দান্ত নয়। আপনি সীমিত সংস্থার উপর লড়াই করে একাধিক থ্রেড সহ সহজেই একটি ক্যাশে পরাজিত করতে পারেন। [একক
একা

449

সিঙ্গলেটগুলি একটি (এবং শুধুমাত্র একটি) সমস্যার সমাধান করে।

রিসোর্সের বিষয়বস্তু।

আপনার যদি কিছু সংস্থান থাকে

( 1 ) শুধুমাত্র একটি একক উদাহরণ থাকতে পারে, এবং

( ) আপনার সেই একক উদাহরণটি পরিচালনা করতে হবে,

আপনি যদি একটি প্রয়োজন Singleton

অনেক উদাহরণ নেই। একটি লগ ফাইল বড় এক। আপনি কেবল একটি একক লগ ফাইল পরিত্যাগ করতে চান না। আপনি এটি সঠিকভাবে ফ্লাশ করতে, সিঙ্ক করতে এবং বন্ধ করতে চান। এটি পরিচালনা করতে হবে এমন একটি একক ভাগ করা সংস্থার একটি উদাহরণ।

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

যখন আপনি মনে করেন যে আপনার একটি গ্লোবাল প্রয়োজন, আপনি সম্ভবত একটি ভয়াবহ ডিজাইনের ভুল করছেন।


43
হার্ডওয়ারও কি উদাহরণ? এম্বেড থাকা সিস্টেমে প্রচুর পরিমাণে হার্ডওয়ার রয়েছে যা হয়ত সিলেটলেটগুলি ব্যবহার করতে পারে - বা সম্ভবত একটি বড় এক? <grin>
জেফ

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

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

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

19
সুতরাং আপনি দুটি অভিন্ন ক্লাস লিখবেন, প্রচুর কোডের সদৃশ, যাতে আপনার কাছে দুটি বন্দর উপস্থাপন করে দুটি সিলেটলেট থাকতে পারে? কীভাবে কেবল দুটি গ্লোবাল সিরিয়ালপোর্ট অবজেক্ট ব্যবহার করা যায়? হার্ডওয়্যারকে মোটেও ক্লাস হিসাবে মডেলিং করবেন না? এবং আপনি কেন সিঙ্গেলটন ব্যবহার করবেন, যা বিশ্বব্যাপী অ্যাক্সেসকে বোঝায়? আপনি কি চান যে আপনার কোডের প্রতিটি ফাংশন সিরিয়াল পোর্টটিতে অ্যাক্সেস করতে সক্ষম হবে?
জলফ

352

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

অনুশীলনে সিঙ্গলটন প্যাটার্নটি হ'ল একটি প্রোগ্রামিং কৌশল যা আপনার সরঞ্জামের ধারণাগুলির একটি দরকারী অংশ। সময়ে সময়ে আপনি এটি খুঁজে পেতে পারেন এটি আদর্শ সমাধান এবং তাই এটি ব্যবহার করুন। তবে এটি ব্যবহার করা যাতে আপনি ডিজাইনের প্যাটার্নটি ব্যবহার সম্পর্কে গর্ব করতে পারেন ঠিক তেমনি এটি কখনও ব্যবহার করতে অস্বীকার করার মতো বোকা কারণ এটি কেবল একটি বিশ্বব্যাপী


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

21
"আমরা" তাদের দিকে তাকাতে যাওয়ার কারণটি হ'ল "আমরা" খুব ঘন ঘন তাদের ভুল ব্যবহার করে দেখি এবং খুব বেশিবার। "আমরা" জানি যে তাদের কারণের জায়গা আছে।
বার্জার ফ্রেইন্ড-হানসেন

5
@ ফিল, আপনি "সময়ে সময়ে বলেছিলেন যে এটি আদর্শ সমাধান হতে পারে এবং তাই এটি ব্যবহার করুন" stated ঠিক আছে, ঠিক কোন ক্ষেত্রে আমরা একটি সিঙ্গলটন দরকারী খুঁজে পাব?
পেসারিয়ার

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

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

219

গুগল থেকে মিসকো হেভির ঠিক এই বিষয়টিতে কিছু আকর্ষণীয় নিবন্ধ রয়েছে ...

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

সিলেটলেটন বিশ্বব্যাপী রাষ্ট্র ছাড়া আর কিছুই নয়। গ্লোবাল স্টেট এটিকে তৈরি করে যাতে আপনার অবজেক্টগুলি গোপনে এমন জিনিসগুলিকে ধরে রাখতে পারে যা তাদের এপিআইগুলিতে ঘোষিত হয় না এবং ফলস্বরূপ, সিঙ্গলেটগুলি আপনার এপিআইগুলিকে রোগতাত্ত্বিক মিথ্যাবাদী করে তোলে।

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


8
এই বিষয়টিতে মিসকোর নিবন্ধগুলি এই মুহুর্তে এটি ঘুরে দেখার সর্বোত্তম বিষয়।
ক্রিস মায়ার

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

17
@ ডিজিএম: হুবহু - আসলে, নিবন্ধটির 'যুক্তি' অংশের মধ্যে একটি বিশাল যৌক্তিক সংযোগ আছে, এবং 'সিঙ্গলেটনই কারণ' অংশ হিসাবে রয়েছে।
হার্পার শেলবি

1
মিস্কোর ক্রেডিটকার্ড নিবন্ধটি এই ধরণের অপব্যবহারের চূড়ান্ত উদাহরণ।
অ্যালেক্স 13

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

121

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

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


20
অ্যাপ্লিকেশন জুড়ে যে এক উদাহরণটি উপলব্ধ? উহু. গ্লোবাল । " সিঙ্গেলটন গ্লোবালগুলি মোড়ানোর জন্য কোনও ধরণ নয় " হয় নিরীহ বা বিভ্রান্তিমূলক, সংজ্ঞা অনুসারে , প্যাটার্নটি একটি বিশ্বব্যাপী উদাহরণকে ঘিরে একটি শ্রেণিকে আবৃত করে ।
সিএওও

26
আপনার অ্যাপ্লিকেশন শুরু হওয়ার সাথে সাথে আপনি অবশ্যই ক্লাসের একটি উদাহরণ তৈরি করতে মুক্ত হন এবং কোনও ইন্টারফেসের মাধ্যমে এটি ব্যবহার করে এমন কোনও কিছুতে সেই উদাহরণটি ইনজেকশনের জন্য নিখুঁত। বাস্তবায়নের যত্ন নেওয়া উচিত নয় যে কেবলমাত্র একটি থাকতে পারে।
স্কট হুইটলক

4
@ ডেইনিয়াস: শেষ পর্যন্ত আসলে নেই। অবশ্যই, আপনি অন্যথায় ইচ্ছামতভাবে উদাহরণটি প্রতিস্থাপন করতে পাবেন না। (যাদের facepalm-inducing মুহূর্ত ছাড়া যখন আপনাকে যা করতে আমি আসলে দেখেছি। setInstanceআগে পদ্ধতি।) কষ্টসহকারে, গুরুত্বপূর্ণ যে যদিও - যে করেনা যে, "প্রয়োজন" একটি Singleton হয় encapsulation সম্পর্কে একটি freaking জিনিস জানেন না বা কি দোষ করল পরিবর্তনীয় গ্লোবাল রাষ্ট্র, তাই তিনি সাহায্যকারী (?) প্রত্যেকের জন্য সেটটার সরবরাহ করেছিলেন। একক। ক্ষেত্র। (এবং হ্যাঁ, এটি ঘটে A অনেক কিছু the আমি বন্যে দেখেছি প্রায় প্রতিটি
সিঙ্গলটন

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

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

72

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

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

সুতরাং মূলত:

public MyConstructor(Singleton singleton) {
    this.singleton = singleton;
}

বরং:

public MyConstructor() {
    this.singleton = Singleton.getInstance();
}

আমি বিশ্বাস করি যে এই ধরণের প্যাটার্নটিকে নির্ভরতা ইনজেকশন বলা হয় এবং সাধারণত একটি ভাল জিনিস হিসাবে বিবেচিত হয়।

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


17
হেই, আপনি যদি সর্বত্র এটি করেন, তবে আপনাকে সর্বত্র সিঙ্গেলটনের একটি রেফারেন্স দিতে হবে এবং এইভাবে আপনার আর কোনও সিঙ্গলটন নেই। :) (যা সাধারণত একটি ভাল জিনিস আইএমও হয়))
বার্জার ফ্রেইন্ড-হানসেন

2
@ বার্জারফ্রেন্ড-হানসেন - ননসেন্স, আপনি কীসের কথা বলছেন? একটি সিঙ্গলটন কেবল একটি ক্লাসের উদাহরণ যা একবার তাত্ক্ষণিক হয়। এই জাতীয় সিঙ্গলটনের উল্লেখ করা প্রকৃত অবজেক্টটি অনুলিপি করে না, এটি কেবল এটির উল্লেখ করে - আপনি এখনও একই জিনিস পেয়েছেন (পড়ুন: সিঙ্গলটন)।
এম মিম্পেন

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

2
@ সিএইচও আমি আপনাকে অনুসরণ করি না বা আমি কাকে বলেছি তা আপনি বুঝতে পারবেন না - এটি বার্জার ফ্রেইন্ড-হানসেনের কাছে। বার্জারে উল্লেখ করা হয়েছে যে সিঙ্গলটনের ফলাফলের কয়েকটি উল্লেখের সাথে বেশ কয়েকটি সিলেটলেট রয়েছে। গভীর-অনুলিপি না থাকায় এটি অবশ্যই সত্য নয়।
এম মিম্পেন

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

69

সিঙ্গলটন প্যাটার্নটি নিজের মধ্যে কোনও সমস্যা নয়। সমস্যাটি হ'ল এই প্যাটার্নটি প্রায়শই ওও ধারণাগুলির দৃ gra় উপলব্ধি না করে অবজেক্ট-ওরিয়েন্টেড সরঞ্জামগুলির সাথে সফ্টওয়্যার বিকাশকারীরা ব্যবহার করেন। যখন এই প্রসঙ্গে সিলেটলেটগুলি চালু করা হয় তখন তারা অযৌক্তিক শ্রেণিতে পরিণত হয় যার প্রতি অল্প ব্যবহারের জন্য সহায়ক পদ্ধতি থাকে।

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

একটি আবর্জনা সংগ্রহ পরিবেশ singletons দ্রুত মেমরি ব্যবস্থাপনা সংক্রান্ত একটি বিষয় হতে পারে।

মাল্টি-থ্রেডেড দৃশ্যও রয়েছে যেখানে সিলেটলেটগুলি একটি সিঙ্ক্রোনাইজেশন ইস্যুর পাশাপাশি বাধা হতে পারে।


4
আমি জানি এটি বহু বছরের পুরনো সুতো। হাই @ কিমোজ আপনি বলেছেন: - মেমোরি পরিচালনার ক্ষেত্রে সিলেটলেটগুলি দ্রুত একটি ইস্যুতে পরিণত হতে পারে। সিঙ্গেলটন এবং আবর্জনা সংগ্রহের ক্ষেত্রে কী ধরণের সমস্যা আসতে পারে তা আরও বিশদে ব্যাখ্যা করতে চাই।
থমাস

কিমোজ, প্রশ্নটি জিজ্ঞাসা করছে "কেন সিঙ্গলটন প্যাটার্নটি নিজের মধ্যে সমস্যা নয়?" এবং আপনি কেবলমাত্র পয়েন্টটি পুনরাবৃত্তি করেছেন তবে সিঙ্গলটন প্যাটার্নের একক বৈধ ব্যবহারের কেসও সরবরাহ করেন নি।
পেসারিয়ার

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

54

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


9
এটি ইউনিট টেস্টিংয়ের মতো সমস্যার মতো আরও শোনায় যা বস্তু (ইউনিট), ফাংশন (ইউনিট), পুরো লাইব্রেরি (ইউনিট) পরীক্ষা করতে পারে তবে শ্রেণিতে স্থায়ী কিছুতে (এছাড়াও ইউনিট) ব্যর্থ হয়।
v010dya

2
আপনি কি সব বাহ্যিক রেফারেন্সকে যাইহোক উপহাস করার মতো মনে করেন না? আপনি যদি হন তবে মক সিঙ্গলটনে সমস্যা কী, যদি না হয় তবে আপনি কি সত্যই ইউনিট টেস্টিং করছেন?
ডাইনিয়াস

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

পাওয়ারমক স্থির স্টাফগুলিকে উপহাস করতে পারে।
Snicolas

কোন বিষয়টিকে ঠাট্টা করার অর্থ আসল বস্তু তৈরির অর্থ কী? যদি বিদ্রূপের দ্বারা কোনও আসল অবজেক্ট তৈরি না হয় তবে ক্লাসটি সিঙ্গলটন বা পদ্ধতি স্থির কিনা তা বিবেচনা করে কেন?
অরুণ রাজ

45

ক্লাস্টারিংয়ের ক্ষেত্রে সিঙ্গললেটগুলিও খারাপ । তারপরে, আপনার অ্যাপ্লিকেশনটিতে আর "ঠিক একটি সিঙ্গলটন" নেই।

নিম্নলিখিত পরিস্থিতিটি বিবেচনা করুন: বিকাশকারী হিসাবে আপনাকে একটি ওয়েব অ্যাপ্লিকেশন তৈরি করতে হবে যা একটি ডাটাবেস অ্যাক্সেস করে। একযোগে ডাটাবেস কলগুলি একে অপরের বিরোধিত না করে তা নিশ্চিত করতে আপনি একটি থ্রেড-সেভ তৈরি করেনSingletonDao :

public class SingletonDao {
    // songleton's static variable and getInstance() method etc. omitted
    public void writeXYZ(...){
        synchronized(...){
            // some database writing operations...
        }
    }
}

সুতরাং আপনি নিশ্চিত যে আপনার আবেদনে কেবলমাত্র একটি সিঙ্গলটন রয়েছে এবং সমস্ত ডাটাবেস কেবল এটির মধ্য দিয়ে যায় SingletonDao। আপনার উত্পাদনের পরিবেশটি এখন এমন দেখাচ্ছে: একক একা

এখন পর্যন্ত সবকিছু ঠিক আছে।

এখন, আপনি একটি ক্লাস্টারে আপনার ওয়েব অ্যাপ্লিকেশনটির একাধিক উদাহরণ স্থাপন করতে চান তা বিবেচনা করুন। এখন, আপনার হঠাৎ করে এরকম কিছু রয়েছে:

অনেক সিলেটলেট

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

অবশ্যই এটি একটি সিঙ্গলটনের খারাপ ব্যবহারের উদাহরণ। তবে এই উদাহরণটির বার্তাটি হ'ল: আপনি নির্ভর করতে পারবেন না যে আপনার অ্যাপ্লিকেশনটিতে সিঙ্গলটনের ঠিক একটি উদাহরণ রয়েছে - বিশেষত যখন ক্লাস্টারিংয়ের বিষয়টি আসে।


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

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

39
  1. এটি সহজেই (আব) গ্লোবাল ভেরিয়েবল হিসাবে ব্যবহৃত হয়।
  2. সিলেটনের উপর নির্ভরশীল ক্লাসগুলি বিচ্ছিন্নতায় ইউনিট পরীক্ষার তুলনায় তুলনামূলকভাবে শক্ত।

33

একচেটিয়া হ'ল শয়তান এবং অ-পঠনযোগ্য / পরিবর্তনযোগ্য স্থিতিযুক্ত একক 'হ'ল' আসল 'সমস্যা ...

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

গ্লোবাল খারাপ কারণ:

  • ক। এটি নেমস্পেস দ্বন্দ্ব সৃষ্টি করে
  • খ। এটি অনিয়ন্ত্রিত ফ্যাশনে রাজ্যকে প্রকাশ করে

যখন সিঙ্গলেটনের কথা আসে

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

শেষ বিবৃতিতে তিনি ব্লগের 'সিলেটলেটস মিথ্যাবাদী' ধারণাটি উল্লেখ করছেন।

এটি একচেটিয়া ক্ষেত্রে কীভাবে প্রযোজ্য?

একচেটিয়া খেলা শুরু করতে প্রথমে:

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

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

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

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

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

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

এটি কীভাবে প্রোগ্রামিংয়ে প্রযোজ্য?

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

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

একটি সিঙ্গলটন কেবলমাত্র একটি বিকল্প যদি আপনার প্রয়োজন হয় সিঙ্গলটন যা সরবরাহ করে। একটি অবজেক্টের কেবল একটি পঠনযোগ্য পাঠ্য উদাহরণ। একই নিয়মের সাথে অবজেক্টের বৈশিষ্ট্য / সদস্যদেরও ক্যাসকেড করা উচিত।


1
যদি সিঙ্গলটন কিছু তথ্য নগদ করে?
ইওলা

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

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

28

সিঙ্গলটন একক উদাহরণ সম্পর্কে নয়!

অন্যান্য উত্তরের বিপরীতে আমি সিঙ্গলটনের সাথে কী ভুল তা নিয়ে কথা বলতে চাই না তবে সঠিকভাবে ব্যবহার করা হলে তারা কতটা শক্তিশালী এবং দুর্দান্ত esome

  • সমস্যা : একা একাধিক থ্রেডিং পরিবেশে চ্যালেঞ্জ হতে পারে
    সমাধান : আপনার সিঙ্গলটনের সমস্ত নির্ভরতা শুরু করতে একক থ্রেডযুক্ত বুটস্ট্র্যাপ প্রক্রিয়াটি ব্যবহার করুন।
  • সমস্যা : একক মানুষকে ঠাট্টা করা শক্ত।
    সমাধান : উপহাসের জন্য পদ্ধতিটির কারখানার প্যাটার্ন ব্যবহার করুন

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

যেমনটি আমি শিরোনামে বলেছি সিঙ্গলটন একক উদাহরণ নয়।

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

2
এটি সিঙ্গলেটনের সাথে আমার মূল সমস্যাটির সমাধান করে না যা হ'ল তারা আপনার প্রকল্পের কয়েক হাজার শ্রেণীর মধ্য থেকে বৈশ্বিক রাজ্যে প্রবেশের অনুমতি দেয়।
কিংবদন্তি লেন্থথ

8
উদ্দেশ্য হবে ...
ইলিয়া গাজমান

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

23

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

আমি যে দুটি বৃহত্তম স্ক্রু আপ দেখছি তা হ'ল: এটির মতো একটি বিশ্বব্যাপী চিকিত্সা করা এবং সিঙ্গেলটন বন্ধের সংজ্ঞা দিতে ব্যর্থ।

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

সিঙ্গলটন প্রসঙ্গটিও সত্যই গুরুত্বপূর্ণ। সিঙ্গেলনের নির্ধারিত বৈশিষ্ট্যটি হ'ল "কেবল একটি" আছে, তবে সত্যটি হ'ল এটি কোনও একক প্রসঙ্গে / নেমস্পেসের মধ্যে "কেবল একটি"। এগুলি সাধারণত একটি: থ্রেড, প্রসেস, আইপি ঠিকানা বা ক্লাস্টার প্রতি এক, তবে প্রসেসর, মেশিন, ভাষার নাম স্থান / শ্রেণি লোডার / যাই হোক না কেন, সাবনেট, ইন্টারনেট ইত্যাদি এক হতে পারে

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

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

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


23

উইকিপিডিয়া সিঙ্গলটন_প্যাটার্ন দেখুন

এটি কিছু লোকের দ্বারা একটি বিরোধী নিদর্শন হিসাবেও বিবেচিত হয়, যারা মনে করেন যে এটি অত্যধিক ব্যবহৃত হয়, এমন পরিস্থিতিতে যেখানে শ্রেণীর একক উদাহরণ প্রয়োজন হয় না সেখানে অপ্রয়োজনীয় সীমাবদ্ধতাগুলি প্রবর্তন করে। [1] [2] [3] [4]

তথ্যসূত্র (নিবন্ধ থেকে শুধুমাত্র প্রাসঙ্গিক রেফারেন্স)

  1. ^ অ্যালেক্স মিলার। আমি যে প্যাটার্নগুলি ঘৃণা করি # 1: সিঙ্গলটন , জুলাই 2007
  2. ^ স্কট ডেনসমোর। কেন সিলেটলেটগুলি মন্দ , মে 2004
  3. ^ স্টিভ ইয়েজ সিঙ্গলেটগুলি বোকা হিসাবে বিবেচনা করা হয় , সেপ্টেম্বর 2004
  4. ^ জেবি রেইনসবার্গার, আইবিএম। আপনার সিলেটলেটগুলি বুদ্ধিমানের সাথে ব্যবহার করুন , জুলাই 2001

8
প্যাটার্ন সম্পর্কে একটি বিবরণ ব্যাখ্যা করে না যে কেন এটিকে মন্দ হিসাবে বিবেচনা করা হয় ...
Jrgns

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

17

এটি এমন নয় যে সিলেটলেটগুলি নিজেরাই খারাপ তবে জিওএফ ডিজাইনের ধরণটি। সত্যই যুক্তি যা বৈধ তা হ'ল জিওএফ ডিজাইনের ধরণটি পরীক্ষার ক্ষেত্রে নিজেকে ধার দেয় না, বিশেষত যদি পরীক্ষাগুলি সমান্তরালে চালিত হয়।

কোনও শ্রেণীর একক উদাহরণ ব্যবহার করা যতক্ষণ না আপনি কোডে নিম্নলিখিত উপায়গুলি প্রয়োগ করেন ততক্ষণ বৈধ নির্মাণ ruct

  1. সিঙ্গলটন হিসাবে ব্যবহৃত ক্লাসটি একটি ইন্টারফেস প্রয়োগ করে তা নিশ্চিত করুন। এটি একই ইন্টারফেস ব্যবহার করে স্টাবগুলি বা মককে বাস্তবায়িত করতে দেয়

  2. নিশ্চিত করুন যে সিঙ্গলটন থ্রেড-নিরাপদ। এটি একটি প্রদত্ত

  3. সিঙ্গলটন প্রকৃতিতে সহজ হওয়া উচিত এবং অতিরিক্ত জটিল নয়।

  4. আপনার অ্যাপ্লিকেশনটির রানটাইম চলাকালীন, যেখানে সিলেটলেটনগুলি একটি নির্দিষ্ট অবজেক্টে পাস করতে হবে, এমন ক্লাস ফ্যাক্টরি ব্যবহার করুন যা সেই বস্তুটি তৈরি করে এবং ক্লাস ফ্যাক্টরিটিকে প্রয়োজনীয় ক্লাসে সিঙ্গলটন উদাহরণটি পাস করবে।

  5. পরীক্ষার সময় এবং নির্বিচারবাদী আচরণের বিষয়টি নিশ্চিত করার জন্য, সিঙ্গলটন শ্রেণিকে পৃথক উদাহরণ হিসাবে প্রকৃত শ্রেণি হিসাবে তৈরি করুন বা স্টাব / উপহাস যা তার আচরণটি প্রয়োগ করে এবং প্রয়োজনীয় শ্রেণীর মতো এটি পাস করে। শ্রেণীর ফ্যাক্টরটি ব্যবহার করবেন না যা পরীক্ষার সময় সেই বস্তুকে তৈরি করে যা পরীক্ষার সময় সিঙ্গলটনের প্রয়োজন কারণ এটির একক বিশ্বব্যাপী উদাহরণটি পাস করবে, যা উদ্দেশ্যকে পরাস্ত করে।

আমরা আমাদের সমাধানগুলিতে সিঙ্গেলনগুলি প্রচুর সাফল্যের সাথে ব্যবহার করেছি যা পরীক্ষামূলকভাবে সমান্তরাল পরীক্ষা চালানোর স্ট্রিমগুলিতে নির্বিচারক আচরণ নিশ্চিত করে।


+1, শেষ পর্যন্ত এমন একটি উত্তর যা ঠিকানা দেয় যখন কোনও সিঙ্গলটন বৈধ হতে পারে।
পেসারিয়ার

16

আমি গৃহীত উত্তরের 4 টি পয়েন্টটি সম্বোধন করতে চাই, আশা করি কেউ আমার ভুল কেন করছেন তা ব্যাখ্যা করতে পারে।

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

    "এটিকে ঘিরে এড়াতে বিশ্বব্যাপী কিছু তৈরি করা কোডের গন্ধ।" সিঙ্গলটনের কোড গন্ধ এড়াতে কেন কিছু কাছাকাছি চলে যাচ্ছে না?

    যদি আপনি কেবল একটি সিঙ্গলটন এড়ানোর জন্য কোনও কল স্ট্যাকের 10 টি ক্রিয়াকলাপের মধ্য দিয়ে কোনও বিষয় অতিক্রম করছেন, তা কি এত দুর্দান্ত?

  2. একক দায়িত্বের নীতি: আমি মনে করি এটি কিছুটা অস্পষ্ট এবং আপনার দায়বদ্ধতার সংজ্ঞা উপর নির্ভর করে। একটি প্রাসঙ্গিক প্রশ্ন হবে, কেন একটি নির্দিষ্ট বিষয়ে এই নির্দিষ্ট "দায়িত্ব" যুক্ত করা হয়?

  3. ক্লাসে কোনও বস্তুকে পাস করা কেন ক্লাসের মধ্যে থেকে object বস্তুকে সিঙ্গলটন হিসাবে ব্যবহার করার চেয়ে আরও দৃ tight়তার সাথে মিলিত করে?

  4. রাজ্য কত দিন স্থায়ী হয় কেন এটি পরিবর্তিত হয়? সিঙ্গলেটগুলি ম্যানুয়ালি তৈরি বা ধ্বংস করা যায়, তাই নিয়ন্ত্রণটি এখনও রয়েছে এবং আপনি আজীবন একইরকম করতে পারেন নন-সিঙ্গলটন অবজেক্টের জীবনকাল।

ইউনিট পরীক্ষা সংক্রান্ত:

  • সমস্ত ক্লাসের ইউনিট পরীক্ষার প্রয়োজন হয় না
  • ইউনিট পরীক্ষা করা দরকার এমন সমস্ত শ্রেণির সিঙ্গলটনের বাস্তবায়ন পরিবর্তন করার দরকার নেই
  • যদি তারা না ইউনিট পরীক্ষিত হতে হবে এবং বাস্তবায়ন পরিবর্তন করার প্রয়োজন তার জন্য দরকার, এটা Singleton নির্ভরতা ইনজেকশন মাধ্যমে এটি প্রেরণ করা হচ্ছে জন্য একটি Singleton ব্যবহার থেকে একটি বর্গ পরিবর্তন করা সহজ।

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

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

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

2
৪. আমি নিশ্চিত নই যে "ম্যানুয়ালি বিনষ্ট করা যায় না" "এটি একটি মাত্র উদাহরণ হতে পারে" এর যৌক্তিক নিদর্শন। আপনি যদি সিঙ্গলটনকে এভাবেই সংজ্ঞায়িত করেন তবে আমরা একই জিনিসটির বিষয়ে কথা বলছি না। সমস্ত ক্লাস ইউনিট পরীক্ষা করা উচিত নয় । এটি একটি ব্যবসায়ের সিদ্ধান্ত এবং কখনও কখনও সময়-বাজারে বা বিকাশের ব্যয় অগ্রাধিকার গ্রহণ করে।
জন

1
৩. যদি আপনি পলিমারফিজম না চান, তবে আপনার এমনকি কোনও উদাহরণেরও দরকার নেই। আপনি এটিকে একটি স্ট্যাটিক ক্লাস হিসাবে তৈরি করতে পারেন, যার ফলে আপনি নিজেকে কোনও একক বস্তু এবং একক বাস্তবায়নের সাথে বেঁধে রাখছেন - এবং কমপক্ষে এপিআই আপনাকে এতটা মিথ্যা বলে না।
সিএইচও

15

ভিন্স হস্টনের এই মানদণ্ড রয়েছে, যা আমার কাছে যুক্তিসঙ্গত বলে মনে হয়:

নিম্নলিখিত একক তিনটি মানদণ্ড সন্তুষ্ট হলেই সিঙ্গলটন বিবেচনা করা উচিত:

  • একক উদাহরণের মালিকানা যথাযথভাবে বরাদ্দ করা যায় না
  • অলস সূচনাটি কাম্য
  • বৈশ্বিক অ্যাক্সেস অন্যথায় সরবরাহ করা হয় না

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


14

সিঙ্গললেটগুলি পিউরিস্ট দৃষ্টিকোণ থেকে খারাপ।

বাস্তবের দৃষ্টিকোণ থেকে, একটি সিঙ্গলটন হ'ল একটি বাণিজ্য-বন্ধ বিকাশ সময় বনাম জটিলতা

আপনি যদি জানেন তবে আপনার অ্যাপ্লিকেশনটি এতটা পরিবর্তন করবে না যে তারা ঠিকঠাকভাবে যেতে পারে। কেবলমাত্র জেনে রাখুন যে আপনার প্রয়োজনীয়তা অপ্রত্যাশিতভাবে পরিবর্তিত হয় (বেশিরভাগ ক্ষেত্রে এটি বেশ ঠিক আছে) things

সিলেটলেটগুলি কখনও কখনও ইউনিট পরীক্ষাও জটিল করে তোলে


3
আমার অভিজ্ঞতা হ'ল সিঙ্গেলন দিয়ে শুরু করা খুব অল্প সময়েই আপনাকে সত্যিই আঘাত করবে, দীর্ঘমেয়াদী গণনা না করে। এই প্রভাবটি আমার পক্ষে কম হতে পারে যদি অ্যাপ্লিকেশনটি ইতিমধ্যে কিছু সময়ের জন্য বিদ্যমান থাকে এবং সম্ভবত ইতিমধ্যে অন্য একক সিলেটের সাথে সংক্রামিত হয়। গোড়া থেকে শুরু? এগুলি যে কোনও মূল্যে এড়িয়ে চলুন! কোনও বস্তুর একক উদাহরণ চান? কোনও ফ্যাক্টরি এই পদার্থের ইনস্ট্যান্টেশন পরিচালনা করতে দিন।
সোভেন

1
আমি যতদূর জানি একক হল একটি কারখানা পদ্ধতি। এইভাবে আমি আপনার প্রস্তাবটি পাই না।
টাকোন

3
"একটি ফ্যাক্টরি"! = "একটি কারখানা_ধর্মী যা একই শ্রেণীর অন্যান্য দরকারী জিনিস থেকে আলাদা করা যায় না"
সোভেন

13

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

আমি বিশ্বাস করি যে প্রতিক্রিয়াটি এর অত্যধিক ব্যবহারের কারণে, যা পরিবর্তিতভাবে বোঝা এবং বাস্তবায়নের পক্ষে এটি সবচেয়ে সহজ প্যাটার্নের কারণে।


6
আমি মনে করি যে প্রতিক্রিয়াটির সাথে আনুষ্ঠানিক ইউনিট পরীক্ষার অনুশীলনকারীরা আরও বুঝতে পেরেছিলেন যে তারা মোকাবিলার জন্য দুঃস্বপ্ন।
জিম বার্গার

1
এটি কেন -1 এ নিশ্চিত নয় Not এটি সবচেয়ে বর্ণনামূলক উত্তর নয় তবে তিনিও ভুল নন।
আউটলা প্রোগ্রামার

13

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


3
স্প্রিং মটরশুটি না, ডিফল্টরূপে, সিঙ্গলেটস?
পাতলা

3
হ্যাঁ, তবে আমার অর্থ 'কোডিং' সিঙ্গেলটন। আমি 'সিঙ্গলটন' লিখে নেই (অর্থাত্ ডিজাইনের ধরণ অনুসারে প্রাইভেট কনস্ট্রাক্টর ইয়াদ ইয়াদা ইয়াদা) - তবে হ্যাঁ, বসন্তের সাথে আমি একটি একক উদাহরণ ব্যবহার করছি।
prule

4
সুতরাং যখন অন্যরা এটি করে, এটি ঠিক আছে (যদি আমি এটি পরে ব্যবহার করব) তবে অন্যরা যদি তা করে এবং আমি এটি ব্যবহার না করি তবে এটি মন্দ?
ডেইনিয়াস

11

সিঙ্গেলটন হ'ল একটি নিদর্শন এবং অন্য যে কোনও সরঞ্জামের মতোই এটি ব্যবহার বা আপত্তিজনক ব্যবহার করা যেতে পারে।

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


1
ধন্যবাদ লোকি :) ঠিক আমার বক্তব্য। পুরো জাদুকরী শিকার আমাকে গোটো বিতর্কের কথা মনে করিয়ে দেয়। সরঞ্জামগুলি এমন লোকদের জন্য যারা তাদের কীভাবে ব্যবহার করতে জানে; আপনার পছন্দ নয় এমন কোনও সরঞ্জাম ব্যবহার করা আপনার পক্ষে বিপজ্জনক হতে পারে তাই এড়াতে কিন্তু অন্যকে এটি ব্যবহার করতে / সঠিকভাবে ব্যবহার করতে শিখতে বলবেন না। আমি হুবহু "প্রো-সিঙ্গেলটন" নই তবে আমার কাছে এ জাতীয় সরঞ্জাম রয়েছে এবং এটি ব্যবহার করার পক্ষে এটি কোথায় উপযুক্ত তা আমি অনুভব করতে পারি like সময়কাল।
dkellner

8

আপনি যখন সিলেটলেটস ব্যবহার করে কোড লিখবেন, বলুন, লগার বা একটি ডেটাবেস সংযোগ এবং এরপরে আপনি আবিষ্কার করেন যে আপনার একাধিক লগ বা একাধিক ডাটাবেস প্রয়োজন, আপনি সমস্যায় পড়েছেন।

সিলেটলেটগুলি এগুলি থেকে নিয়মিত বস্তুগুলিতে স্থান দেওয়া খুব কঠিন করে তোলে।

এছাড়াও, একটি নন-থ্রেড-নিরাপদ সিঙ্গলটন লিখতে খুব সহজ।

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

void some_class::some_function(parameters, service_provider& srv)
{
    srv.get<error_logger>().log("Hi there!");
    this->another_function(some_other_parameters, srv);
}

4
প্রতিটি পদ্ধতির পক্ষে যুক্তিটি উজ্জ্বল, এটি আপনার এপিআইকে কীভাবে দূষিত করতে পারে তা কমপক্ষে শীর্ষ 10 টি উপায়ে যাওয়া উচিত।
ডাইনিয়াস

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

আপনি যা পরীক্ষা করছেন তা নির্ভর করে, আপনি যদি সিঙ্গলটনের পরীক্ষা নিরীক্ষা না করে থাকেন তবে কেন এটির আচরণের যত্ন করছেন, যদি আপনার 2 টি দূরবর্তী বস্তু একে অপরের আচরণের উপর নির্ভর করে তবে এটি সিঙ্গলটনের সমস্যা নয় ...
ডেইনিয়াস

আপনি কোন ভাষাটি নীস্টযুক্ত কলগুলিতে প্রচার করতে পারবেন?
ডেইনিয়াস

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

8

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

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

এফডব্লিউআইডাব্লু, আপনি যদি এটি পিআইএ পরীক্ষা করার ইউনিট করার চেষ্টা করেন তবে এটি ডিআইবি, বাগ ফিক্স বা উন্নত করার চেষ্টা করার সময় এটি পিআইএতে চলে যাবে।


8

ক্রিস রেথের এই বিষয়ে সাম্প্রতিক নিবন্ধটি কোডিং ছাড়াই মন্তব্যে

দ্রষ্টব্য: মন্তব্য ছাড়াই কোডিং আর বৈধ নয়। যাইহোক, নিবন্ধটি লিঙ্ক করা হচ্ছে অন্য ব্যবহারকারী দ্বারা ক্লোন করা হয়েছে।

http://geekswithblogs.net/AngelEyes/archive/2013/09/08/singleton-i-love-you-but-youre-bringing-me-down-re-uploaded.aspx


7

সিলেটলেটগুলি খারাপ নয়। এটি তখনই খারাপ যখন আপনি বিশ্বব্যাপী অনন্য কিছু তৈরি করেন যা বিশ্বব্যাপী অনন্য নয়।

তবে, "অ্যাপ্লিকেশন স্কোপ পরিষেবাদি" রয়েছে (এমন কোনও মেসেজিং সিস্টেম সম্পর্কে চিন্তা করুন যা উপাদানগুলিকে ইন্টারঅ্যাক্ট করে তোলে) - এটি একটি সিঙ্গলটনের জন্য, "মেসেজকিউ" - ক্লাসের একটি পদ্ধতি যা "সেন্ডম্যাসেজ (...)" রয়েছে।

তারপরে আপনি পুরো জায়গা থেকে নিম্নলিখিতটি করতে পারেন:

মেসেজকিউ.কেনর.সেন্ডমেসেজ (নতুন মেলআরাইভডমেজেজ (...));

এবং, অবশ্যই, করুন:

MessageQueue.Current.RegisterReceiver (এই);

IMessageReceiver বাস্তবায়নকারী ক্লাসে।


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

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

7

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


অনেক লোক असुरक्षित মাল্টি-থ্রেডেড কোড লিখেন, তার মানে কি আমাদের থ্রেডগুলি মুছে ফেলা উচিত?
ডেইনিয়াস

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

@ ডেইনিয়াস: এবং অবশ্যই এটি ধরে নিচ্ছে যে সৎ-থেকে-সদ্ব্যবহারের সামঞ্জস্য প্রয়োজন। ওএসের জন্য অন্য কিছু করার জন্য অপেক্ষা করার সময় প্রায়শই আপনি যা চান তা হ'ল একটি কাজ করতে সক্ষম হোন। (উদাহরণস্বরূপ, সকেট থেকে পড়ার সময় ইউআই আপডেট করে)
সিএওও

সুতরাং আপনার কাছে যদি বিশাল মেট্রিক্সের ডেটা থাকে, আপনার যে প্রক্রিয়া প্রক্রিয়া প্রয়োজন, একক থ্রেডে এটি করা ভাল, কারণ অনেক লোকের পক্ষে এটি ভুল হতে পারে ..
ডেইনিয়াস

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

6

এখানে সিলেটলেট সম্পর্কিত আরও একটি বিষয় যা এখনও কেউ বলেনি।

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

আইওসি সিঙ্গেলটনের বিপরীতে জিওএফ সিঙ্গেলনগুলি getInstance () পদ্ধতির মাধ্যমে ইন্টারফেসে "এককভাবে" প্রকাশ করার কথা বলেছে এবং যাতে তারা উপরে বর্ণিত সমস্ত কিছুতে ভোগে।


3
আমার মতে, "এককতা" একটি রান-টাইম পরিবেশের বিশদ, এবং ক্লাস কোডটি লিখেছিল এমন প্রোগ্রামার দ্বারা বিবেচনা করা উচিত নয়। বরং ক্লাসটি ব্যবহারকারী দ্বারা তৈরি করা বিবেচনা। প্রকৃতপক্ষে কতগুলি দৃষ্টান্ত প্রয়োজন তা কেবলমাত্র ব্যবহারকারীরা জানেন।
আর্থ ইঞ্জিন

5

সিলেটলেটগুলি মন্দ নয় , আপনি যদি এটি সঠিকভাবে এবং ন্যূনতমভাবে ব্যবহার করেন । অন্যান্য অনেক ভাল নকশার নিদর্শন রয়েছে যা একক সময়ে সিঙ্গলটনের প্রয়োজনগুলির প্রতিস্থাপন করে (এবং সর্বোত্তম ফলাফলও দেয়)। তবে কিছু প্রোগ্রামাররা সেই ভাল নিদর্শনগুলি সম্পর্কে অবগত নয় এবং সমস্ত ক্ষেত্রে সিঙ্গেলটন ব্যবহার করে যা সিঙ্গলটন তাদের জন্য মন্দ করে।


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

মূলত বিকল্পটি হ'ল বৈশ্বিক রাষ্ট্রের মাধ্যমে অ্যাক্সেস না করে পদ্ধতির পরামিতিগুলির মাধ্যমে বস্তুগুলি পাস করা।
কিংবদন্তি লেন্থথ

5

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

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

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

সিঙ্গলটন পরীক্ষায় সমস্যা সৃষ্টি করে তা হ'ল তাদের হার্ড কোডিং একক ব্যবহারের কেস / পরিবেশের লক্ষণ। পরীক্ষার স্যুট এবং অনেকগুলি পরীক্ষাগুলি প্রতিটি স্বতন্ত্র এবং এমন কিছু পৃথক করে যা একটি সিঙ্গলটনের জন্য হার্ড কোডিংয়ের সাথে উপযুক্ত নয়।


4

যেহেতু তারা মূলত ওরিয়েন্টেড গ্লোবাল ভেরিয়েবলগুলি অবজেক্ট, আপনি সাধারণত আপনার ক্লাসগুলি এমনভাবে ডিজাইন করতে পারেন যাতে আপনার প্রয়োজন হয় না।


আপনি যদি ক্লাস একবারে সীমাবদ্ধ না হন, আপনার আপনার ক্লাসে স্থিতিশীল সদস্যদের দরকার যা আপনার বর্গক্ষেত্র দ্বারা পরিচালিত যা প্রায় একই জিনিস থেকে আসে! আপনার প্রস্তাবিত বিকল্প কি?
পৌঁছান

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

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

1
@ স্যালভিন ডিবাগ করার সময় মেইনস্ক্রিন সম্পর্কে যুক্তিযুক্ত হওয়া কতটা কঠিন তা বিবেচনা করুন যদি এটি অনেকগুলি উপাদান দ্বারা 'নীরবে' আপডেট করা হচ্ছে। আপনার উদাহরণটি হ'ল সিঙ্গেলনগুলি খারাপ হওয়ার কারণ reason
কিংবদন্তি লেন্থথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.