সিঙ্গলটনের বিকল্প কী


114

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

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

উত্তর:


131

গুগল টেস্টিং ব্লগ (ক্রম testable কোড তৈরি করার জন্য) একক এড়ানো সম্পর্কে এন্ট্রি একটি সিরিজ আছে। হতে পারে এটি আপনাকে সহায়তা করতে পারে:

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

সংক্ষেপে আমরা নতুন অপারেটরগুলির সমস্ত একটি কারখানায় সরিয়ে নিয়েছি। আমরা অনুরূপ আজীবনের সমস্ত বস্তুকে একটি কারখানায় গ্রুপ করি group


3
*** সিঙ্গেলন এড়ানোর জন্য নির্ভরতা ইনজেকশন ব্যবহার করা
জাস্টিন

এই নিবন্ধগুলি গুগল সি ++ প্রোগ্রামিং মান হিসাবে ভাল!

2
সত্যিই ভাল না. 'স্ট্যাটিক পদ্ধতি ব্যবহার করবেন না' পরামর্শ সরাসরি স্কট মেয়ার্স / হার্ব সটারের ন্যূনতম ইন্টারফেস নীতিটির বিরুদ্ধে যায়। দরকারী পরামর্শ আছে, তবে তাদের একাধিক মনের অবদানের অভাব রয়েছে।
ম্যাথিউ এম।

@ ফ্র্যাঙ্কএস কেন আপনি লিঙ্কগুলির ক্রম পরিবর্তন করলেন? এটি প্রথমে ভাল কালানুক্রমিক ছিল।
ক্রেগক্স

@ কাওস আসলে কোনও ধারণা নেই, এটি চার বছরেরও বেশি আগে ছিল, সুতরাং আমি অনুমান করি যে এরপরে এর পিছনে আমার কিছু কারণ ছিল :-)
ফ্র্যাঙ্কস

15

পরিবর্তে একটি কারখানার প্যাটার্ন ব্যবহার করা সবচেয়ে ভাল উপায়। আপনি যখন আপনার শ্রেণীর একটি নতুন উদাহরণ তৈরি করেন (কারখানায়) আপনি সদ্য নির্মিত নির্মিত বস্তুর মধ্যে 'গ্লোবাল' ডেটা সন্নিবেশ করতে পারেন, কোনও একক উদাহরণের संदर्भ হিসাবে (যা আপনি কারখানার শ্রেণিতে সঞ্চয় করেন) বা প্রাসঙ্গিক অনুলিপি করে নতুন বস্তুর মধ্যে ডেটা।

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


1
আমি "সেরা উপায়" বিবৃতিতে একমত নই, তবে একটি ভাল বিকল্পের জন্য +1।
টাইলারম্যাক

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

2
@ ইস্টগোস্টকম: আমরা পাশাপাশি সিঙ্গলটন ব্যবহার করতে পারি এবং নিজের জন্য বিষয়গুলিকে কঠিন করার চেষ্টা বন্ধ করতে পারি :)
gbjbaanb

5

আমি সম্ভবত এখানে স্পষ্ট করে বলছি, তবে আপনি কি স্প্রিং বা গুইসের মতো নির্ভরতা-ইনজেকশন কাঠামো ব্যবহার করতে পারবেন না এমন কোনও কারণ আছে ? (আমি বিশ্বাস করি স্প্রিংটি। নেটও এখন উপলভ্য)।

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

এটাই আমি সাধারণত গ্রহণ করি!


4

আপনি যদি স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করেন তবে আপনি কেবল একটি নিয়মিত মটরশুটি তৈরি করতে পারেন। ডিফল্টরূপে (অথবা আপনি স্পষ্টভাবে সেট যদি scope="singleton") শিম মাত্র এক উদাহরণ হিসেবে বলা যায় তৈরি করা হয় এবং যে দৃষ্টান্ত প্রত্যেক সময় শিম নির্ভরশীলতার মধ্যে ব্যবহৃত বা মাধ্যমে প্রাপ্ত করা হয় ফিরিয়ে দেওয়া হয় getBean()

আপনি সিঙ্গেলটন প্যাটার্নটির সংযোজন ছাড়াই একক উদাহরণের সুবিধা পাবেন।


3
ওহ বিদ্রূপ - আপনার সিঙ্গলটন প্রতিস্থাপনের জন্য (সিঙ্গলটন) স্প্রিং মটরশুটি ব্যবহার করুন ...
জ্যাক ম্যাকম্বার

4

বিকল্পগুলি জিনিসগুলির জন্য কোনও বস্তু জিজ্ঞাসা করার পরিবর্তে আপনার যা প্রয়োজন তা উত্তরণ করছে।


4

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

উদাহরণস্বরূপ, যদি আপনাকে নির্দিষ্ট শ্রেণীর জন্য অন্য প্যারামিটারের প্রয়োজন হয় তবে আপনি Configurationবস্তুটি পরিবর্তন করেন , তারপরে এটি ব্যবহার করে এমন সমস্ত ক্লাস পুনরায় কম্পাইল করুন। এটি কিছুটা সমস্যাযুক্ত।

একটি সাধারণ, গ্লোবাল এবং বড় Configurationঅবজেক্ট এড়াতে আপনার কোডটি রিফ্যাক্টর করার চেষ্টা করুন । ক্লায়েন্ট শ্রেণিতে কেবলমাত্র প্রয়োজনীয় প্যারামিটারগুলি পাস করুন:

class Server {

    int port;

    Server(Configuration config) {
        this.port = config.getServerPort();
    } 

}

এটিকে রিফেক্টর করা উচিত:

 class Server {

    public Server(int port) {
       this.port = port;
    }
 }

একটি নির্ভরতা ইনজেকশন কাঠামো এখানে অনেক সাহায্য করবে, তবে এটি কঠোরভাবে প্রয়োজন হয় না।


হ্যাঁ এটি সত্যিই ভাল পয়েন্ট। আমি এটি আগেও করেছি। আমার বড় কনফিগারেশন অবজেক্টটি মেইল ​​সার্ভিসকনফ, সার্ভারকনফের মতো ইন্টারফেস প্রয়োগ করছে .. নির্ভরতা ইনজেকশন ফ্রেমওয়ার্কটি ক্লাসে কনফিগারেশন পাস করে যাতে আমার ক্লাসগুলি বড় কনফিগারেশন অবজেক্টের উপর নির্ভর করে না।
ক্যাল্টুনটাস

1

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


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

0

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


1
শ্রেণিটি রাষ্ট্রবিহীন হলে এটি একটি স্ট্যাটিক শ্রেণি হওয়া উচিত।
আলবার্তোপিএল

1
এটি সি ++ এ রয়েছে - প্যাটার্নটি মনোস্টেট হিসাবে পরিচিত।

0

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

পর্যায়ক্রমে আপনি ক্লাস তৈরি করতে এবং প্রতিবার অনুরোধ করার সময় একই উদাহরণটি ফ্যাক্টরি ব্যবহার করতে পারে - তবে পরীক্ষার জন্য এটি স্টাবড / বিদ্রূপিত সংস্করণটি ফিরিয়ে দিতে পারে


0

কলব্যাক ইন্টারফেস হিসাবে কনফিগারেশন করার সম্ভাবনা পর্যালোচনা। সুতরাং আপনার কনফিগারেশন সংবেদনশীল কোড দেখতে পাবেন:

MyReuseCode.Configure(IConfiguration)

সিস্টেম- init কোডটি দেখতে পাবেন:

Library.init(MyIConfigurationImpl)

0

আপনি কনফিগারেশন অবজেক্টে যাওয়ার ব্যথা কমাতে নির্ভরতা ইনজেকশন কাঠামোটি ব্যবহার করতে পারেন। শালীন একটি হ'ল নিনজেট যা এক্সএমএল না করে কোড ব্যবহারের সুবিধা রয়েছে।


0

সম্ভবত খুব পরিষ্কার নয়, তবে আপনি সম্ভবত তথ্য বিটগুলি পাস করতে পারেন যা আপনি সিঙ্গলটন তৈরি পদ্ধতিতে পরিবর্তিত করতে চান - ব্যবহারের পরিবর্তে

public static Singleton getInstance() {
    if(singleton != null)
        createSingleton();
        return singleton;
    }
}

আপনি createSingleton(Information info)অ্যাপ্লিকেশন স্টার্টআপে সরাসরি কল করতে পারেন (এবং ইউনিট পরীক্ষার সেটআপ পদ্ধতিতে)।


-1

সিলেটলেটগুলি খারাপ নয় তবে নকশার ধরণটি ত্রুটিযুক্ত। আমার একটি ক্লাস রয়েছে যা আমি কেবল রানটাইমের সময় এর একক উদাহরণ তৈরি করতে চাই তবে ইউনিট পরীক্ষার সময় একাধিক বিচ্ছিন্ন ঘটনা তৈরি করতে চাই প্রতিরোধমূলক ফলাফল নিশ্চিত করতে।

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

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