" নামের " এবং "হিসাবে" পদ্ধতির নামের উপসর্গগুলির মধ্যে পার্থক্য কী
- তালিকা(),
- asList (),
- ইত্যাদি ...
কোন পদ্ধতি নকশা করার সময় কোনটি ব্যবহার করবেন?
" নামের " এবং "হিসাবে" পদ্ধতির নামের উপসর্গগুলির মধ্যে পার্থক্য কী
কোন পদ্ধতি নকশা করার সময় কোনটি ব্যবহার করবেন?
উত্তর:
একটি toXYZ()
ফাংশন একটি রূপান্তর করে এবং একটি নতুন স্বতন্ত্র অবজেক্ট প্রত্যাবর্তন প্রত্যাশা করা হয় (অপরিবর্তনীয়তা অপ্টিমাইজেশনের জন্য অনুমতি দেয়, java.lang.String.toString()
কেবলমাত্র বস্তুটি ফেরত দেয়)।
উদাহরণস্বরূপ, সি ++ এ আমাদের রয়েছে std::bitset::to_ulong()
যা সহজেই ব্যর্থ হতে পারে এবং সম্পূর্ণরূপে to_string()
, সমস্তই একটি (কম বা কম) জটিল রূপান্তরকরণ এবং মেমরি বরাদ্দ করে।
asXYZ()
অন্যদিকে কোনও ক্রিয়াকলাপটি ন্যূনতম কাজ করে উত্সটির (সম্ভাব্য ভিন্ন) দৃষ্টিভঙ্গি প্রত্যাশা করবে।
উদাহরণস্বরূপ, সি ++ এ আমাদের রয়েছে std::as_const()
যা কেবলমাত্র একটি ধ্রুবক রেফারেন্স দেয় এবং আরও জড়িত std::forward_as_tuple
যা রেফারেন্স দ্বারা তার যুক্তিগুলিকেও নির্দেশ করে।
std::to_string(x)
একটি নতুন স্ট্রিং অবজেক্ট std::as_const(x)
তৈরি করে তবে বিদ্যমান বস্তুর একটি রেফারেন্স (একটি ভিউ) তৈরি করে।
সত্যিই, এটি কেবল অসামঞ্জস্যতার নামকরণ করবে। স্মলটক আদর্শ গ্রন্থাগার বস্তু, উদাহরণস্বরূপ তাকান, সব পদ্ধতি যে কি "জটিল ধর্মান্তর" বা "আরেক ধরনের সহজ উপস্থাপনা আসতে" সঙ্গে পূর্বে সমাধান হয় as
, হিসাবে asString
, asFloat
, asSeconds
, এবং অন্য কিছু কিছু রূপান্তরের জন্য মান পদ্ধতি, as: aClass
।
রুবি সালে পদ্ধতি একই ধরণের প্রিফিক্স করা to_
হিসাবে, to_s
, to_a
, to_h
, সংক্ষেপে string
, array
এবং hash
যথাক্রমে।
কোনও মানক গ্রন্থাগারই বিভিন্ন ধরণের রূপান্তরগুলির মধ্যে পার্থক্য বলে মনে হয় না, সম্ভবত এটি বাস্তবায়নের বিশদ হিসাবে বিবেচনা করা উচিত।
তবে জাভাতে আমরা প্রচুর মিশ্রণ দেখতে পাই। আপনাকে উল্লেখ হিসাবে, আছে toString
, asList
এবং তাই। আমি বিশ্বাস করি এগুলি কেবল একটি নামকরণের অসঙ্গতি, কারণ আপনি যদি প্রতিটি উপসর্গের জন্য পৃথক অর্থ সংজ্ঞায়িত করার চেষ্টা করেন তবে আপনি সর্বদা আদর্শ লাইব্রেরির অন্য কোনও জায়গায় একটি পাল্টা উদাহরণ পাবেন।
সুতরাং যে কোনও ক্ষেত্রে, আমি বলতে চাই গুরুত্বপূর্ণ জিনিসটি আপনার এবং আপনার দলের জন্য একটি উপসর্গ বাছাই করা এবং কোডের মধ্যে এটি ধারাবাহিকভাবে ব্যবহার করা। ধারাবাহিকতা হ'ল চাবিকাঠি, সুতরাং আপনার মতো লোকেরাও অবাক হয়ে যায়।
toString
একটি নতুন স্ট্রিং তৈরি করে যা বস্তু থেকে সম্পূর্ণ সংযোগ বিচ্ছিন্ন হয়ে যায় (এবং অপরিবর্তনীয়তার কারণে আর কোনও উপায় নেই)। একই উদাঃ ঝুলিতে, জন্য Collection#toArray
, যখন Arrays#asList
আয় অ্যারে, যা bidirectionally সংযুক্ত করা হয় একটি দৃশ্য (অ্যারে mutating তালিকা এবং তদ্বিপরীত পরিবর্তন)। সুতরাং এটি মোটামুটি সামঞ্জস্যপূর্ণ, যদিও ব্যতিক্রম থাকতে পারে। একটি উপসর্গ বাছাই ভুল হবে। যদি সেখানে থাকে Arrays#toList
, তবে আমি এটি একটি নতুন অন্তর্নিহিত অ্যারে সহ একটি নতুন তালিকা তৈরি করার প্রত্যাশা করব।
ইতিমধ্যে একটি স্বীকৃত উত্তর থাকা সত্ত্বেও, এটি সি ++ তে ফোকাস করবে বলে মনে হচ্ছে, প্রশ্নটি জাভা দিয়ে ট্যাগ করা আছে । জাভাতে, এই ধরণের জিনিসটির জন্য প্রথম যে উদাহরণটি মনে আসে তা হ'ল অ্যারেএস.এললিস্ট , যা মূলত একটি অ্যারের একটি ভিউ, তালিকায় গুটিয়ে দেয় 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();
}
}
}
পার্থক্যটি আমি লক্ষ্য করেছি (ঠিক এখন এটি সম্পর্কে চিন্তা করে) is
সুতরাং আমরা AsInteger এবং AsString দেখি এবং আমরা ToArray এবং ToStringList দেখতে পাই।
একটি রূপান্তর বোঝায় যা বোঝায় (এটি একটি আন্দোলন, একটি প্রক্রিয়া)। যেমন একটি উপস্থাপনা বোঝায়, মূল বিষয়টিকে প্রকাশ করার একটি উপায়।
এটিকে দেখার মতো আরও একটি উপায়:
এবং তারপরে মোকাবেলা করার জন্য "পূর্ব শিল্প" (বা উত্তরাধিকার) রয়েছে। ভাষাগুলি গ্রাউন্ড আপ থেকে সম্পূর্ণরূপে ওও হওয়ার আগে আপনার কাছে স্ট্রিটোইন্ট () এবং ইন্টটোস্টার () এর মতো লাইব্রেরি ফাংশন থাকবে। তারা রূপান্তর সম্পাদন করে, তারা অপারেশন করে তাই তাদেরকে সামিথিংসোমেথিনজেলস () বলে কল্পনা করা বুদ্ধিমান হয়েছিল। সর্বোপরি, টু As এর চেয়ে বেশি সক্রিয়। আমি এখানে বিশেষ করে দেলফি নিয়ে ভাবছি।
সি # যখন সমস্ত পথে ওও যাওয়ার উচ্চাকাঙ্ক্ষার সাথে ডিজাইন করা হয়েছিল, তখন এটি এখন পূর্ণসংখ্যার অবজেক্টে এমন একটি পদ্ধতি রয়েছে যা পূর্ণসংখ্যাকে একটি স্ট্রিতে রূপান্তরিত করে। যদিও আমাদের একটি কনভার্ট ক্লাসও রয়েছে তবে স্ট্রিংয়ে রূপান্তর করা এত সাধারণ যে এটি বস্তুতে ভার্চুয়াল পদ্ধতিতে পরিণত হয়েছিল। ডিজাইনাররা বুঝতে পেরেছেন যে টুস্ট্রিং পুরানো দৃষ্টান্তের লোকদের সাথে আরও পরিচিত হবে এবং সম্ভবত এ কারণেই আমরা ভার্চুয়াল পদ্ধতি টসস্ট্রিং () পেয়েছি এবং ভার্চুয়াল সম্পত্তি অস্ট্রাস্টিং নয়।
toString()
?