যখন বস্তুগুলি কেবল ইন্টারফেসের অংশ ব্যবহার করে তখন আমি কীভাবে ইন্টারফেস গঠন করব?


9

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

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

আমি অন্যের উত্তরাধিকারসূত্রে (আইআরডিডাও, আইইউপিডেটডাও, আইডিলিটডাও যা থেকে প্রাপ্ত উত্তরাধিকারসূত্রে প্রাপ্ত ডઓস হ'ল) ​​এর সাথে যোগাযোগ করার বিষয়ে ভেবেছিলাম, তবে এই পদ্ধতির মূলত প্রতিটি ফাংশনের সংমিশ্রণের জন্য আলাদা ইন্টারফেসের প্রয়োজন হবে (আইইউপিডেটএন্ডআরইড, আইআরএডিএন্ডডিলিট, আইআরডিপেট ... )

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

class IDao {

  void update(ModelDao model);
  void delete(String guid);
  ModelDao read(String guid);

}

Class A {

  private IDao dao;

  public A(IDao dao) {

    this.dao = dao;

  }

  public void doStuff() {

    ModelDao model = new ModelDao();

    ...

    dao.update(model);

  }

  public void readThenDoSomething(String id) {

    ModelDao model = dao.read(id);

    ...

  }

}

Class B {

  private IDao dao;

  public B(IDao dao) {

    this.dao = dao;

  }

  public void makeUpdate() {

    ModelDao model = new ModelDao();

    ...

    dao.update(model);

  }

  public void delete(String id) {

    dao.delete(id);

  }

}

2
আপনার প্রতিটি সংমিশ্রণের জন্য পৃথক ইন্টারফেসের প্রয়োজন নেই কেন কেবল প্রতিটি ক্লাস যা তাদের প্রয়োজনীয়গুলি প্রয়োগ করে তা ব্যবহার করে?
yitzih

উপরের ক্ষেত্রে, ক এর কন্সট্রাক্টরের কাছে আইডাও পাস করার পরিবর্তে, আমাকে আইউপিডেট এবং আইআরইড প্রয়োগকারী একটি বস্তুটি পাস করতে হবে, তবে "দ্যাও" উদাহরণটি কী হবে? এটি কি আইইউপিডেটএন্ডআরডিডাওয়ের মতো কিছু হবে না? এটি এখনও একটি ইন্টারফেস হওয়া প্রয়োজন কারণ আমি যদি এটি প্রয়োগের জন্য বলি যা ডেটাবেস নির্দিষ্ট করে থাকে তবে আমি ক্লাসটি ডিবিতে জুড়ে দিয়েছি। আপনি কি জিজ্ঞাসা করা হয় যে কি?
jteezy14

3
আমি মনে করি এটি ইন্টারফেস বিভাজন নীতি (এর Iথেকে SOLID) এর নিখুঁত উদাহরণ । এটিতে কিছুটা পড়তে চাই।
ক্রিস্টোফার ফ্রান্সিসকো

উত্তর:


10

ক্রিস্টোফারের মন্তব্য অনুসারে, ইন্টারফেসগুলি পৃথক করা সম্ভবত কিছুটা ভাল । তাই আপনি যদি অন্তত হবে IReadDao, IDeleteDaoএবং IUpdateDao। মনে রাখবেন যে আপনার অগত্যা তিনটি শ্রেণীর প্রয়োজন নেই; আপনার যদি একটি বড় ডিএও ক্লাস থাকতে পারে যা তিনটি ইন্টারফেস প্রয়োগ করে, যদি কোড ভিত্তিকে সেভাবে সংযুক্ত করার জন্য এটি বোধগম্য হয়।

সংযুক্তিকরণ বিস্ফোরণ এড়াতে (যেমন একটি প্রয়োজনীয়তার এড়াতে IReadUpdate, IDeleteUpdateইত্যাদি ইন্টারফেস) আপনি আলাদাভাবে ইন্টারফেসগুলি কন্সট্রাকটর ইনজেকশন মধ্যে প্রদান করতে পারেন (যদি আপনি একই বস্তুর দুইবার বিভিন্ন পরামিতি হিসেবে পাস করতে পারেন), অথবা দুই বা ততোধিক ইন্টারফেসগুলি সমর্থনকারী একটি একক বস্তু প্রদান জেনেরিক পদ্ধতিতে কল ব্যবহার করে extends

কনস্ট্রাক্টর ইনজেকশন:

class MyDaoLibrary : IUpdateDao, IInsertDao, IDeleteDao {
    //Etc....
}

class A
{
    //It is OK if the IoC container factory provides the same instance for both parameters.
    a(IUpdateDao dao1, IDeleteDao dao2) {
        this.updater = dao1;
        this.deleter = dao2;
    }
    //Etc....
}

জেনেরিক পদ্ধতি ব্যবহার করে ইনজেকশন সেটার করুন:

<T extends IUpdateDao & IDeleteDao> void InitializeDao(T dao)  //Pass a single object that implements both IUpdateDao and IDeleteDao

সেটার ইনজেকশন ব্যবহার করার সময়, আমি কীভাবে ইনিশিয়ালডাডো ফাংশনে সেট করে দিচ্ছি সেই দৃষ্টান্তটি পরিবর্তনশীল হিসাবে ঘোষণা করব?
jteezy14

আপনার জন্য দুটি ইনস্ট্যান্স ভেরিয়েবলের প্রয়োজন হবে (একটি মুছার জন্য, একটি আপডেটের জন্য) ... daoউভয়ের জন্য বরাদ্দ করুন।
জন উ

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