কোনও ডিএও সিঙ্গলটন হওয়া উচিত?


14

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

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

@Path("eventscheduler")
public class EventSchedulerService {
    private IEventSchedulerDao dao = new EventSchedulerDao();

    // in case a different implementation is to be used
    public void setEventSchedulerDao(IEventSchedulerDao dao) {
        this.dao = dao;
    }

    @Path("{uniqueName}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Tournament getTournament(@PathParam("name") String uniqueName) {
        return dao.get(uniqueName);
    }

    @Path("create")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Tournament createTournament(Tournament tournament) {
        return dao.create(tournament);
    }
}

যদিও ডিএও যদি সিঙ্গলটন হত তবে আমার ধারণা আমি প্রথম লাইনে খুব একটা পার্থক্য করতে পারব না:

private IEventSchedulerDao dao = EventSchedulerDao.getInstance();

আমাকে এখনও একটি IEventSchedulerDaoউদাহরণ ব্যবহার করতে হবে , তবে আমি অনুমান করি যে সমস্ত সিলেটলেট এই অধিকারটির মতো কাজ করে? কোনও কারণে আমি সর্বদা সিঙ্গলেটগুলি স্থির পদ্ধতির সাথে সম্পর্কিত করি, সুতরাং কোনও সিঙ্গলটন উদাহরণটি ব্যবহারকারীর কাছে দৃশ্যমান হওয়ার পরিবর্তে এটি getInstance()গোপন করা হবে এবং তিনি কেবল EventSchedulerDao.get(name)স্ট্যাটিক ফ্যাশনে ব্যবহার করবেন ... ইত্যাদি। এটা কি জিনিস নাকি এই শুধু আমার?

সুতরাং, আমার বা আমার সিঙ্গলটন ডিএও থাকা উচিত নয়?

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


আপনি স্ট্যাটিক অ্যাকসেসর সহ সিঙ্গলটনের পরিবর্তে আইওসি সিঙ্গেলটন ব্যবহার করতে পারেন।
কোডসইনচাওস

উত্তর:


10

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


1
আপনি আপনার শেষ বাক্যে যা পরামর্শ দিয়েছেন তা হ'ল সঠিকভাবে আমি যা করছি?
দাদাবাবা

1
আপনি একটি ইন্টারফেসের মাধ্যমে উল্লেখ করছেন (হ্যাঁ) তবে আপনি ডিএও ইনজেকশন দিচ্ছেন না (পরিষ্কার হতে ....)
ব্রায়ান অগ্নিউ

আপনি কি বোঝাতে চেয়েছেন? আমার সেটার আছে, তাই না?
দাদাবাবা

@ দাদাবাবা সেই লাইনটি private IEventSchedulerDao dao = new EventSchedulerDao();যেখানে আপনি ভুল করেছেন। এর বাস্তবায়নটি IEventSchedulerDaoকনস্ট্রাক্টরের মাধ্যমে ইনজেকশন করা উচিত এবং কখনই পরিবর্তন করা উচিত নয় (অর্থাত্ এ থেকে setEventSchedulerDaoমুক্তিও পান)।
ডেভিড আরনো

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

4

A D ata A ccess O bject আপনার অ্যাপ্লিকেশনটিতে কেবল একবার উপস্থিত থাকতে হবে। যুক্তিটি একই থাকে, ডিএও উপলব্ধ পদ্ধতিগুলির মধ্যে আগত মানগুলিই কেবল ভিন্ন the

এটি মনে রেখে, স্পষ্টতই প্রথম যেটি ঘটে তা হ'ল ডিএওকে একটি শক্তিশালী সিঙ্গলটন হিসাবে বাস্তবায়ন করা , এটি তখন যখন আপনি staticকোনও কারখানার ক্লাসে কোনও পদ্ধতি রাখেন getInstance, ডিএওর কোনও উদাহরণ অলসভাবে লোড করা হয় যদি এটি বাতিল হয় এবং ফিরে আসে।

যদি সিনট্যাক্সটি পুরোপুরি ঠিক না থাকে তবে আমাকে ক্ষমা করুন, আমি জাভা প্রোগ্রামার নই।

class DaoSingletonFactory
{
    private static Dao dao = null;

    public static Dao getInstance()
    {
        if (DaoSingletonFactory.dao == null) {
            DaoSingletonFactory.dao = new Dao();
        }

        return DaoSingletonFactory.dao;
    }
}

class UsesDao
{
    public void someMethod()
    {
        Dao dao = DaoSingletonFactory.getInstance();
    }
}

এটি পরীক্ষা করা অবিশ্বাস্যরকম শক্ত কারণ আপনি UsesDaoক্লাসের কোড পরিবর্তন না করেই বাস্তবায়নটি বদলাতে পারবেন না । এটি কিছু বানর প্যাচিংয়ের মাধ্যমে করা যেতে পারে তবে সাধারণত একটি ভাল অনুশীলন হিসাবে বিবেচিত হয় না।

তারপরে আরও ভাল উপায় আছে, দুর্বল সিঙ্গলটন প্যাটার্ন, যেখানে আপনি কোনও staticপদ্ধতির মাধ্যমে উদাহরণটি পুনরুদ্ধার করেন না , তবে সমস্ত শ্রেণি নির্ধারক বা সেটারের মাধ্যমে উদাহরণের উপর নির্ভর করে (আপনার EventSchedulerServiceমধ্যে সেটার ইঞ্জেকশনটি ব্যবহার করছেন)।

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

স্পষ্টতই, অবজেক্ট-গ্রাফটি সনাক্ত করা এবং এটি নির্মাণ করা অবিশ্বাস্যরকম কঠিন এবং বিরক্তিকর কাজ।

ভাগ্যক্রমে, আইওসি পাত্রে রয়েছে, এটি এটিকে অনেক সহজ করে তোলে। এছাড়া বসন্ত , Guice আইওসি ধারক Google দ্বারা জাভা প্রোগ্রামারদের মধ্যে বেশ জনপ্রিয়।

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

আপনি গুইসের সাথে সিঙ্গেলটন উদাহরণের জন্য এই লিঙ্কটি চেক করতে পারেন ।


আইওসি পাত্রে ব্যবহার করার পক্ষে পেশাদার এবং কনস

পেশাদাররা

  • সমস্ত ফ্যাক্টরি পদ্ধতি নিজে না লিখে বাজেট সাশ্রয় করুন
  • (সাধারণত) খুব সোজা কনফিগারেশন
  • দ্রুত বিকাশ

কনস

  • একটি উইজার্ডের যাদু, ক্লাসগুলি একরকম নির্মিত এবং আপনি কীভাবে এটি ঘটতে পারেন তা সত্যিই দেখতে পারেন না
  • শ্রেণি দেখার কারণে সামান্য পারফরম্যান্স হ্রাস (ম্যানুয়ালি লিখিত কারখানাগুলি কিছুটা দ্রুত হবে)

1

একক ধারণা উল্লেখ করা হয় মাত্র কেবল এক উদাহরণ হিসেবে বলা যায় এবং পথ উদাহরণস্বরূপ অ্যাক্সেস পেতে (তাই বিখ্যাত স্ট্যাটিক পদ্ধতি মাধ্যমে getInstance () )

কিন্তু এখনও সব এর পিছনে একটি উদাহরণ আছে। এক ধরনের বাধা অ্যাক্সেস সহ একটি বিল্ট অবজেক্ট।

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

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

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

সুতরাং আমি সতর্কতার সাথে স্ট্যাটিক্স ব্যবহার করার পরামর্শ দেব

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