কোনও পদ্ধতি থেকে একাধিক রিটার্ন মানগুলি ফেরত দেওয়ার একটি উপায়: রিটার্ন মান উপস্থাপন করে শ্রেণীর ভিতরে পদ্ধতি রাখুন। এটি একটি ভাল নকশা?


15

আমাকে একটি পদ্ধতি থেকে 2 মান ফেরত দিতে হবে। আমার পন্থাটি নিম্নরূপ:

  1. 2 ক্ষেত্রের সাথে একটি অভ্যন্তরীণ শ্রেণি তৈরি করুন যা এই 2 টি মান রাখতে ব্যবহৃত হবে
  2. ক্লাসের ভিতরে পদ্ধতিটি রাখুন
  3. ক্লাসটি ইনস্ট্যান্ট করুন এবং পদ্ধতিটি কল করুন।

পদ্ধতিটিতে কেবলমাত্র একটি পরিবর্তন করা হবে তা হ'ল শেষ পর্যন্ত এটি উদাহরণগুলির ক্ষেত্রে 2 টি মান নির্ধারণ করবে। তারপরে আমি সেই বস্তুর ক্ষেত্রগুলিতে উল্লেখ করে সেই মানগুলিকে সম্বোধন করতে পারি।

এটি একটি ভাল নকশা এবং কেন?


আরেকটি বিকল্প (সম্ভবত একটি খারাপ): দেখুন BitInteger[] java.math.BigInteger.divideAndRemainder(BitInteger val)। এটি একটি অ্যারেতে 2 এর পূর্ণসংখ্যাকে তার মান হিসাবে ফেরত দেয়।
আর্নলেমহীন

আপনি যে দুটি মানটি ফিরিয়ে দিতে চান তা কী ধরণের?
তুলিনাস কর্ডোভা

উত্তর:


15

আমি নিম্নলিখিত লাইন বরাবর এটি যুক্তিযুক্ত হবে:

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

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

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


যদিও আমি এই উত্তরের সাধারণ ধারণার সাথে একমত, বৈধ মামলাগুলি রয়েছে যখন দুটি ঘনিষ্ঠভাবে সম্পর্কিত ডেটা টুকরা একসাথে গণনা করা হয়, তবে প্রোগ্রামের অন্য কোথাও এগুলি একসাথে বাঁধার কোনও ধারণা নেই। এমন ক্ষেত্রে এটির মতো কিছু ফিরিয়ে দেওয়ার পক্ষে যথেষ্ট পরিষ্কার হতে পারে Pair<OneClass, AnotherClass>। কিছু লোক এতে দ্বিমত পোষণ করবে । যে কোনও ক্ষেত্রে, Pairবাস্তবায়নের বিশদ হওয়া উচিত এবং এটি সর্বজনীন এপিআই পদ্ধতিতে কখনই প্রদর্শিত হবে না।
9000

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

1
ভাল উত্তর. কেবলমাত্র আমি যুক্ত করব সিঙ্গল রেসপন্সিবিলিটি প্রিন্সিপাল (এসআরপি) ( এন । যদি যাচাই করা হয় তবে এটি খুব সম্ভব যে আলোচনার পদ্ধতিটি এসআরপির কেবল একটি সাধারণ লঙ্ঘন এবং একটি বিভাজন একটি সহজ সমাধান। আমার অভিজ্ঞতায়, যখনই কোনও পদ্ধতি 2 বা ততোধিক মান ফেরত চায়, 90% ক্ষেত্রে 2 পদ্ধতি রয়েছে বা অন্য শ্রেণি থেকে বের করা উচিত।
প্যাটকোস সিএসবা

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

@ ড্যানিয়েলবি: আমি সলাইডকে উচ্চতর স্তর হিসাবে দেখি এবং ধারণাগুলি বোঝার জন্য সম্ভবত সহজ। মিলন এবং সংহতি এখনও বেসলাইন, তবে তারা আরও নিম্ন স্তরের। SOLID এর নীতিগুলি ব্যাখ্যা করার জন্য এবং আরও সাধারণ স্তরে তাদের উপস্থাপনের জন্য সংযোগ এবং সংহতির দুর্দান্ত ব্যবহার করে।
প্যাটকোস সিসাবা

10

পাইপনের মতো অন্যান্য ভাষায় বৈশিষ্ট্যযুক্ত একটি টুপলের ধারণা রয়েছে।

সহজেই পুনরায় ব্যবহারযোগ্য এমন এই জেনেরাইজড শ্রেণীর একটি উদাহরণ ফিরে আসতে পারে:

public class TypedTuple<L, R> implements Serializable {
private static final long serialVersionUID = 1L;

  protected L left;
  protected R right;

  protected TypedTuple() {
    // Default constructor for serialization
  }

  public TypedTuple(L inLeft, R inRight) {
    left = inLeft;
    right = inRight;
  }

  public L getLeft() {
    return left;
  }

  public R getRight() {
    return right;
  }
}

2
create()কনস্ট্রাক্টরের ধরণের পরামিতিগুলি নির্দিষ্ট করে না দেওয়ার জন্য জেনেরিক স্ট্যাটিক পদ্ধতি থাকা কখনও কখনও ভাল । এছাড়াও, আমি এই ক্লাসটির Pairপরিবর্তে নামকরণ করব Tuple, প্রদত্ত এটি কেবলমাত্র 2-টি মানের মানকে উপস্থাপন করতে পারে।
augurar

5

দেখে মনে হচ্ছে এই শ্রেণীটি অন্য শ্রেণি থেকে দায়ভার নিচ্ছে, এবং এটি আমার মনে করে যে এই নকশাটি দুর্দান্ত নয়।

এমন এক পদ্ধতির জন্য যা বহুবিধ মানগুলি দেয়, আমি বরং তা চাই

  • রিটার্ন মানগুলি সহ একটি জেনেরিক ধারক (যেমন একটি তালিকা বা মানচিত্র) প্রদান করুন

অথবা

  • রিটার্ন মানটির জন্য একটি শ্রেণী তৈরি করুন, যার মধ্যে কেবলমাত্র প্রয়োজনীয় ক্ষেত্রগুলি + গিটারস + সমস্ত ক্ষেত্র সহ একটি নির্মাণকারী রয়েছে

দ্বিতীয় বিকল্পের উদাহরণ:

public Class FooBarRetval {
   private String foo;
   private int bar;

   public FooBarRetval (String foo, int bar) {
      this.foo = foo;
      this.bar = bar;
   }

   public String getFoo() {
      return foo;
   }

   public int getBar() {
      return bar;
   }
}

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

প্রথমটি পছন্দ করা উচিত।
জুয়ানিন

স্কার্ফ্রিজ: পয়েন্ট নেওয়া হয়েছে, শেষ বাক্যটি সরানো হয়েছে।
ব্যবহারকারী 281377

2
কেবল সর্বজনীন চূড়ান্ত ক্ষেত্রগুলি ব্যবহার করুন, অ্যাক্সেসরদের সাথে সময় নষ্ট করার কোনও কারণ নেই।
augurar

1

কোনও পদ্ধতি থেকে নিজস্ব শ্রেণি / কাঠামোয় একাধিক রিটার্ন মান স্থাপন করা বার্তা ভিত্তিক সিস্টেমে অনুরোধ এবং প্রতিক্রিয়ার জন্য একটি শ্রেণিযুক্ত ক্ষেত্রে ব্যবহৃত হয় । এর উদাহরণ হ'ল সিম্পল অবজেক্ট অ্যাক্সেস প্রোটোকল (এসওএপি)

এটি একটি ভাল নকশা এবং কেন?

কমপক্ষে এটি বেশ সাধারণ বিষয়। এটি ভাল বা খারাপ যদি আপনার বিশেষ ব্যবহারের উপর নির্ভর করে।


0

সংক্ষিপ্ত উত্তর: আপনি দুটি মান সহ একটি অ্যারে বা একটি তালিকা ফেরত দিতে পারেন।

আমি ব্যক্তিগতভাবে দুটি স্বতন্ত্র পদ্ধতি লিখব, যেমন

int x = obj.getX();
int y = obj.getY();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.