পিএইচপি-তে ডাটাবেস অ্যাক্সেস সহ সিলেটলেটদের জন্য কি কোনও ব্যবহারের ক্ষেত্রে রয়েছে?


138

আমি পিডিওর মাধ্যমে আমার মাইএসকিউএল ডাটাবেস অ্যাক্সেস করি। আমি ডেটাবেস অ্যাক্সেস সেট আপ করছি, এবং আমার প্রথম প্রচেষ্টা নিম্নলিখিত ব্যবহার করা ছিল:

প্রথম জিনিসটি যা আমি ভেবেছিলাম তা হ'ল global:

$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd');

function some_function() {
    global $db;
    $db->query('...');
}

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

"এমন পরিস্থিতিতে প্রযোজ্য যেখানে কোনও শ্রেণির একক উদাহরণ থাকা দরকার" "

ম্যানুয়ালটিতে উদাহরণ অনুসারে আমাদের এটি করা উচিত:

class Database {
    private static $instance, $db;

    private function __construct(){}

    static function singleton() {
        if(!isset(self::$instance))
            self::$instance = new __CLASS__;

        return self:$instance;
    }

    function get() {
        if(!isset(self::$db))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd')

        return self::$db;
    }
}

function some_function() {
    $db = Database::singleton();
    $db->get()->query('...');
}

some_function();

আমি যখন এটি করতে পারি তখন কেন আমার তুলনামূলকভাবে বড় বর্গের প্রয়োজন?

class Database {
    private static $db;

    private function __construct(){}

    static function get() {
        if(!isset(self::$db))
            self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd');

        return self::$db;
    }
}

function some_function() {
    Database::get()->query('...');
}

some_function();

এই শেষটি নিখুঁতভাবে কাজ করে এবং আমার $dbআর আর চিন্তা করার দরকার নেই।

আমি কীভাবে একটি ছোট সিঙ্গেলটন ক্লাস তৈরি করতে পারি, বা আমি পিএইচপি-তে অনুপস্থিত সিঙ্গেলনের জন্য এমন কোনও ব্যবহারের মামলা রয়েছে?


এই সম্পর্কিত প্রশ্নে প্রচুর সংস্থান এবং আলোচনা রয়েছে: 'সিলেটলেট সম্পর্কে এত খারাপ কী?'
12'9

উত্তর:


80

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

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

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

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

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

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


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

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

320

সিঙ্গেলটনের খুব কম রয়েছে - না বললে - পিএইচপি ব্যবহার করুন।

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

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

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

পিএইচপি-তে সিঙ্গলেটনের জন্য আমার স্লাইডগুলি দেখুন - সেগুলি কেন খারাপ এবং কীভাবে আপনি অতিরিক্ত তথ্যের জন্য আপনার অ্যাপ্লিকেশনগুলি থেকে সেগুলি মুছে ফেলতে পারেন

এমনকি সিঙ্গলটন প্যাটার্নের অন্যতম উদ্ভাবক এরিক গামা আজকাল এই প্যাটার্নটিকে সন্দেহ করে:

"আমি সিঙ্গেলটন বাদ দেওয়ার পক্ষে। তার ব্যবহার প্রায় সবসময় ডিজাইনের গন্ধে হয়"

আরও পড়া

যদি উপরের পরে, আপনার এখনও সিদ্ধান্ত নিতে সহায়তা প্রয়োজন:

একক সিদ্ধান্ত সিদ্ধান্ত ডায়াগ্রাম


1
@ গর্ডন হ্যাঁ এবং অনুরোধের মধ্যে অবজেক্টগুলি বজায় রাখা সম্ভব হলেও, সিঙ্গলেটস এখনও কয়েকটি দোল নীতি লঙ্ঘন করে গ্লোবাল স্টেট প্রবর্তন করে।
গর্ডন

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

14
@ স্ট্যাসম যদি আপনার কাছে 42 টি সিটোর প্যারাম থাকে বা প্রচুর সেটার প্রয়োজন হয় তবে আপনি এটি ভুল করছেন। ক্লিন কোড কথাবার্তা দেখুন দয়া করে। দুঃখিত, আমি যদি আর এটি ব্যাখ্যা করতে বিরক্ত না হতে পারি। আরও তথ্যের জন্য পিএইচপি চ্যাট রুমে নির্দ্বিধায় জিজ্ঞাসা করুন।
গর্ডন

@ গর্ডন পিএইচপি চ্যাট রুমটি কোথায়?
ব্যবহারকারী 658182

21

পিএইচপি-তে কার একা প্রয়োজন?

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

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

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

- তৃতীয় পক্ষের এপিআই , পরিষেবা এবং ওয়েবসাইটগুলির সাথে কাজ করা লোকদের।

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

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

- যাদের দ্রুত বিকাশ করা দরকার People

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

আপনি ধারণা পেতে। এখন আসুন সিঙ্গলটনের আপত্তি এবং কার্যকর যে কোনও কিছুর বিরুদ্ধে অশুচি ক্রুসেড :

- সর্বাধিক আপত্তি এটি পরীক্ষা আরও কঠিন করে তোলে।

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

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

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

তবে যাদের 'চটচটে' বিকাশের নোংরা খাদে কাজ করা দরকার, তাদের ক্লায়েন্ট / ম্যানেজার / প্রকল্পের কাছ থেকে অনেকগুলি অনুরোধ (কখনও কখনও অযৌক্তিক) প্রয়োগ করতে হয়, তাদের জন্য সিঙ্গেলনগুলি পূর্বে বর্ণিত কারণগুলির কারণে সঞ্চয়ী অনুগ্রহ।

- আরেকটি আপত্তি হ'ল এর মেমরির পদচিহ্ন বেশি

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

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

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

- 'একাধিক ডাটাবেস সংযোগগুলি অসম্ভব / শক্ত করে তোলে' এর মতো কিছু অবৈধ আপত্তি

আমি এমনকি এই আপত্তিটি বোঝা শুরু করতে পারি না, যখন প্রত্যেকের একাধিক ডাটাবেস সংযোগ, একাধিক ডাটাবেস নির্বাচন, একাধিক ডাটাবেস প্রশ্ন, একাধিক ফলাফল সেট একটি সিঙ্গলটনে বজায় রাখার দরকার হয় কেবল তাদের দীর্ঘকাল ধরে সিঙ্গলটনে ভেরিয়েবল / অ্যারে রাখে as তারা প্রয়োজন হয়। এটি অ্যারে রাখার মতোই সহজ হতে পারে, যদিও আপনি এটি কার্যকর করতে যে কোনও পদ্ধতি ব্যবহার করতে চান তা আবিষ্কার করতে পারেন। তবে আসুন সবচেয়ে সহজ কেসটি, প্রদত্ত সিঙ্গলটনে ভেরিয়েবল এবং অ্যারে ব্যবহার পরীক্ষা করা যাক:

কল্পনা করুন যে নীচে একটি প্রদত্ত ডাটাবেস একক এর ভিতরে আছে:

$ এটি -> সংযোগগুলি = অ্যারে (); (ভুল বাক্য গঠন, আমি আপনাকে ছবিটি দেওয়ার জন্য ঠিক এটি টাইপ করেছি - ভেরিয়েবলের সঠিক ঘোষণাটি হ'ল সর্বজনীন $ সংযোগগুলি = অ্যারে (); এবং এর ব্যবহারটি $ এই-> সংযোগগুলি ['সংযোগকি'] প্রাকৃতিকভাবে)

আপনি সেট আপ করতে পারেন, এবং এই ফ্যাশনের একটি অ্যারেতে যে কোনও সময় একাধিক সংযোগ রাখতে পারেন। এবং একই ক্যোয়ারী, ফলাফল সেট এবং আরও জন্য।

$ এটি -> ক্যোয়ারী (QUERYSTRING, 'ক্যোয়ারাম নাম', $ এই-> সংযোগগুলি ['পার্টিকুলার কানেকশন']);

যা কেবলমাত্র একটি নির্বাচিত সংযোগের সাথে একটি নির্বাচিত ডাটাবেজে একটি ক্যোয়ারী করতে পারে এবং আপনার মধ্যে কেবল সঞ্চয় করতে পারে

$ এটি -> ফলাফল

কী 'প্রশ্নের নাম' দিয়ে অ্যারে। অবশ্যই, আপনার এর জন্য আপনার প্রশ্নের পদ্ধতি কোডিং করা দরকার - যা করা তুচ্ছ।

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

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

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

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

আপনি লক্ষ্য করবেন যে বেশিরভাগ নিবন্ধগুলিতে সিলেটলেটগুলি ভিত্তিযুক্ত, আপনি 'গ্লোবালগুলি' 'দুষ্ট' হওয়ার উল্লেখ দেখতে পাবেন।

আসুন এটির মুখোমুখি হোন - এমন কোনও কিছুই যা সঠিকভাবে ব্যবহৃত হয় না, অপব্যবহার হয় না, অপব্যবহার হয় তা IS মন্দ। এটি কোনও ভাষা, কোনও কোডিং ধারণা, কোনও পদ্ধতিতেই সীমাবদ্ধ নয়। আপনি যখনই কাউকে 'এক্স ইজ ইজ ਬੁਰ' এর মতো কম্বল স্টেটমেন্ট ইস্যু করতে দেখেন তখন এই নিবন্ধটি থেকে দূরে চলে যান। সম্ভাবনাগুলি খুব বেশি যে এটি একটি সীমাবদ্ধ দৃষ্টিভঙ্গির পণ্য - এমনকি দৃষ্টিকোণ কোনও বিশেষ কিছু বছরের বছরের অভিজ্ঞতার ফলস্বরূপ - যা সাধারণত কোনও নির্দিষ্ট শৈলীতে / পদ্ধতিতে খুব বেশি কাজ করার ফলাফল হিসাবে শেষ হয় - সাধারণ বৌদ্ধিক রক্ষণশীলতা ism

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

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

প্রোগ্রামার / কোডার / সফটওয়্যার ইঞ্জিনিয়ারের সর্বাধিক সম্পত্তি হ'ল একটি মুক্ত, উন্মুক্ত এবং নমনীয় মন।


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

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

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

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

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

15

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

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


তবে সিঙ্গলেটনগুলি খুব সহজেই ডিআই-তে হ্রাস করতে পারে, স্ট্যাটিক ক্লাসগুলি পারে না, এটি স্ট্যাটিক ক্লাসগুলির মধ্যে আসল সমস্যা।
বিল কে

@ বিল: খুব সত্য, তবে সে কারণেই আমি আলগা ফাংশন বা স্থির পদ্ধতিগুলির চেয়ে বরং একটি ডিআই পদ্ধতির পক্ষে পরামর্শ দিয়েছিলাম :)
উইসডেন

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

8

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

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

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


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

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

5

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

কোনও অ্যাপ্লিকেশনে গ্লোবাল ব্যবহার করার ক্ষেত্রে বেশ কয়েকটি ত্রুটি রয়েছে (যা সিঙ্গলটন প্যাটার্নের traditionalতিহ্যবাহী ব্যবহারটি করে):

  • ইউনিট পরীক্ষা করা কঠিন
  • নির্ভরতা ইনজেকশন সমস্যা
  • লকিংয়ের সমস্যা তৈরি করতে পারে (মাল্টি-থ্রেডেড অ্যাপ্লিকেশন)

সিঙ্গলটনের পরিবর্তে স্ট্যাটিক ক্লাস ব্যবহার করুন উদাহরণে কিছু একই ত্রুটি রয়েছে কারণ সিঙ্গলটনের সবচেয়ে বড় সমস্যা হ'ল স্থির getInstance পদ্ধতি।

Classতিহ্যবাহী getInstanceপদ্ধতিটি ব্যবহার না করে কোনও শ্রেণীর কাছে থাকা উদাহরণগুলির সংখ্যা আপনি সীমাবদ্ধ করতে পারেন :

class Single {

    static private $_instance = false;

    public function __construct() {
        if (self::$_instance)
           throw new RuntimeException('An instance of '.__CLASS__.' already exists');

        self::$_instance = true;
    }

    private function __clone() {
        throw new RuntimeException('Cannot clone a singleton class');
    }

    public function __destruct() {
        self::$_instance = false;
    }

}

$a = new Single;
$b = new Single; // error
$b = clone($a); // error
unset($a);
$b = new Single; // works

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


5

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

তাহলে আমরা কোন সিদ্ধান্তে পৌঁছতে পারি?

  • ডকুমেন্টেশন কোডে, কলকারীরা একটি Databaseউদাহরণ পান। Databaseবর্গ প্রকাশ করতে পারে (আসলে, এটি করা উচিত নয় যদি আপনি 'এই সব কষ্ট যাচ্ছে পুনরায় এক্সপোজ) চেয়ে একটি সমৃদ্ধ বা উচ্চতর স্তরের ইন্টারফেসে PDOবস্তুর এটা গোপন করে।
  • আপনি যদি এর পরিবর্তে অন্য (ধনী) ধরণের প্রত্যাবর্তনের জন্য নিজের প্রয়োগ পরিবর্তন করেন PDOতবে দুটি প্রয়োগ সমান equivalent ম্যানুয়াল বাস্তবায়ন অনুসরণ করে লাভ করার দরকার নেই।

ব্যবহারিক দিক থেকে, সিঙ্গেলটন একটি বেশ বিতর্কিত প্যাটার্ন। এটি মূলত:

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

সুতরাং, চূড়ান্ত উপসংহার হিসাবে: আপনার সিঙ্গলটন ঠিক আছে। সিঙ্গলটন ব্যবহার না করা বেশিরভাগ সময় ঠিক আছে।


2

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


2

প্রোগ্রামিং যখন "সঠিক" এবং "ভুল" হয় না; "ভাল অনুশীলন" এবং "খারাপ অনুশীলন" রয়েছে।

সিলেটলেটগুলি সাধারণত পুনরায় ব্যবহারের জন্য শ্রেণি হিসাবে তৈরি করা হয়। এগুলিকে এমনভাবে তৈরি করা দরকার যাতে মধ্যরাতে মাতাল হয়ে কোডিংয়ের সময় প্রোগ্রামারটি দুর্ঘটনাক্রমে দুটি দৃষ্টান্ত ইনস্ট্যান্ট করে না।

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

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


2

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


1

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

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