মডেল এবং দৃশ্যের সাথে ডিল করার সময় বনাম পলিমারফিজম পরিবর্তন করুন


12

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

1) স্যুইচ (আমি জানি যে সফল হয়)

//inside the view controller
void onClickItem(int index) {
    A a = items.get(index);

    switch(a.type) {
         case b:
             B b = (B)a;
             go to screen X;
             x.v1 = b.v1; // fill X with b data
             x.v2 = b.v2; 
         case c:
             go to screen Y;
         etc...
    }
}

2) পলিমারফিজম

//inside the view controller
void onClickItem(int index) {
    A a = items.get(index);
    Screen s = new (a.getDestinationScreen()); //ignore the syntax
    s.v1 = a.v1;   // fill s with information about A
    s.v2 = a.v2;
    show(s);
}

//inside B
Class getDestinationScreen(void) {
    return Class(X);
}

//inside C
Class getDestinationScreen(void) {
    return Class(Y);
}

সমাধান 2 এর সাথে আমার সমস্যাটি হ'ল যেহেতু বি, সি, ডি, ইত্যাদি মডেল, তাই তাদের সম্পর্কিত বিষয়গুলি সম্পর্কে জানা উচিত নয়। নাকি সে ক্ষেত্রে তাদের উচিত?

উত্তর:


6

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

   //inside the view controller
   void onClickItem(int index) {
      ViewFactoryVisitable a = items.get(index);
      ViewFactory aViewFactory = new ViewFactory(
      s = aViewFactory.getViewFor(a);
      show(s);
   }

--------

//Element interface
public interface ViewFactoryVisitable
{
    public void accept(ViewFactory theViewFactory);
}

---------

public interface ViewFactoryVisitor
{
   // one for each concrete type, polymorphism will choose correct setter
   public set setViewFor(B b);
   public set setViewFor(C c);
   public set setViewFor(D d);
}

--------

// B, C, D must implement this visitable interface
class B implements ViewFactoryVisitable
{ 
   ...

   //accept the ViewFactory as a visitor
   public void accept(ViewFactoryVisitor theViewFactoryVisitor)
   {
      theViewFactoryVisitor. setViewFor(this);
   }

   ...
} 

--------

class ViewFactory implements ViewFactoryVisitor
{
   ViewFactory(ViewFactoryVisitable theItem) {
      theItem.accept(this);
   }

   private View mView = null;
   ...

   public void setViewFor(B b) {
      // construct a view x and populate with data from b
      mView = new ViewX(b); 
   }

   public void setViewFor(C c) {
      mView = new ViewY(c); 
   }

   public void setViewFor(D d) {
      mView = new ViewZ(d); 
   }

   View getView() {
      return mView;
   }

} 

1
বাস্তবায়নের গ্রহণযোগ্যতাগুলি যদি "দ্য ভিউফ্যাক্টরিভিসিটার.সেটভিউফোর (এটি) না হয়;" আমি বোকা হয়ে থাকলে দুঃখিত!
রায়ান 14

@ রায়ান ভাল ক্যাচ এই ভুলটি এখানে 3 বছর ধরে!
চক ক্রুটসিংগার

1

উত্তরের চেয়ে বেশি মন্তব্য, তবে আমি মনে করি এটি একটি টস আপ। হয় দৃশ্যটিকে মডেল সম্পর্কে সমস্ত কিছু জানতে হবে যাতে এটি স্ক্রিনটি (সুইচ) চয়ন করতে পারে বা মডেলটিকে ভিউ সম্পর্কে সমস্ত কিছু জানতে হবে যাতে এটি পর্দাটি বেছে নিতে পারে (বহুবিজ্ঞান)। আমার ধারণা আপনি সময়ের সাথে সবচেয়ে সহজ হবেন এমনটি আপনার চয়ন করতে হবে; প্রশ্নের সঠিক উত্তর নেই । (আমি আশা করি কেউ আমাকে ভুল প্রমাণ করতে পারে)) আমি নিজেই বহুবর্ষের দিকে ঝুঁকছি।

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

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

আমি মনে করি এটি অবজেক্ট ওরিয়েন্টেড ডিজাইনের একটি খুব সাধারণ এবং মৌলিক সমস্যা।


0

আমি মনে করি এই ক্ষেত্রে পলিমারফিজমের সাথে যাওয়ার চেয়ে স্যুইচটির সাথে যাওয়া আরও ভাল বিকল্প।

এটি করা মোটামুটি সহজ জিনিস, তাই আমি মনে করি না এটি বহুবর্ষের ব্যবহার দ্বারা অত্যধিক জটিল হতে হবে।

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


আমি আপনার পয়েন্ট দেখছি. ঠিক আছে, আমি মনে করি না বহুবর্ষ খুব বেশি জটিল are এবং আমার ক্ষেত্রে এ শ্রেণি বিমূর্ত নয়, এটি বাস্তবে ব্যবহৃত হয়। আপনার চিন্তাভাবনার জন্য আপনাকে ধন্যবাদ, যদিও আমি এখনও আরও ভাল সমাধানের জন্য অপেক্ষা করছি এবং পলিমারফিজম পদ্ধতির দিকে আরও ঝুঁকির মধ্যে রয়েছি।
রাফেল অলিভিরা

1
কোনও উদ্বেগ নেই, কেবল বিষয়টি সম্পর্কে আমার 2 সেন্ট দিন। যদিও আপনার মডেলগুলিতে ভিউ লজিক রাখার সাথে আপনার সমস্যাটি সমাধান করার জন্য, আপনি সর্বদা তাদের সাজসজ্জা দিয়ে জড়িয়ে রাখতে পারেন যাতে আপনার মডেলগুলি দর্শন মুক্ত যুক্তিহীন থাকে। তারপরে আপনি মডেলের পরিবর্তে ডেকোরেটর ক্লাসে পলিমারফিজম ব্যবহার করতে পারেন।
মারু

0

সমাধান 2 এর সাথে আমার সমস্যাটি হ'ল যেহেতু বি, সি, ডি, ইত্যাদি মডেল, তাই তাদের সম্পর্কিত বিষয়গুলি সম্পর্কে জানা উচিত নয়।

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

এছাড়াও, এটি মনে হয় না Aএবং এটি সাবক্লাসগুলি হ'ল সেই ধরণের সাথে আপনার আকর্ষণীয় বহুবর্ষ আছে ph আকর্ষণীয় ধরণটি আসলে Screen। এই উদাহরণে, Aকেবলমাত্র এমন একটি শ্রেণি যা Screenসৃষ্টিকে জানাতে তথ্য ধারণ করে ।

যদি আপনি কম্বোবক্সে যা কিছু a.typeফেরত দেয় তার একটি তালিকা তৈরি করে থাকেন তবে একটি স্যুইচ বিবৃতি আরও স্বাভাবিক বলে মনে হয়। যাইহোক, ক্লিক ইভেন্ট হ্যান্ডলারের মধ্যে এটি ঠিক রাখার পরিবর্তে, আমি এটি এ রাখি ScreenFactory। তারপরে আপনার রয়েছে:

//inside the view controller
void onClickItem(int index) {
    A a = items.get(index);

    s = _screenFactory.GetScreen(a);
    show(s);
    }
}

//inside a ScreenFactory implementation
internal Screen GetScreen(A typeIndicator)
{
switch(a.type) {
     case b:
         return new ScreenX();
     case c:
         return new ScreenY();
     etc...        
}

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


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