পদ্ধতির নামের উপসর্গগুলিতে "থেকে" এবং "হিসাবে" এর মধ্যে পার্থক্য কী? [বন্ধ]


78

" নামের " এবং "হিসাবে" পদ্ধতির নামের উপসর্গগুলির মধ্যে পার্থক্য কী

  • তালিকা(),
  • asList (),
  • ইত্যাদি ...

কোন পদ্ধতি নকশা করার সময় কোনটি ব্যবহার করবেন?

উত্তর:


120

একটি toXYZ()ফাংশন একটি রূপান্তর করে এবং একটি নতুন স্বতন্ত্র অবজেক্ট প্রত্যাবর্তন প্রত্যাশা করা হয় (অপরিবর্তনীয়তা অপ্টিমাইজেশনের জন্য অনুমতি দেয়, java.lang.String.toString()কেবলমাত্র বস্তুটি ফেরত দেয়)।
উদাহরণস্বরূপ, সি ++ এ আমাদের রয়েছে std::bitset::to_ulong()যা সহজেই ব্যর্থ হতে পারে এবং সম্পূর্ণরূপে to_string(), সমস্তই একটি (কম বা কম) জটিল রূপান্তরকরণ এবং মেমরি বরাদ্দ করে।

asXYZ()অন্যদিকে কোনও ক্রিয়াকলাপটি ন্যূনতম কাজ করে উত্সটির (সম্ভাব্য ভিন্ন) দৃষ্টিভঙ্গি প্রত্যাশা করবে।
উদাহরণস্বরূপ, সি ++ এ আমাদের রয়েছে std::as_const()যা কেবলমাত্র একটি ধ্রুবক রেফারেন্স দেয় এবং আরও জড়িত std::forward_as_tupleযা রেফারেন্স দ্বারা তার যুক্তিগুলিকেও নির্দেশ করে।


19
দেখা যাচ্ছে যে এর কিছু বিদ্যমান নজির রয়েছে। সাধারণভাবে, যেমন [কিছু] কাস্টের সাথে সমান হবে, সেখানে [কিছু] একটি বিদ্যমান বস্তু থেকে একটি নতুন অবজেক্ট (ভিন্ন ধরণের) তৈরি করে। টোলিস্টের ক্ষেত্রে এটি ও (এন) হতে চলেছে এবং অবশ্যই "আশের" চেয়ে আরও ব্যয়বহুল। স্ট্যাকওভারফ্লো.com
রবার্ট হার্ভে

5
এটি বর্ণনামূলক নামগুলি নির্বাচনের অংশ, এবং কোডিং মানটিতে যদি এই নির্দিষ্ট পার্থক্যটি কোড করা না থাকে তবে এটি লঙ্ঘন করা সর্বনিম্ন বিস্ময়ের মূলনীতিটি ভঙ্গ করে ।
Deduplicator

11
আমি এটিকে স্বভাবগতভাবে বর্ণনা করব, আমি "থেকে" "পরিবর্তন" হিসাবে এবং "হিসাবে" "হিসাবে" হিসাবে বিবেচনা করব। প্রাক্তনটি জিনিসটি পরিবর্তন করতে কাজকে বোঝায়, দ্বিতীয়টি বোঝায় যে আপনি এটির সাথে কীভাবে কাজ করবেন তার মধ্যে কেবল একটি পার্থক্য।
লেটি

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

4
এই উত্তরটি সি ++ তেও নির্ভুল: উদাহরণস্বরূপ std::to_string(x)একটি নতুন স্ট্রিং অবজেক্ট std::as_const(x)তৈরি করে তবে বিদ্যমান বস্তুর একটি রেফারেন্স (একটি ভিউ) তৈরি করে।
কুইকসপ্লসোন

13

সত্যিই, এটি কেবল অসামঞ্জস্যতার নামকরণ করবে। স্মলটক আদর্শ গ্রন্থাগার বস্তু, উদাহরণস্বরূপ তাকান, সব পদ্ধতি যে কি "জটিল ধর্মান্তর" বা "আরেক ধরনের সহজ উপস্থাপনা আসতে" সঙ্গে পূর্বে সমাধান হয় as, হিসাবে asString, asFloat, asSeconds, এবং অন্য কিছু কিছু রূপান্তরের জন্য মান পদ্ধতি, as: aClass

রুবি সালে পদ্ধতি একই ধরণের প্রিফিক্স করা to_হিসাবে, to_s, to_a, to_h, সংক্ষেপে string, arrayএবং hashযথাক্রমে।

কোনও মানক গ্রন্থাগারই বিভিন্ন ধরণের রূপান্তরগুলির মধ্যে পার্থক্য বলে মনে হয় না, সম্ভবত এটি বাস্তবায়নের বিশদ হিসাবে বিবেচনা করা উচিত।

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

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


1
আমি বিশ্বাস করি না: পুরো দলের জন্য একটি স্টাইল বাছাই করা, ধারাবাহিকভাবে মডিউলে একই রকমের ক্ষেত্রে একটি স্টাইল বেছে নিন।
ড্যানিয়েল হুরি

12
জাভাতে, toStringএকটি নতুন স্ট্রিং তৈরি করে যা বস্তু থেকে সম্পূর্ণ সংযোগ বিচ্ছিন্ন হয়ে যায় (এবং অপরিবর্তনীয়তার কারণে আর কোনও উপায় নেই)। একই উদাঃ ঝুলিতে, জন্য Collection#toArray, যখন Arrays#asListআয় অ্যারে, যা bidirectionally সংযুক্ত করা হয় একটি দৃশ্য (অ্যারে mutating তালিকা এবং তদ্বিপরীত পরিবর্তন)। সুতরাং এটি মোটামুটি সামঞ্জস্যপূর্ণ, যদিও ব্যতিক্রম থাকতে পারে। একটি উপসর্গ বাছাই ভুল হবে। যদি সেখানে থাকে Arrays#toList, তবে আমি এটি একটি নতুন অন্তর্নিহিত অ্যারে সহ একটি নতুন তালিকা তৈরি করার প্রত্যাশা করব।
মার্টিনাস

আমার মনে হয় সেখানে স্মার্টটাক কেবল একটি ভুল করেছে, তারা কনভেনশন বুঝতে পারে নি। এটি বোঝা একটি কঠিন সম্মেলন (এবং এমনকি লক্ষ্য করা) কারণ এটি এত বিমূর্ত এবং এটি বিশেষভাবে প্রভাবশালী নয়। এমনকি এই প্রশ্নটি জিজ্ঞাসা করার খুব কাজটির জন্য কিছু অন্তর্দৃষ্টি প্রয়োজন।
usr

3
@ স্মর্টালটাক এটি একটি কনভেনশন হওয়ার আগেই নকশা করা হয়েছিল
বার্গি

6

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

String[] wordArray = {"one", "fine", "day"};
List<String> wordList = Arrays.asList(wordArray);

// changes to the array are visible in the list
System.out.println(wordList); // prints "[one, fine, day]"
wordArray[1] = "horrible";
System.out.println(wordList); // prints "[one, horrible, day]"

// changes to the list are visible in the array
wordList.set(1, "beautiful");
System.out.println(wordArray[1]); // prints "beautiful"

// but changes to the list or array don't affect the 
// result from the list's toArray method.
String[] moreWords = wordList.toArray(new String[] {});
wordList.set(0, "the");
wordArray[1] = "best";
for (int i=0; i<3; i++) {
  System.out.println(moreWords[i]); // prints "one", "beautiful", and "day"
}

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

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

  /**
   * Every Node is either an ANode or a BNode.
   */
  interface Node {

    /**
     * Returns this Node as an ANode.
     * 
     * @return this node
     */
    default ANode asANode() {
      if (this instanceof ANode) {
        return (ANode) this;
      }
      else {
        throw new UnsupportedOperationException();
      }
      // Or, in Java8 style, perhaps:
      // return Optional.of(this)
      //     .filter(ANode.class::isInstance)
      //     .map(ANode.class::cast)
      //     .orElseThrow(UnsupportedOperationException::new);
    }

    /**
     * Returns this Node as a BNode.
     * 
     * @return this node
     */
    default BNode asBNode() {
      if (this instanceof BNode) {
        return (BNode) this;
      }
      else {
        throw new UnsupportedOperationException();
      }
    }
  }

1

পার্থক্যটি আমি লক্ষ্য করেছি (ঠিক এখন এটি সম্পর্কে চিন্তা করে) is

  • সাধারণত একটি ভিন্ন রেফারেন্স ধরণের রূপান্তর করতে (কিছুটা জটিল বস্তু)
  • সাধারণত হিসাবে একটি সাধারণ মান প্রকার

সুতরাং আমরা AsInteger এবং AsString দেখি এবং আমরা ToArray এবং ToStringList দেখতে পাই।

একটি রূপান্তর বোঝায় যা বোঝায় (এটি একটি আন্দোলন, একটি প্রক্রিয়া)। যেমন একটি উপস্থাপনা বোঝায়, মূল বিষয়টিকে প্রকাশ করার একটি উপায়।

এটিকে দেখার মতো আরও একটি উপায়:

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

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

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


3
কি হবে toString()?
ডিসিপ্লিকেটর

আপনি আমাকে সেখানে পেয়েছেন। আমি মনে করি AsString আরও উপযুক্ত হতে পারে। কিছু সংযোজন চিন্তাভাবনা করা, আমি আমার উত্তর আপডেট করব।
মার্টিন মাট

আমি মনে করি না যে এই উত্তরটি সি # তে থাকা সম্মেলনগুলিতে সত্যিই মেলে। যেমন। ToList () এবং AsEnumerable () উভয়ই জটিল বস্তুগুলি ফেরত দেয়, পার্থক্যটি ToList () সর্বদা একটি নতুন অবজেক্ট ফিরিয়ে দেয় যখন AsEnumerable () মূল অবজেক্টের উপর একটি ভিউ বা অ্যাডাপ্টার দেয়।
জ্যাকবিবি

@ জাকসবি স্পষ্টতই বিভিন্ন ধারণা এখানে এবং সেখানে প্রয়োগ করা হয়েছে। ডিলফির টিফিল্ড অবজেক্টগুলিতে AsInteger এবং AsString বৈশিষ্ট্য রয়েছে (যা ডাটাবেস ক্ষেত্রগুলিকে encapsulate করে)। আমি এটি দ্বারা পক্ষপাতদুষ্ট হতে পারে। তবে আবার, প্রশ্নটি জাভা দিয়ে ট্যাগ করা হয়েছে, সি # বা ডেলফির সাথে নয় either
মার্টিন মাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.