আমি কীভাবে ডাটাবেস অ্যাক্সেস encapsulate করা উচিত?


10

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

ভবিষ্যতে ডাটাবেস ক্যাশের মতো জিনিসে খুব সহজেই নামার ক্ষমতাও আমি চাই।

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

দুঃখিত যদি আমার প্রশ্নটি বুঝতে অসুবিধা হয়; আমি ডেটাবেস সম্পর্কিত শর্তাদি সম্পর্কে পুরোপুরি নিশ্চিত নই। প্রয়োজন হলে অনুগ্রহ করে স্পষ্টতা জিজ্ঞাসা করুন।


আপনি কি ডাব্লুটি :: ডাবো এর মতো ডাটাবেসের সাথে ক্লাসগুলি লিঙ্ক করার জন্য কোনও ওআরএম ব্যবহার করে বিবেচনা করেছেন ?
ব্যবহারকারী52875

উত্তর:


11

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

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

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


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

6

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

আপনি ডেটা অ্যাক্সেস এবং ব্যবসায়িক যুক্তিকে একসাথে মিশ্রিত করার পরিবর্তে আরও অ্যাপ্লিকেশন নির্দিষ্ট বিশদটি সংজ্ঞায়িত করতে বর্তমান ডেটা স্টোরেজ কৌশল কৌশলটি ব্যবহার করে এমন একটি পরিষেবা স্তরও তৈরি করতে পারেন can


সুতরাং, আপনি কি প্রতিটি ধরণের জন্য অ্যাক্সেস ক্লাস বা সবার জন্য একটি বড় শ্রেণি যুক্ত করবেন?
উইল03uk

ব্যক্তিগতভাবে আমি বন্য থেকে আমার সার্ভার / অ্যাপ্লিকেশনটিতে আসা প্রতিটি ডেটার জন্য সুস্পষ্ট কাস্টিং গ্রহণের বিষয়টি বিবেচনা করব।
ব্যবহারকারী 827992

+1 আমি এই প্যাটার্নটির চেহারা পছন্দ করি তবে আমার মনে হয় (আমার প্রকল্পের স্কেলে), ডাটাবেসের জন্য প্রতিটি অ্যালগরিদম পৃথকভাবে পরিচালনা করা শক্ত হবে; যদিও আমি অবশ্যই এটি অন্যান্য অ্যাপ্লিকেশনগুলিতে ব্যবহার করব। ল্যাম্বডাস অবশ্যই এটির পরিপূরক হবে।
উইল03uk

1

এটি ডাটাবেস কারখানার প্যাটার্নের একটি উদাহরণ;

using System.Reflection;
using System.Configuration;

public sealed class DatabaseFactory
{
    public static DatabaseFactorySectionHandler sectionHandler = (DatabaseFactorySectionHandler)ConfigurationManager.GetSection("DatabaseFactoryConfiguration");

    private DatabaseFactory() { }

    public static Database CreateDatabase()
    {
        // Verify a DatabaseFactoryConfiguration line exists in the web.config.
        if (sectionHandler.Name.Length == 0)
        {
            throw new Exception("Database name not defined in DatabaseFactoryConfiguration section of web.config.");
        }

        try
        {
            // Find the class
            Type database = Type.GetType(sectionHandler.Name);

            // Get it's constructor
            ConstructorInfo constructor = database.GetConstructor(new Type[] { });

            // Invoke it's constructor, which returns an instance.
            Database createdObject = (Database)constructor.Invoke(null);

            // Initialize the connection string property for the database.
            createdObject.connectionString = sectionHandler.ConnectionString;

            // Pass back the instance as a Database
            return createdObject;
        }
        catch (Exception excep)
        {
            throw new Exception("Error instantiating database " + sectionHandler.Name + ". " + excep.Message);
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.