ওও ডিজাইনটি কী ব্যবহার করবেন (কোনও ডিজাইনের প্যাটার্ন রয়েছে)?


11

আমার দুটি জিনিস রয়েছে যা 'বার / ক্লাব' উপস্থাপন করে (এমন একটি জায়গা যেখানে আপনি পান করেন / সামাজিকীকরণ করেন)।

একটি দৃশ্যে আমার বারের নাম, ঠিকানা, দূরত্ব, স্লাগন প্রয়োজন

অন্য দৃশ্যে আমার বারের নাম, ঠিকানা, ওয়েবসাইট ইউআরএল, লোগো দরকার

সুতরাং আমি একই জিনিস প্রতিনিধিত্ব করে দুটি ক্ষেত্র পেয়েছি কিন্তু বিভিন্ন ক্ষেত্রের সাথে।

আমি অপরিবর্তনীয় বস্তু ব্যবহার করতে চাই, সুতরাং সমস্ত ক্ষেত্র নির্মাতা থেকে সেট করা আছে

একটি বিকল্পের জন্য দুটি কনস্ট্রাক্টর রয়েছে এবং অন্যান্য ক্ষেত্রগুলি বাতিল করতে হবে:

class Bar {
     private final String name;
     private final Distance distance;
     private final Url url;

     public Bar(String name, Distance distance){
          this.name = name;
          this.distance = distance;
          this.url = null;
     }

     public Bar(String name, Url url){
          this.name = name;
          this.distance = null;
          this.url = url;
     }

     // getters
}

আমি এটি পছন্দ করি না কারণ আপনি যখন পরীক্ষক ব্যবহার করেন তখন আপনাকে চেক করতে হবে

আমার বাস্তব উদাহরণে প্রথম দৃশ্যে 3 টি ক্ষেত্র রয়েছে এবং দ্বিতীয় দৃশ্যে প্রায় 10 রয়েছে, সুতরাং এটির জন্য দু'জন নির্মাতা থাকলে আসল ব্যথা হবে fields Barআপনি জানেন না আপনি কোনটি ব্যবহার করছেন এবং কোন ক্ষেত্রগুলি শূন্য হবে এবং কী হবে না।

আমার আর কোন বিকল্প নেই?

দুটি ক্লাস বলা হয় BarPreviewএবং Bar?

কিছু ধরণের উত্তরাধিকার / ইন্টারফেস?

কি দুর্দান্ত কিছু?


29
বাহ, আপনি আসলে Barসনাক্তকারী হিসাবে বৈধ ব্যবহার নিয়ে এসেছেন !
ম্যাসন হুইলারের

1
আপনি যদি কিছু সম্পত্তি ভাগ করে নিচ্ছেন তবে একটি বিকল্প হ'ল বেস ক্লাসটি প্রয়োগ করা।
ইউসুভভ

1
আমি ঐটা কখনোই চিন্তা করিনি. আমার বার / ফু কুকুর পার্লারের জন্য যে কোনও ধরণের কোড লেখা সত্যিই বিভ্রান্তি পেতে পারে।
এরিক রেপেন


4
@gnat কীভাবে লোকেরা অনুমান করছে। আপনার লিঙ্কের উদ্ধৃতি থেকে: You should only ask practical, answerable questions based on actual problems that you face.এবং ঠিক এখানেই যা ঘটছে
ব্লুন্ডেল

উত্তর:


9

আমার চিন্তা:

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

তবে, আপনার দুটি জায়গা রয়েছে যেখানে এই বার অবজেক্টের ডেটা প্রয়োজন, এবং উভয়ের উভয়েরই কেবল একটি উপসেট প্রয়োজন (এবং আপনি চান না যে ডেটাটি পরিবর্তন করা হোক)। সাধারণ উত্তরটি একটি "ডেটা ট্রান্সফার অবজেক্ট" বা ডিটিও; একটি পজো (প্লেইন ওল 'জাভা অবজেক্ট) যা স্থাবর সম্পত্তি প্রাপ্তকারীদের সমন্বিত। এই ডিটিওগুলি প্রধান বার ডোমেন অবজেক্টে একটি পদ্ধতি কল করে উত্পাদিত হতে পারে: "টু সেনেরিও 1 ডিটিও ()" এবং "টু সেনেরিও 2 ডিটিও ()"; হাইড্রেটেড ডিটিওর ফলাফল হ'ল (এর অর্থ আপনার কেবলমাত্র এক জায়গায় দীর্ঘ, জটিল নির্মাণকারীর প্রয়োজন)।

আপনার যদি কখনও প্রধান ডোমেন শ্রেণিতে ডেটা ফেরত পাঠানোর প্রয়োজন হয় (এটি আপডেট করার জন্য; যদি আপনি এটি বাস্তব বিশ্বের বর্তমান অবস্থা প্রতিফলিত করার জন্য প্রয়োজনীয় পরিবর্তন করতে না পারেন তবে ডেটার পয়েন্ট কী হবে?), আপনি এর মধ্যে একটি তৈরি করতে পারেন ডিটিও, বা একটি নতুন মিউটেবল ডিটিও ব্যবহার করুন এবং একটি "আপডেটফর্মড্টো ()" পদ্ধতি ব্যবহার করে বার শ্রেণীর কাছে ফিরিয়ে দিন।

সম্পাদনা: একটি উদাহরণ দেওয়ার জন্য:

public class Bar {
     private String name;
     private Address address; 
     private Distance distance;
     private Url url;
     private Image logo;
     private string Slogan;

     public OnlineBarDto ToOnlineDto()
     {
         return new OnlineBarDto(name, address, url, logo);
     }

     public PhysicalBarDto ToPhysicalDto()
     {
         return new PhysicalBarDto(name, address, distance, slogan);
     }

     public void UpdateFromDto(PhysicalBarDto dto)
     {
         //validation logic here, or mixed into assignments

         name = dto.Name;
         address = dto.Address;
         distance = dto.Distance;
         slogan = dto.Slogan;
     }

     public void UpdateFromDto(OnlineBarDto dto)
     {
         //Validate DTO fields before performing assignments

         name = dto.Name;
         address = dto.Address;
         url= dto.Url;
         logo = dto.Logo;
     }

     // getters/setters - As necessary within the model and data access layers;
     // other classes can update the model using DTOs, forcing validation.
}

public class PhysicalBarDto
{
     public final String Name;
     public final Address Address;
     public final Distance Distance;
     public final String Slogan;

     public PhysicalBarDto(string Name, Address address, Distance distance, string slogan) 
     { //set instance fields using parameter fields; you know the drill }
}

public class OnlineBarDto
{
     public final String Name;
     public final Address Address;
     public final Image Logo;
     public final Url Url;

     public OnlineBarDto(string Name, Address address, Url url, Image logo) 
     { //ditto }
}

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


সংক্ষিপ্ত डीটিও কি দাঁড়ায়? আপনার বক্তব্যটি আপনি এটি একটি কার্যকর উদাহরণে ফেলতে পারতেন কিনা তা আমি পুরোপুরি পাই না please fyi ডেটা একটি সার্ভার থেকে আসে তাই একবার এই শ্রেণীর ফর্মটি 'হাইড্রেটেড' হয়ে গেলে ক্ষেত্রগুলি পরিবর্তন করার প্রয়োজন হবে না, কেবল
ইউআইতে

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

পরিবর্তনশীলতা কোন জন্মদান কি তাই কখনও পরিমার্জন বা persistance শুনতে হয়েছে।

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

1
@JarrodRoberson সম্প্রদায় শুনুন। আপনি ভুল. । প্রকৃতপক্ষে এই পুরো উত্তরের অর্ধেক মন্তব্য দেখায় যে বোর্ডের চারপাশে আমাদের কিছু প্রাথমিক ওও স্কুলের পড়াশোনা দরকার - এটি বিরক্তিকর ..
ডেভিড কাউডেন

5

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


1
আপনি এটি বলছেন তবে আপনি Barক্লাসটি ব্যবহার করে একটি উদাহরণ দিতে পারেন
ব্লুন্ডেল

3

নির্মাতা প্যাটার্ন (এটি বা কিছু ঘনিষ্ঠ) ব্যবহারের এখানে হতে পারে।

অপরিবর্তনীয় জিনিস রাখা প্রশংসনীয় জিনিস, তবে বাস্তবতা হচ্ছে জাভাতে প্রতিবিম্বের সাথে কিছুই সত্যই নিরাপদ নয় ;-)।


আমি দেখতে পাচ্ছি কীভাবে HawaiianPizzaBuilderকাজ করে কারণ এর প্রয়োজনীয় মানগুলি হার্ডকোডযুক্ত। তবে মানগুলি যদি পুনরুদ্ধার করা হয় এবং কোনও নির্মাণকারীর কাছে দেওয়া হয় তবে আপনি কীভাবে এই প্যাটার্নটি ব্যবহার করতে পারেন? HawaiianPizzaBuilderএখনও পর্যন্ত সব getters যে হবে SpicyPizzaBuilderতাই নাল সম্ভব হয়েছে। আপনি যদি এটি @ জারোডসের সাথে একত্রিত না করেন তবে Null Object Pattern। একটি কোড উদাহরণ সহ Barআপনার পয়েন্টটি পেতে পারে
ব্লুন্ডেল

+1 আমি এরকম ক্ষেত্রে বিল্ডারকে ব্যবহার করি, একটি কবজির মতো কাজ করি - এতে অন্তর্ভুক্ত থাকে তবে আমি যখন এটি চাই তখন নাল পরিবর্তে যুক্তিসঙ্গত ডিফল্ট নির্ধারণের মধ্যে সীমাবদ্ধ নেই
gnat

3

এখানে মূল বিষয়টি হ'ল "বার" কী এবং আপনি কীভাবে একে একে বা অন্য প্রসঙ্গে ব্যবহার করেন তার মধ্যে পার্থক্য ।

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

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

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

পরবর্তীটি দুটি পৃথক ইন্টারফেস দ্বারা প্রতিনিধিত্ব করা যেতে পারে , এতে প্রয়োজনীয় অ্যাক্সেস পদ্ধতি (getName (), getURL (), getDistance ()) থাকে এবং বার শ্রেণি উভয়ই প্রয়োগ করতে পারে। (এবং সম্ভবত "দূরত্ব" "অবস্থান" এ পরিবর্তিত হবে এবং getDistance () অন্য স্থান থেকে গণনায় পরিণত হবে :-))

তবে সৃষ্টিটি বার সত্তার জন্য এবং আপনি সেই সত্তাটি যেভাবে ব্যবহার করতে চান তা নয়: একজন নির্মাতা, সমস্ত ক্ষেত্র।

সম্পাদিত: আমি কোড লিখতে পারি! :-)

public interface Place {
  String getName();
  Address getAddress();
}

public interface WebPlace extends Place {
   URL getUrl();
   Image getLogo();
}

public interface PhysicalPlace extends Place {
  Double getDistance();
  Slogon getSlogon();
}

public class Bar implements WebPlace, PhysicalPlace {
  private final String name;
  private final Address address;
  private final URL url;
  private final Image logo;
  private final Double distance;
  private final Slogon slogon;

  public Bar(String name, Address address, URL url, Image logo, Double distance, Slogon slogon) {
    this.name = name;
    this.address = address;
    this.url = url;
    this.logo = logo;
    this.distance = distance;
    this.slogon = slogon;
  }

  public String getName() { return name; }
  public Address getAddress() { return address; }
  public Double getDistance() { return distance; }
  public Slogon getSlogon() { return slogon; }
  public URL getUrl() { return url; }
  public Image getLogo() { return logo; } 
}

1

উপযুক্ত প্যাটার্ন

আপনি যা সন্ধান করছেন সর্বাধিক সাধারণত হিসাবে উল্লেখ করা হয় Null Object Pattern। আপনি যদি নামটি পছন্দ না করেন তবে আপনি এটিকে Undefined Value Patternএকই শব্দার্থক পৃথক লেবেল বলতে পারেন। কখনও কখনও এই প্যাটার্ন বলা হয় Poison Pill Pattern

এই সমস্ত ক্ষেত্রে, অবজেক্টটি একটি প্রতিস্থাপন বা নাল নলের Default Valueপরিবর্তে দাঁড়াবে এখন আর কোনও বৈধ রাষ্ট্র হওয়া উচিত নয়।null. It doesn't replace the semantic ofbut makes it easier to work with the data model in a more predictable way because

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

এইভাবে আপনি আপনার nullকার্যভারগুলি তাদের প্রতিনিধি NullObjectউদাহরণগুলির সাথে প্রতিস্থাপন করুন এবং আপনার কাজ শেষ হয়েছে।

যথাযথ অবজেক্ট ওরিয়েন্টেড বিশ্লেষণ

এইভাবে আপনার Interfaceবহুবিজ্ঞানের জন্য একটি সাধারণ হতে পারে এবং ইন্টারফেসের নির্দিষ্ট প্রয়োগের ক্ষেত্রে ডেটার অভাব সম্পর্কে উদ্বেগ প্রকাশ করা থেকে সুরক্ষা পেতে পারেন। সুতরাং কারও Barকাছে ওয়েব উপস্থিতি নাও থাকতে পারে এবং কারও কারও কাছে নির্মাণের সময় অবস্থানের ডেটা নাও থাকতে পারে। Null Object Patterআপনাকে এগুলির প্রত্যেকটির জন্য একটি ডিফল্ট মান সরবরাহ করতে দেয় markerযা একই তথ্যের জন্য একটি যা একই জিনিস বলে, NullPointerExceptionসমস্ত জায়গার জন্য যাচাইয়ের সাথে চুক্তি না করে এখানে কিছুই সরবরাহ করা হয়নি ।

যথাযথ অবজেক্ট ওরিয়েন্টেড ডিজাইন

প্রথমে একটি আছে abstractবাস্তবায়ন উভয় যে সব গুণাবলীর একটি সুপার সেট Barএবং Clubভাগ।

class abstract Establishment 
{
     private final String name;
     private final Distance distance;
     private final Url url;

     public Bar(final String name, final Distance distance, final Url url)
     {
          this.name = name;
          this.distance = distance;
          this.url = url;
     }

     public Bar(final String name, final Distance distance)
     {
          this(name, distance, Url.UNKOWN_VALUE);
     }

     public Bar(final String name, final Url url)
     {
          this(name, Distance.UNKNOWN_VALUE, url);
     }

     // other code
}

তারপরে আপনি এই Establishmentশ্রেণীর সাব ক্লাস বাস্তবায়ন করতে পারেন এবং প্রতিটি Barএবং Clubক্লাসের জন্য প্রয়োজনীয় যে নির্দিষ্ট জিনিসগুলি অপরের সাথে প্রযোজ্য নয় তা যুক্ত করতে পারেন।

অধ্যবসায়

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

ভবিষ্যতে প্রমাণ

আপনি যদি পরে কোনও নিয়ন্ত্রণ / নির্ভরতা ইনজেকশন ব্যান্ডওয়াগনকে উল্টাতে চান তবে এই প্যাটার্নটি এই চিহ্নিতকারী অবজেক্টগুলিকেও ইনজেক্ট করতে সহজ করে তোলে।


0

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

class EstablishmentInformation {
     private final String name;

     public EstablishmentInformation(String name){
          this.name = name;
     }

     // getters
}

class EstablishmentLocationInformation {
    EstablishmentInformation establishmentInformation;
     private final Distance distance;

     public EstablishmentLocationInformation (String name, Distance distance){
          this.establishmentInformation = new EstablishmentInformation(name)
          this.distance = distance;
     }
}

class EstablishmentWebSiteInformation {
    EstablishmentInformation establishmentInformation;
     private final Url url;

     public EstablishmentWebSiteInformation(String name, Url url){
          this.establishmentInformation = new EstablishmentInformation(name)
          this.url = url;
     }
}

-1

এটি খুব বেশি জটিল করার প্রয়োজন নেই। আপনার দুটি ধরণের অবজেক্ট দরকার? দুটি ক্লাস করা।

class OnlineBar {
     private final String name;
     private final Url url;
     public OnlineBar(String name, Url url){
          this.name = name;
          this.url = url;
     }

     // ...
}
class PhysicalBar {
     private final String name;
     private final Distance distance;
     public PhysicalBar(String name, Distance distance){
          this.name = name;
          this.distance = distance;
     }
     //...
}

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


@ ডেভিড: ওহ নোস তাদের মত রয়েছে, একটি সম্পূর্ণ ডেটা মেম্বার সাধারণ। জরুরী!
ডেডএমজি

কিছু সাধারণ ইন্টারফেস ব্যতীত এই সমাধানে কোন বহুবর্ষ নেই , এই দুর্বল নকশার সিদ্ধান্তের সাথে এই শ্রেণীর দুটিও অন্যটির জন্য প্রতিস্থাপিত হতে পারে। এটি এমন নয় যে তাদের বৈশিষ্ট্যের একই সুপারসেট নেই, এটি হ'ল ডিফল্টরূপে attrib গুণগুলির মধ্যে কিছু null। মনে রাখার nullঅর্থ ডেটার অনুপস্থিতি, গুণকের অনুপস্থিতি নয়।

1
@ ডেড এমএমজি সম্ভবত প্যারেন্ট অবজেক্টগুলিতে ভাগ করা মানগুলিকে গোষ্ঠীকরণ করার ধারণাটি সম্পর্কে একটি ব্যায়াম হতে পারে .. আপনি যদি সেই প্রসঙ্গে প্রস্তাব করেন তবে আপনার সমাধানটি সম্পূর্ণ ক্রেডিট পাবেন না।
ডেভিড কাউডেন

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

@ ডেডএমজি তবে প্রতিচ্ছবি একটি পরিবেশ ব্যবহার করে ক্রস প্ল্যাটফর্ম মোবাইল অ্যাপটি লেখার চেষ্টা করার মতো - এটি কাজ করতে পারে তবে এটি সঠিক নয় । প্রতিবিম্ব ব্যবহার করে কোনও পদ্ধতিতে কল করার শাস্তি সাধারণ পদ্ধতির কলের চেয়ে 2 থেকে 50 গুণ কম গতিতে। প্রতিফলন নিরাময়ের সব কিছু নয় ..
ডেভিড কাউডেন

-1

এই ধরণের সমস্যা সহ যে কারও কাছে আমার উত্তর হ'ল এটি পরিচালনাযোগ্য পদক্ষেপে বিভক্ত করা

  1. প্রথমে মাত্র দুটি ক্লাস তৈরি করুন BarOneএবং BarTwo(বা তাদের উভয়কে কল করুন Barতবে বিভিন্ন প্যাকেজে)
  2. আপনার অবজেক্টগুলি পৃথক শ্রেণি হিসাবে ব্যবহার করা শুরু করুন কারণ আপাতত কোড নকল সম্পর্কে চিন্তা করবেন না। আপনি লক্ষ্য করবেন যখন আপনি এক থেকে অন্যটিতে ক্রস ওভার (সদৃশ পদ্ধতি) পাবেন
  3. আপনি এটি আবিষ্কার করতে পারেন যে এগুলি কোনওভাবেই সম্পর্কিত নয় এবং তাই নিজেকে নিজেকে জিজ্ঞাসা করা উচিত তারাbar আপত্তিজনক শ্রেণীর নাম পরিবর্তন করে এখন যা উপস্থাপন করে তার নাম না রাখলে তারা দুজনই সত্যিই একজন?
  4. যদি আপনার সাধারণ ক্ষেত্র বা আচরণ সন্ধান করা হয় তবে আপনি একটি interfaceবা superclassসাধারণ ব্যবহারের সাথে নিষ্কাশন করতে পারেন
  5. একবার আপনার হয়ে গেলে interfaceবা superclassআপনি একটি প্রয়োগ করতে পারেন builderবা factoryআপনার বাস্তবায়ন সামগ্রীগুলি তৈরি / পুনরুদ্ধার করতে পারেন

(4 এবং 5 টি এই প্রশ্নের অন্যান্য উত্তর সম্পর্কে যা রয়েছে)


-2

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

public class Location {
    protected final String name;
    protected final String address:

    public Location (String locName, String locAddress) {
    name = locName;
    address = locAddress
    }

}

public class Bar extends Location {
    private final int dist;
    private final String slogan;

    public Bar(String barName, String barAddress,
               int distance, String barSlogan) {
    super(locName, locAddress);
    dist = distance;
    slogan = barSlogan;
    }
}

এবং বারপ্রিভিউ শ্রেণীর জন্য একই রকম ..

যদি এটি আপনাকে রাতে আরও ভাল ঘুমায়, তবে আমার কোডের অবস্থানের সমস্ত দৃষ্টান্ত যেকোন কিছু দিয়েই প্রতিস্থাপন করুন h


ওপি চায় উদাহরণটি অপরিবর্তনীয় , তার মানে সব কিছু হওয়া উচিত final

1
এটি কাজ করতে পারে, আপনার finalডেভিডের ক্ষেত্রগুলি দরকার। Barকরা উচিত নয় extend Locationযে যদিও অর্থে দেখা যায় না। সম্ভবত Bar extends BaseBarএবং BarPreview extends BaseBarএই নামগুলি যদিও খুব ভাল শোনাচ্ছে না, আমি আরও মার্জিত কিছু প্রত্যাশী ছিলাম
ব্লুন্ডেল

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

@ ব্লুন্ডেল আপনি বিশ্বের কি সম্পর্কে কথা বলছেন? একটি বার হয় একটি অবস্থান । আপনার বেসবারের সাথে কেবলমাত্র আমার অবস্থানটি প্রতিস্থাপন করুন এবং এটি হুবহু একই জিনিস .. আপনি কি জানেন যে যখন একটি শ্রেণি অন্য শ্রেণিটি প্রসারিত করে তখন তার বাড়ির নাম বেস করা হয় না [ClassThatWillExtend]?
ডেভিড কাউডেন

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