নিজস্ব কোনও পদ্ধতিতে বা অন্য শ্রেণীর মাধ্যমে কোনও বস্তু সংরক্ষণ করছেন?


38

আমি যদি কোনও বস্তু সংরক্ষণ এবং পুনরুদ্ধার করতে চাই, তবে আমি কি এটি পরিচালনা করার জন্য অন্য একটি ক্লাস তৈরি করব, না ক্লাসে নিজেই এটি করা ভাল? নাকি দুজনেই মেশাচ্ছে?

ওওডি দৃষ্টান্ত অনুসারে কোনটি সুপারিশ করা হয়?

উদাহরণ স্বরূপ

Class Student
{
    public string Name {set; get;}
    ....
    public bool Save()
    {
        SqlConnection con = ...
        // Save the class in the db
    }
    public bool Retrieve()
    {
         // search the db for the student and fill the attributes
    }
    public List<Student> RetrieveAllStudents()
    {
         // this is such a method I have most problem with it 
         // that an object returns an array of objects of its own class!
    }
}

বনাম. (আমি জানি নিম্নলিখিতগুলি সুপারিশ করা হয়েছে, তবে এটি আমার কাছে Studentবর্গের সংহতির বিরুদ্ধে কিছুটা মনে হয়েছে )

Class Student { /* */ }
Class DB {
  public bool AddStudent(Student s)
  {

  }
  public Student RetrieveStudent(Criteria)
  {
  } 
  public List<Student> RetrieveAllStudents()
  {
  }
}

কীভাবে তাদের মিশ্রণ?

   Class Student
    {
        public string Name {set; get;}
        ....
        public bool Save()
        {
            /// do some business logic!
            db.AddStudent(this);
        }
        public bool Retrieve()
        {
             // build the criteria 
             db.RetrieveStudent(criteria);
             // fill the attributes
        }
    }

3
অ্যাক্টিভ রেকর্ড প্যাটার্ন নিয়ে আপনার কিছু গবেষণা করা উচিত, যেমন এই প্রশ্ন বা এটি
এরিক কিং

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

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

উত্তর:


34

একক দায়িত্বের নীতি , উদ্বেগ এবং কার্যকরী সংহতি পৃথকীকরণ । আপনি যদি এই ধারণাগুলি পড়েন তবে উত্তরটি পাবেন: সেগুলি আলাদা করুন

Student"ডিবি" শ্রেণি থেকে পৃথক করার একটি সহজ কারণ (বা StudentRepositoryআরও জনপ্রিয় কনভেনশন অনুসরণ করা) হ'ল Studentঅধ্যবসায়ের জন্য দায়ী কোডকে প্রভাবিত না করে ক্লাসে উপস্থিত আপনার "ব্যবসায়িক বিধি" পরিবর্তন করার অনুমতি দেওয়া এবং ভাইস- বিপরীতভাবে।

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

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

কার্যকরী সংহতি হ'ল মডিউলের অংশগুলি শ্রেণিবদ্ধ করা হয় কারণ তারা সকলেই মডিউলটির একক সুসংজ্ঞায়িত কার্যে অবদান রাখে।

এবং স্পষ্টতই, Studentকিছুক্ষণের জন্য বৈধতা সম্পাদন করাও এটিকে অব্যাহত রাখার ফলে "একটি একক সুসংজ্ঞায়িত কার্য" তৈরি হয় না। আবার, ব্যবসায়ের নিয়ম এবং অধ্যবসায় ব্যবস্থা ব্যবস্থাটির দুটি খুব ভিন্ন দিক, যা ভাল অবজেক্ট ওরিয়েন্টেড ডিজাইনের অনেক নীতি দ্বারা পৃথক রাখা উচিত।

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


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

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

4
দাবিটি যে এসআরপি প্রোগ্রামগুলি বজায় রাখা সহজ করে তোলে তা সন্দেহজনক। এসআরপি যে সমস্যাটি তৈরি করে তা হ'ল নামযুক্ত ক্লাসগুলির সংগ্রহের পরিবর্তে, যেখানে নামটি ক্লাসটি করতে পারে এবং করতে পারে না এমন সব কিছুই বলে দেয় (অন্য কথায় বোঝা সহজ যা বজায় রাখা সহজ করে তোলে) আপনি শত / মানুষ একটি অনন্য নাম বাছাই করার জন্য একটি থিসরাস ব্যবহার করার জন্য যে হাজার হাজার ক্লাসের প্রয়োজন ছিল, অনেকগুলি নাম একই রকম তবে পুরো নয় এবং সমস্ত তুষের ছাঁটাইটি একটি ছোট ছোট কাজ is আইওডাব্লু, আইএমও, মোটেই রক্ষণাবেক্ষণযোগ্য নয়।
ডান্ক

3
@ ডাঙ্ক আপনি এমন কথা বলছেন যেন ক্লাসগুলি কেবলমাত্র মডুলারাইজেশন ইউনিট উপলব্ধ। আমি এসআরপি অনুসরণ করে অনেকগুলি প্রকল্প দেখেছি এবং লিখেছি এবং আমি সম্মত হই যে আপনার উদাহরণটি ঘটবে তবে আপনি যদি প্যাকেজ এবং লাইব্রেরিগুলির সঠিক ব্যবহার না করেন তবেই। আপনি যদি প্যাকেজগুলিতে দায়িত্বগুলি পৃথক করেন, যেহেতু প্রসঙ্গটি এর দ্বারা নিহিত রয়েছে, আপনি ক্লাসের নাম আবার অবিচ্ছিন্ন করতে পারেন। তারপরে, এটির মতো সিস্টেম বজায় রাখার জন্য, আপনার যে ক্লাসটি পরিবর্তন করা দরকার সেগুলি অনুসন্ধান করার আগে ডান প্যাকেজে ড্রিল-ডুবানো দরকার। :)
মিশেলহেনরিখ

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

10

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

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


ধন্যবাদ, আমি আমার উত্তরটি পরিবর্তন করেছি, তৃতীয় পদ্ধতির কী হবে? যাইহোক আমি এখানে মনে করি বিন্দুটি আলাদা স্তর তৈরি করার বিষয়ে
আহমদ

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

1
@ আহমাদ: কয়েকটি কারণ, এবং বিবেচনা করার জন্য বেশ কয়েকটি দুষ্কৃতী রয়েছে। এটি একটি পুরো বই পূরণ করতে পারে। এর পিছনে যুক্তি পরীক্ষাগুলি, রক্ষণাবেক্ষণযোগ্যতা এবং আপনার প্রোগ্রামগুলির দীর্ঘমেয়াদী বিবর্তনের দিকে ফোটে, বিশেষত যখন তাদের দীর্ঘস্থায়ী জীবনচক্র থাকে।
ডক ব্রাউন 20

ডিবি প্রযুক্তিতে উল্লেখযোগ্য পরিবর্তন এসেছে এমন কোনও প্রকল্পে কি কেউ কাজ করেছেন? (একটি বিশাল পুনর্লিখন ছাড়া?) আমি না। যদি তা হয়, তবে D ডিবিতে আবদ্ধ হওয়ার হাত থেকে বাঁচতে এখানে পরামর্শ মতো নিম্নলিখিত এসআরপি কি উল্লেখযোগ্যভাবে সহায়তা করেছিল?
user949300

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

3

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

যাদের বেশিরভাগেরই তাদের ভক্ত এবং তাদের সমালোচক রয়েছে। প্রায়শই এটি প্রয়োগটিকে সর্বোত্তম বলে মনে করে এবং এটির সাথে আঁকড়ে ধরে আসে (এর সমস্ত উত্সাহ এবং ডাউনসাইড সহ, অর্থাত্ একই সময়ে উভয় নিদর্শন ব্যবহার না করা ... যদি না আপনি সে সম্পর্কে সত্যই নিশ্চিত হন তবে)।

পার্শ্ব নোট হিসাবে: আপনার উদাহরণে retrieveStudent, অ্যাডস্টুডেন্ট স্ট্যাটিক পদ্ধতি হওয়া উচিত (কারণ এগুলি উদাহরণ-নির্ভর নয়)।

শ্রেণিভিত্তিক সংরক্ষণ / লোড পদ্ধতি থাকার আরেকটি উপায় হ'ল:

class Animal{
    public string Name {get; set;}
    public void Save(){...}
    public static Animal Load(string name){....}
    public static string[] GetAllNames(){...} // if you just want to list them
    public static Animal[] GetAllAnimals(){...} // if you actually need to retrieve them all
}

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

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


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

আপনি অবশ্যই সঠিক, আমি মূল প্রশ্নের উপর ভিত্তি করে অনেক অনুমান করেছি।
জেরিনো

আপনাকে ধন্যবাদ, আমি মনে করি সেরা পদ্ধতির স্তরগুলি স্তরগুলির ব্যবহার করে রেপোজিটরি প্যাটার্নে উল্লিখিত হয়েছে
আহমদ

1

যদি এটি একটি খুব সহজ অ্যাপ্লিকেশন যেখানে বস্তুটি কমবেশি ডেটাস্টোর এবং ভিসার বিপরীতে আবদ্ধ থাকে (অর্থাত্ ডেটাস্টোরের সম্পত্তি হিসাবে ভাবা যেতে পারে), তবে সেই শ্রেণীর জন্য একটি .save () পদ্ধতি থাকা অর্থপূর্ণ হতে পারে।

তবে আমি মনে করি এটি বেশ ব্যতিক্রমী হবে।

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

অন্য বিকল্পটি হ'ল স্থিরতা কাঠামো ব্যবহার করা যা দৃistence়তার সাথে ঘোষণামূলকভাবে সংজ্ঞা দেয় (যেমন টিকা হিসাবে) তবে এটি এখনও দৃ but়তা বহিরাগত।


-1
  • Class শ্রেণীর এমন একটি পদ্ধতি নির্ধারণ করুন যা বস্তুটিকে সিরিয়ালাইজ করে, এবং বাইটের ক্রম দেয় যা আপনি একটি ডাটাবেস বা ফাইল বা যা কিছু রাখতে পারেন
  • সেই অবজেক্টের জন্য এমন একটি কনস্ট্রাক্টর রয়েছে যা বাইটের ক্রমকে ইনপুট হিসাবে গ্রহণ করে

RetrieveAllStudents()পদ্ধতি সম্পর্কে , আপনার অনুভূতিটি সঠিক, এটি সম্ভবত সম্ভবত ভুল জায়গায় প্রতিস্থাপন করা হয়েছে, কারণ আপনার কাছে শিক্ষার্থীদের একাধিক স্বতন্ত্র তালিকা থাকতে পারে। Studentক্লাসের বাইরে কেবল তালিকা (গুলি) রাখবেন না কেন ?


আপনি জানেন আমি কিছু পিএইচপি ফ্রেমওয়ার্কে যেমন ট্রেন্ড দেখেছি উদাহরণস্বরূপ লারাভেল যদি আপনি এটি জানেন তবে। মডেলটি ডাটাবেসের সাথে আবদ্ধ এবং এমনকি অবজেক্টগুলির একটি সিরিজও ফিরে আসতে পারে।
আহমাদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.