অপরিবর্তনীয় / রাষ্ট্রবিহীন সিলেটলেটগুলি কি খারাপ?


12

ইদানীং সিঙ্গেলনের বিরুদ্ধে একধরনের বিপ্লব হয়েছে, তবে তারা রাষ্ট্রহীন হলে তাদের কি কিছু ভুল আছে?

আমি অত্যধিক ব্যবহারের কথা এবং সমস্ত জানি ... এটি কেবলমাত্র সিলেটলেট নয়, সমস্ত কিছুর জন্য প্রযোজ্য।


1
না। সিঙ্গলেটগুলি নীতিগতভাবে খারাপ নয়, তারা কেবলমাত্র ব্যাপকভাবে অতিরিক্ত ব্যবহার করা হচ্ছে।
বার্ট ভ্যান ইনজেন শেেনা

3
ইদানীং আপনি কী বোঝাতে চেয়েছেন?
মনোজ আর

5
@ জোয়াচিম সাউর: আপনার প্রতিস্থাপনের প্রয়োজন হবে কেন; যদি এটি রাষ্ট্রহীন হয় তবে আপনি এটি সঠিকভাবে পরীক্ষা করতে পারেন।
m3th0dman

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

উত্তর:


12
  > Are immutable/stateless singletons bad?
  • না যদি তারা অন্যান্য বাহ্যিক সিস্টেমে নির্ভর করে না।
    • উদাহরণ: একটি স্ট্রিংগিলিটি যা কোনও স্ট্রিংয়ের মধ্যে এইচটিএমএল থেকে বেরিয়ে আসে।
    • কারণ: ইউনিটেটসগুলিতে এটি মক / সিমুলেটর দিয়ে প্রতিস্থাপন করার দরকার নেই।
  • হ্যাঁ যদি আপনার অপরিবর্তনীয় / স্টেটলেস সিঙ্গলটন অন্যান্য বাহ্যিক সিস্টেম / পরিষেবাদির উপর নির্ভর করে এবং আপনি যদি ইউনিটেষ্টিং করতে চান (বিচ্ছিন্নতায় পরীক্ষা)
    • উদাহরণ: একটি পরিষেবা যা বাহ্যিক কর-ক্যালকুলেটর-ওয়েবসার্ভিসের উপর নির্ভর করে।
    • কারণ: এই পরিষেবাদির সাথে ইউনিটেটগুলি করার জন্য (বিচ্ছিন্নভাবে) আপনাকে বাহ্যিক সিস্টেম / পরিষেবাদিগুলি অনুকরণ / উপহাস করতে হবে।

আরও তথ্যের জন্য দেখুন -পেঁয়াজ-আর্কিটেকচার


  • সিঙ্গেলন-গুলি ইউনিট-টেস্টিং করতে পারে (বিচ্ছিন্নভাবে) আরও জটিল / অসম্ভব এবং
  • লুকানো নির্ভরশীলতা / সংযুক্তিকে @YBee দ্বারা ব্যাখ্যা করা সমস্যা হিসাবে দেখা যেতে পারে

আমি সিলেটলেট ব্যবহার না করার অন্যান্য কারণগুলি দেখতে পাচ্ছি না।


আপনি যদি আপনার ক্লাস পরীক্ষা করতে চান তবে আপনাকে এটি বহিরাগত ওয়েব পরিষেবাটিকে উপহাস করতে হবে, যদিও এটি (রাষ্ট্রবিহীন) সিঙ্গলটন নাও রয়েছে।
m3th0dman

@ m3th0dman আমি রাজি
k3b

10

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

আপনার যদি স্টেটলেস সিঙ্গলটন থাকে তবে কেন কেবল স্ট্যাটিক পদ্ধতিতে অফার করা ক্লাস ব্যবহার করবেন না (বা স্ট্যাটিক ক্লাস ব্যবহার করবেন)?

এখানে সাধারণভাবে গ্লোবাল ভেরিয়েবল এবং সিলেটলেট সম্পর্কিত কিছু পোস্ট।

আমি লেখকের মতো কঠোর হতে চাই না তবে তিনি দেখিয়েছেন যে বেশিরভাগ ক্ষেত্রে যেখানে আপনি মনে করেন যে আপনাকে সিঙ্গলটন প্রয়োজন, সেখানে আপনার সত্যিকার প্রয়োজন নেই।


1
স্থির পদ্ধতি সহ কোনও শ্রেণি কেন ব্যবহার করবেন না? উত্তরাধিকার উদাহরণ হিসাবে ...
m3th0dman

3
@ এম 3 তম ডিডম্যান: উত্তরাধিকারের জন্য ভাল জায়গার মতো শোনাচ্ছে না।
বিলি ওনেল

@ বিলিওনিয়েল আপনি বলতে পারেন যে উত্তরাধিকারের জন্য কিছু ভাল বা খারাপ, আপনি যদি ডোমেন মডেলটি জানেন তবে সেভাবে কী মডেলিং করা যায় ...
এম

2
@ এম 3 তম 0 ডিম্যান: এরম, নং। আমি ডোমেন মডেল সম্পর্কে কিছুই না জেনে বেশ ইতিবাচক হতে পারি। উত্তরাধিকার বহির্মুখী আচরণের জন্য। তবে একটি সিঙ্গলটন হিসাবে, আপনি বহুকর্মী আচরণ করবেন না।
বিলি ওনিল

1
@ m3th0dman: কারণ সিঙ্গলটন অবজেক্টটি পেতে কল সাইটে সিঙ্গলটনের নাম উল্লেখ করা দরকার। যার অর্থ আপনি পলিমারফিক আচরণ ব্যবহার করছেন না। যার অর্থ হ'ল রচনা উত্তরাধিকারের চেয়ে অনেক বেশি নমনীয়।
বিলি ওনেল

7

স্থিতিশীল শ্রেণি যা করতে পারে তা তেমন কিছুই নেই যা অপরিবর্তনীয় স্টেটলেস সিঙ্গলটন করতে পারে।

জটিলতার অতিরিক্ত স্তর যুক্ত করার কোনও কারণ নেই যা -> দৃষ্টান্ত () সৃষ্টি করে, যখন একটি স্ট্যাটিক পদ্ধতিতে সরল কল স্পষ্টতর হয়, সম্পদের ক্ষেত্রে আরও রক্ষণশীল এবং সম্ভবত দ্রুততর হয়।

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


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

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

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

1
যে ক্লাসগুলিতে কেবল স্থিতিশীল ফাংশন রয়েছে, আপনি উত্তরাধিকার /
বহুবৈচিত্র্য

1
স্থিতিশীল শ্রেণি যা করতে পারে তা তেমন কিছুই নেই যা অপরিবর্তনীয় স্টেটলেস সিঙ্গলটন করতে পারে। ভাল, স্থিতিশীল পদ্ধতিগুলি একটি ইন্টারফেস বাস্তবায়ন করতে পারে না, যা একটি সিঙ্গলটন করতে পারে
মিশাল এম

3

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

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

interface Interface
{
    void Method();
}

class StatelessSingleton : Interface
{
    public static readonly StatelessSingleton Instance = new StatelessSingleton();
    private StatelessSingleton() { }

    public void Method() { }
}

class User
{
    public User(Interface i) { /* ... */ }
}

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

তবে, সম্ভবত আমাদের একটি ডিফল্ট প্রয়োগের জন্য অন্য প্যাটার্ন ব্যবহার করা উচিত:

class Implementation : Interface
{
    private readonly Action _method;

    public Implementation()
    {
        _method = new Action(() => { /* default */ });
    }

    public Implementation(Action custom)
    {
        _method = custom;
    }

    public void Method()
    {
        _method();
    }
}

এটি স্টেটলেসসিংলেটনের প্রতি শ্রদ্ধা প্রদর্শন করে তবে ইন্টারফেসের একটি জেনেরিক বাস্তবায়ন গঠন করে। অনুরূপ সমাধান আইপ্রোগ্রেস ইন্টারফেস দ্বারা ব্যবহৃত হয় ।

আবার যথেষ্ট, কেন ডিফল্ট আচরণের একাধিক বাস্তবায়ন তৈরি করার অনুমতি দেয়? তবুও আমরা দুটি একত্রিত করতে পারি:

class Implementation : Interface
{
    public readonly Implementation Default = new Implementation();

    private readonly Action _method;

    private Implementation()
    {
        _method = new Action(() => { /* default */ });
    }

    public Implementation(Action custom)
    {
        _method = custom;
    }

    public void Method()
    {
        _method();
    }
}

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.