কেন জাভা অপারেটরকে ওভারলোডিং অফার করে না?


404

সি ++ থেকে জাভাতে আসা, স্পষ্ট উত্তরহীন প্রশ্ন হ'ল জাভা কেন অপারেটর ওভারলোডিংকে অন্তর্ভুক্ত করেনি?

এর Complex a, b, c; a = b + c;চেয়ে সহজ না Complex a, b, c; a = b.add(c);?

অপারেটরকে ওভারলোডিং না করার জন্য বৈধ যুক্তিগুলির এর কোনও কারণ আছে ? কারণটি নির্বিচারে, বা সময় হারিয়েছে?



1
@ জিজেজ, নিবন্ধটি পড়তে আমার খুব কষ্ট হচ্ছে। এটি কি স্বয়ংক্রিয় অনুবাদ হয়েছে, না ইংরেজী লেখকের দ্বিতীয় ভাষা? আমি এখানে আলোচনাটি আরও পরিষ্কার পরিচ্ছন্ন বলে মনে করি।

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

@NoNaMe এটা সহজ, শুধু মানসিকভাবে সন্নিবেশ একটি এবং - অনুপস্থিত artlcles একটি মৃত giveaway যে ব্যক্তি হয় একটি ইংরেজি নেটিভ স্পিকার বা প্রোগ্রামার নয় (বা এই লোক মত, উভয় :) কারণ প্রোগ্রামারদের নিবন্ধ ড্রপ করতে পারেন এটা করতে পারেন যে মন্তব্যগুলি সংক্ষিপ্ত করুন এবং প্রদত্ত জায়গাতে আরও সহজ ফিট করুন .. সেখান থেকে, তারা কেবল এটির অভ্যস্ত হয়ে যায়। আমার সমস্যাটি লেআউটটির সাথে, কোনওভাবে আমি সর্বদা গুগল অনুসন্ধানগুলিতে সেই সাইটটিকে হিট করছি। সৌভাগ্য যে সেখানে একটি মহান ক্রোম এক্সটেনশন বলা হয় স্পষ্টত যে reformats হার্ড চমৎকার পৃষ্ঠার তথ্য পড়ুন।
ycomp

1
আমি কেন কোনও কারণ দেখছি না কেন ও কীভাবে প্রথম উত্তরটি গ্রহণ করে? @ স্ট্যাকওভারফ্লো . com/users/14089/paceedbal লিখেছেন উত্তরটি দুর্দান্ত। এটি গ্রহণ করা উচিত।
ধ্বংসকারী

উত্তর:


13

ধরে নিচ্ছি যে আপনি উল্লিখিত অবজেক্টটির পূর্বের মানটি ওভাররাইট করতে চেয়েছিলেন a, তারপরে একটি সদস্য ফাংশন চাওয়া হবে।

Complex a, b, c;
// ...
a = b.add(c);

সি ++ এ, এই অভিব্যক্তিটি কম্পাইলারকে স্ট্যাকের উপর তিনটি (3) অবজেক্ট তৈরি করতে, সংযোজন সম্পাদন করতে এবং অস্থায়ী বস্তু থেকে বিদ্যমান বস্তুতে ফলাফল মানটি অনুলিপি করতে বলে a

যাইহোক, জাভাতে, operator=রেফারেন্স ধরণের জন্য মান অনুলিপি সম্পাদন করে না এবং ব্যবহারকারীরা কেবল নতুন ধরণের রেফারেন্স টাইপ তৈরি করতে পারে, মান ধরণের নয়। সুতরাং নামের একটি ব্যবহারকারী-সংজ্ঞায়িত প্রকারের জন্য Complex, অ্যাসাইনমেন্টের অর্থ বিদ্যমান মানের একটি রেফারেন্স অনুলিপি করা।

পরিবর্তে বিবেচনা করুন:

b.set(1, 0); // initialize to real number '1'
a = b; 
b.set(2, 0);
assert( !a.equals(b) ); // this assertion will fail

সি ++ এ, এটি মানটি অনুলিপি করে, তাই তুলনাটি ফলাফলটির সমান হবে না। জাভা সালে operator=সঞ্চালিত রেফারেন্স কপি, তাই aএবং bএখন একই মান উল্লেখ করা হয়। ফলস্বরূপ, তুলনাটি 'সমান' উত্পাদন করবে, যেহেতু বস্তুটি নিজের সাথে সমান তুলনা করবে।

অনুলিপি এবং রেফারেন্সের মধ্যে পার্থক্য কেবল অপারেটর ওভারলোডিংয়ের বিভ্রান্তিকে যুক্ত করে। @ সেবাস্তিয়ান যেমন উল্লেখ করেছেন, জাভা এবং সি # উভয়কেই পৃথকভাবে মূল্য এবং রেফারেন্স সাম্যতার operator+মোকাবেলা করতে হবে - সম্ভবত মান এবং অবজেক্টের সাথে ডিল করতে পারে, তবে operator=ইতিমধ্যে রেফারেন্সগুলি মোকাবেলায় কার্যকর করা হয়েছে।

সি ++ তে আপনার একবারে কেবল এক ধরণের তুলনা করা উচিত, তাই এটি কম বিভ্রান্তিকর হতে পারে। উদাহরণস্বরূপ, উপর Complex, operator=এবং operator==যদি দুটি মানই কাজ করছি - মান অনুলিপি এবং যথাক্রমে মান তুলনা।


6
এটি সত্যিই বেশ সহজ ... ঠিক পাইথনের মতোই করুন এবং কোনও ওভারলোডেড অ্যাসাইনমেন্ট নেই।
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

225
এই উত্তরটি প্রশ্নের কোনও উত্তর দেয় না। আপনি জাভা সমান চিহ্ন ব্যবহারের জন্য কেবল ক্ষতি করছেন। যদি বি + সি একটি নতুন কমপ্লেক্স ফিরিয়ে দেয়, তবে a = b + c পুরোপুরি বৈধ হবে, এবং হ্যাঁ পড়তে আরও সহজ। এমনকি আপনি যদি জায়গায় কোনও সংশোধন করতে চেয়েছিলেন তবে, a.set (b + c) পড়ার জন্য একটি টোন সহজ - বিশেষত যখন গাণিতিকগুলি তুচ্ছের চেয়ে বেশি হয়: a.set ((a b + b c) / 5) বা a = a.multply (b) .add (b.m Multiply (c))। বিভাজক (5) আপনার পছন্দ ..
বিটি

24
অথবা আমার ধারণা .. আপনার পছন্দ নয়, যেমনটি হতে পারে
বিটি

9
সি ++ তে এক্সপ্রেশন টেমপ্লেটগুলি অতিরিক্ত অনুলিপিটির সমস্যা সমাধান করে। খুব সুন্দর সমস্ত বড় পাটিগণিত লাইব্রেরি এই কৌশলটি এই কারণে ব্যবহার করে। এছাড়াও, এটি প্রশ্নের সমাধান করে না, যেহেতু a = b + c কেবল a.foo (বি.বার (সি)) এর জন্য সিনট্যাকটিক চিনি, যা সত্যই এই প্রশ্নের প্রাথমিক পর্যবেক্ষণ।
কাজ ড্রাগন

18
এটি জিজ্ঞাসিত প্রশ্নের উত্তর নয়। এটি জাভা এবং সি ++ এর মধ্যে নির্দিষ্ট পার্থক্য সম্পর্কে কারও জল্পনা।
শেচপুরিন

803

অপারেটর ওভারলোডিং সম্পর্কে অনেকগুলি পোস্ট অভিযোগ করছে।

আমি অনুভব করেছি যে আমাকে "অপারেটর ওভারলোডিং" ধারণাটি পরিষ্কার করতে হবে, এই ধারণার বিকল্প বিকল্পটি উপস্থাপন করার জন্য।

কোড অবরুদ্ধ?

এই যুক্তি একটি ভ্রান্তি।

সমস্ত ভাষায় অবরুদ্ধ করা সম্ভব ...

অপারেটর ওভারলোডের মাধ্যমে সি ++ তে যেমন ফাংশন / পদ্ধতিতে সি বা জাভাতে কোড অবলম্বন করা সহজ তত সহজ:

// C++
T operator + (const T & a, const T & b) // add ?
{
   T c ;
   c.value = a.value - b.value ; // subtract !!!
   return c ;
}

// Java
static T add (T a, T b) // add ?
{
   T c = new T() ;
   c.value = a.value - b.value ; // subtract !!!
   return c ;
}

/* C */
T add (T a, T b) /* add ? */
{
   T c ;
   c.value = a.value - b.value ; /* subtract !!! */
   return c ;
}

... এমনকি জাভা স্ট্যান্ডার্ড ইন্টারফেসে

অন্য উদাহরণের জন্য, জাভাতে Cloneableইন্টারফেসটি দেখুন :

আপনার এই ইন্টারফেসটি প্রয়োগকারী অবজেক্টটি ক্লোন করার কথা। তবে আপনি মিথ্যা বলতে পারেন। এবং একটি ভিন্ন অবজেক্ট তৈরি করুন। প্রকৃতপক্ষে, এই ইন্টারফেসটি এতটাই দুর্বল যে আপনি কেবল অন্য ধরণের জিনিসটি কেবল মজাদার জন্য ফিরে আসতে পারেন:

class MySincereHandShake implements Cloneable
{
    public Object clone()
    {
       return new MyVengefulKickInYourHead() ;
    }
}

Cloneableইন্টারফেসটি যেমন আপত্তিজনক / আপত্তিজনকভাবে ব্যবহার করা যেতে পারে, তখন কি একই ভিত্তিতে সি ++ অপারেটর ওভারলোডিং নিষিদ্ধ করা উচিত?

দিনের ক্লান্তিকর ঘন্টাটি ফিরিয়ে আনতে আমরা toString()কোনও MyComplexNumberশ্রেণীর পদ্ধতিটি ওভারলোড করতে পারি। করা উচিত toString()ওভারলোডিং খুব নিষিদ্ধ করা? আমরা MyComplexNumber.equalsএলোমেলো করে দিতে পারি এটি এলোমেলো মান ফিরিয়ে আনতে, অপারেশনগুলিকে পরিবর্তন করতে পারে ... ইত্যাদি ইত্যাদি।

জাভাতে, সি ++ বা যে কোনও ভাষা হিসাবে, কোড লেখার সময় প্রোগ্রামারকে ন্যূনতম শব্দার্থকে সম্মান করতে হবে। এর অর্থ হ'ল একটি addফাংশন এবং সংযোজন Cloneableপদ্ধতি যা ক্লোন করে এবং ++ইনক্রিমেন্টের চেয়ে অপারেটর কার্যকর করে implementing

যাইহোক হতাশ কি?

এখন যেহেতু আমরা জানি যে প্রাথমিক জাভা পদ্ধতির মাধ্যমেও কোডটিকে নাশকতা করা যেতে পারে, আমরা সি ++ এ অপারেটর ওভারলোডিংয়ের আসল ব্যবহার সম্পর্কে নিজেকে জিজ্ঞাসা করতে পারি?

পরিষ্কার এবং প্রাকৃতিক স্বরলিপি: পদ্ধতি বনাম অপারেটর ওভারলোডিং?

আমরা জাভা এবং সি ++ এর "একই" কোডটি নীচের সাথে তুলনা করব, কোন ধরণের কোডিং শৈলীটি পরিষ্কার of

প্রাকৃতিক তুলনা:

// C++ comparison for built-ins and user-defined types
bool    isEqual          = A == B ;
bool    isNotEqual       = A != B ;
bool    isLesser         = A <  B ;
bool    isLesserOrEqual  = A <= B ;

// Java comparison for user-defined types
boolean isEqual          = A.equals(B) ;
boolean isNotEqual       = ! A.equals(B) ;
boolean isLesser         = A.comparesTo(B) < 0 ;
boolean isLesserOrEqual  = A.comparesTo(B) <= 0 ;

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

প্রাকৃতিক অ্যারে / ধারক অ্যাকসেসর এবং সাবস্ক্রিপশন:

// C++ container accessors, more natural
value        = myArray[25] ;         // subscript operator
value        = myVector[25] ;        // subscript operator
value        = myString[25] ;        // subscript operator
value        = myMap["25"] ;         // subscript operator
myArray[25]  = value ;               // subscript operator
myVector[25] = value ;               // subscript operator
myString[25] = value ;               // subscript operator
myMap["25"]  = value ;               // subscript operator

// Java container accessors, each one has its special notation
value        = myArray[25] ;         // subscript operator
value        = myVector.get(25) ;    // method get
value        = myString.charAt(25) ; // method charAt
value        = myMap.get("25") ;     // method get
myArray[25]  = value ;               // subscript operator
myVector.set(25, value) ;            // method set
myMap.put("25", value) ;             // method put

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

সি ++ এ, প্রতিটি কন্টেইনার তার সামগ্রী অ্যাক্সেস করতে একইভাবে ব্যবহার করে, অপারেটর ওভারলোডিংয়ের জন্য ধন্যবাদ।

প্রাকৃতিক উন্নত প্রকারের হেরফের

Matrix" জাভা ম্যাট্রিক্স অবজেক্ট " এবং " সি ++ ম্যাট্রিক্স অবজেক্ট " এর জন্য গুগলে পাওয়া প্রথম লিঙ্কগুলি ব্যবহার করে নীচের উদাহরণগুলিতে একটি অবজেক্ট ব্যবহার করা হয়েছে :

// C++ YMatrix matrix implementation on CodeProject
// http://www.codeproject.com/KB/architecture/ymatrix.aspx
// A, B, C, D, E, F are Matrix objects;
E =  A * (B / 2) ;
E += (A - B) * (C + D) ;
F =  E ;                  // deep copy of the matrix

// Java JAMA matrix implementation (seriously...)
// http://math.nist.gov/javanumerics/jama/doc/
// A, B, C, D, E, F are Matrix objects;
E = A.times(B.times(0.5)) ;
E.plusEquals(A.minus(B).times(C.plus(D))) ;
F = E.copy() ;            // deep copy of the matrix

এবং এটি ম্যাট্রিক্সের মধ্যে সীমাবদ্ধ নয়। BigIntegerএবং BigDecimalজাভার ক্লাস, একই বিভ্রান্তিকর ভারবোসিটি ভোগা যেহেতু সি তাদের সমতুল ++, হিসাবে বিল্ট-ইন ধরনের স্পষ্ট।

প্রাকৃতিক পুনরাবৃত্তিকারী:

// C++ Random Access iterators
++it ;                  // move to the next item
--it ;                  // move to the previous item
it += 5 ;               // move to the next 5th item (random access)
value = *it ;           // gets the value of the current item
*it = 3.1415 ;          // sets the value 3.1415 to the current item
(*it).foo() ;           // call method foo() of the current item

// Java ListIterator<E> "bi-directional" iterators
value = it.next() ;     // move to the next item & return the value
value = it.previous() ; // move to the previous item & return the value
it.set(3.1415) ;        // sets the value 3.1415 to the current item

প্রাকৃতিক ফান্টেক্টর:

// C++ Functors
myFunctorObject("Hello World", 42) ;

// Java Functors ???
myFunctorObject.execute("Hello World", 42) ;

পাঠ্য সংক্ষিপ্তকরণ:

// C++ stream handling (with the << operator)
                    stringStream   << "Hello " << 25 << " World" ;
                    fileStream     << "Hello " << 25 << " World" ;
                    outputStream   << "Hello " << 25 << " World" ;
                    networkStream  << "Hello " << 25 << " World" ;
anythingThatOverloadsShiftOperator << "Hello " << 25 << " World" ;

// Java concatenation
myStringBuffer.append("Hello ").append(25).append(" World") ;

ঠিক আছে, জাভাতে আপনি খুব ব্যবহার করতে পারেন MyString = "Hello " + 25 + " World" ;... তবে, এক সেকেন্ড অপেক্ষা করুন: এটি অপারেটর ওভারলোডিং, তাই না? এটা কি প্রতারণা করছে না ???

:-D

জেনেরিক কোড?

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

উদাহরণস্বরূপ, স্বেচ্ছাচারী ধরণের দুটি মানের গড় মূল্য গণনা:

// C++ primitive/advanced types
template<typename T>
T getAverage(const T & p_lhs, const T & p_rhs)
{
   return (p_lhs + p_rhs) / 2 ;
}

int     intValue     = getAverage(25, 42) ;
double  doubleValue  = getAverage(25.25, 42.42) ;
complex complexValue = getAverage(cA, cB) ; // cA, cB are complex
Matrix  matrixValue  = getAverage(mA, mB) ; // mA, mB are Matrix

// Java primitive/advanced types
// It won't really work in Java, even with generics. Sorry.

অপারেটর ওভারলোডিং নিয়ে আলোচনা করা

অপারেটর ওভারলোডিং ব্যবহার করে সি ++ কোড এবং জাভাতে একই কোডের মধ্যে এখন আমরা ন্যায্য তুলনা দেখেছি, এখন আমরা একটি ধারণা হিসাবে "অপারেটর ওভারলোডিং" নিয়ে আলোচনা করতে পারি।

কম্পিউটারের আগে থেকেই অপারেটর ওভারলোডিংয়ের অস্তিত্ব ছিল

বাহিরে এমনকি কম্পিউটার বিজ্ঞান, সেখানে অপারেটর ওভারলোডিং হল: উদাহরণস্বরূপ, গণিত, অপারেটর পছন্দ +, -, *, ইত্যাদি ওভারলোড করা হয়।

বস্তুত, এর গুরূত্ব +, -, *, ইত্যাদি পরিবর্তন operands ধরনের (numerics, ভেক্টর, কোয়ান্টাম ওয়েভ ফাংশন, ম্যাট্রিক্স, ইত্যাদি) উপর নির্ভর করে।

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

অপারেটর ওভারলোডিং এর অপারেশনগুলির উপর নির্ভর করে

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

সুতরাং, অপারেন্ডের ধরণটি জানুন এবং আপনি অপারেশনের প্রভাব জানতে পারবেন।

এমনকি সি এবং জাভাতে (হার্ড-কোডেড) অপারেটর ওভারলোডিং রয়েছে

সি-তে, কোনও অপারেটরের আসল আচরণটি তার অপারেন্ডগুলি অনুযায়ী পরিবর্তন হবে। উদাহরণস্বরূপ, দুটি পূর্ণসংখ্যা যোগ করা দুটি ডাবল, বা একটি পূর্ণসংখ্যা এবং একটি দ্বিগুণ যোগ করার চেয়ে পৃথক। এমনকি পুরো পয়েন্টার গাণিতিক ডোমেন (কাস্টিং ব্যতীত, আপনি একটি পয়েন্টারে একটি পূর্ণসংখ্যার যোগ করতে পারেন, তবে আপনি দুটি পয়েন্টার যুক্ত করতে পারবেন না ...)।

জাভাতে, কোনও পয়েন্টার পাটিগণিত নেই, তবে +অপারেটর ব্যতীত কেউ স্ট্রিং কনটেনটেশন খুঁজে পেয়েছেন যে "অপারেটর ওভারলোডিং ইজ ইজ ইজ ইজ" ক্রিয়ায় একটি ব্যতিক্রমকে ন্যায়সঙ্গত করতে যথেষ্ট হাস্যকর হবে।

এটি কেবলমাত্র আপনি সি (historicalতিহাসিক কারণে) বা জাভা ( ব্যক্তিগত কারণে , নীচে দেখুন) কোডার হিসাবে, আপনি নিজের নিজস্ব সরবরাহ করতে পারবেন না।

সি ++ এ অপারেটর ওভারলোডিং alচ্ছিক নয় ...

সি ++ এ, অন্তর্নির্মিত ধরণের জন্য অপারেটর ওভারলোডিং সম্ভব নয় (এবং এটি একটি ভাল জিনিস) তবে ব্যবহারকারী-সংজ্ঞায়িত প্রকারের ব্যবহারকারী-সংজ্ঞায়িত অপারেটর ওভারলোড থাকতে পারে।

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

সত্য যে, ভালো toString(), clone(), equals()পদ্ধতি জাভা জন্য প্রযোজ্য ( অর্থাত আপাতদৃষ্টিতে-মানক মত ), সি ++ অপারেটর ওভারলোডিং C- এর এত অংশ ++, যে এটা উল্লেখ জাভা পদ্ধতি সামনে মূল সি অপারেটার প্রাকৃতিক, অথবা হয়ে ওঠে।

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

... তবে এটি ব্যবহার করা উচিত নয়

অপারেটরের ওভারলোডিং অপারেটরের শব্দার্থকে সম্মান করার জন্য প্রচেষ্টা করা উচিত। কোনও +অপারেটরে বিয়োগ করবেন না (যেমন "কোনও addফাংশনে বিয়োগ করবেন না ", বা "কোনও cloneপদ্ধতিতে ক্র্যাপ ফিরুন ")

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

তো ... ঠিক আছে ... তাহলে জাভাতে কেন এটি সম্ভব নয়?

কারণ জেমস গোসলিং তাই বলেছেন:

আমি মোটামুটি ব্যক্তিগত পছন্দ হিসাবে অপারেটরকে ওভারলোডিং ছেড়ে দিয়েছি কারণ আমি অনেক লোককে C ++ এ অপব্যবহার করতে দেখেছি।

জেমস গোসলিং। সূত্র: http://www.gotw.ca/publications/c_family_interview.htm

উপরের গোসলিংয়ের পাঠ্যটি নীচের স্ট্রস্ট্রপের সাথে তুলনা করুন:

অনেকগুলি সি ++ ডিজাইনের সিদ্ধান্তগুলি আমার কিছু অপছন্দ করে কিছু নির্দিষ্ট উপায়ে করতে বাধ্য করার জন্য আমার অপছন্দের মূলগুলি [...] প্রায়শই আমি ব্যক্তিগতভাবে অপছন্দ করা এমন একটি বৈশিষ্ট্যকে নিষিদ্ধ করার প্রলোভন দেখায়, আমি তা করা থেকে বিরত থাকি কারণ আমার মনে হয় না যে আমার কাছে অন্যের উপর আমার মতামত জোর করার অধিকার

বাজনে স্ট্রস্ট্রপ। উত্স: সি ++ এর ডিজাইন এবং বিবর্তন (1.3 সাধারণ পটভূমি)

অপারেটর ওভারলোডিং জাভা উপকার করবে?

কিছু বস্তু অপারেটর ওভারলোডিং (কংক্রিট বা সংখ্যাযুক্ত ধরণের, যেমন বিগডিসিমাল, জটিল সংখ্যা, ম্যাট্রিকস, পাত্রে, পুনরাবৃত্তকারী, তুলনাকারী, পার্সার ইত্যাদি) থেকে প্রচুর উপকার পাবেন।

সি ++ এ আপনি স্ট্রাস্ট্রাপের বিনয়ের কারণে এই সুবিধাটি থেকে লাভ করতে পারেন। জাভাতে, আপনি গোসলিংয়ের ব্যক্তিগত পছন্দের কারণে খুব খারাপ হয়ে গেছেন ।

এটি জাভা যোগ করা যাবে?

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

সুতরাং এই বৈশিষ্ট্যের জন্য অপেক্ষা করে শ্বাস ধরে রাখবেন না ...

তবে তারা এটি সি # তে করে !!!

হ্যাঁ ...

যদিও এটি দুটি ভাষার মধ্যে একমাত্র পার্থক্য থেকে দূরে, এইটি কখনও আমাকে আনন্দ করতে ব্যর্থ হয়।

স্পষ্টতই, সি # জনগণ তাদের "প্রতিটি আদিম একটি struct, এবং structঅবজেক্ট থেকে প্রাপ্ত" দিয়ে প্রথম চেষ্টা করে ঠিকই পেয়েছিলেন।

এবং তারা অন্যান্য ভাষায় এটি !!!

ব্যবহৃত সংজ্ঞায়িত অপারেটর ওভারলোডিংয়ের বিরুদ্ধে সমস্ত FUD সত্ত্বেও, নিম্নোক্ত ভাষাগুলি এটি সমর্থন করে: স্কালা , ডার্ট , পাইথন , এফ # , সি # , ডি , আলগোল 68 , স্মলটালক , গ্রোভি , পারল 6 , সি ++, রুবি , হাস্কেল , ম্যাটল্যাব , আইফেল , লুয়া , ক্লোজার , ফোর্টরান 90 , সুইফ্ট , অ্যাডা , ডেলফি 2005 ...

এতগুলি ভিন্ন ভিন্ন (এবং কখনও কখনও বিরোধী) দর্শন সহ অনেকগুলি ভাষা, এবং তবুও তারা সকলেই এই বিষয়ে একমত হয়।

চিন্তার জন্য খাদ্য...


50
এটি একটি দুর্দান্ত উত্তর। আমি এটির সাথে একমত নই, তবে এটি এখনও একটি দুর্দান্ত উত্তর। আমি মনে করি খারাপ ওভারলোডগুলির সাথে যে সমস্যাগুলি সম্ভব তা ভাল ওভারলোডের মান ছাড়িয়ে যায়।
ডগলাস লিডার

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

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

103
মহাকাব্য উত্তর। আমি পড়েছি সবচেয়ে যোগ্য ডিবাঙ্কগুলির মধ্যে একটি।
সেবাস্তিয়ান মাচ

7
@ মার্টেনবোডওয়েস: আমি উপরে যে উদাহরণগুলি লিখেছি এবং যেগুলি আপনাকে বিরক্ত করে তা হ'ল "একজন বিকাশকারী হিসাবে, আপনি গোসলিংয়ের ব্যক্তিগত পছন্দের কারণে ভ্রষ্ট হয়েছেন " ? দয়া করে, আপনার নিজের উত্তর, রক্ষার লিখতে "তুমি কি ডেভেলপারদের নির্বোধ, প্রতিভা আপনি যাদের জন্য সিদ্ধান্ত কি আপনি প্রয়োজন যাক" কোণ। এই আলোচনা কোনও উদ্দেশ্য করে না।
প্যার্সেবল

44

জেমস গোসলিং জাভাটিকে ডিজাইনিংয়ের সাথে তুলনা করেছেন:

"সরানোর বিষয়ে এই নীতিটি রয়েছে, যখন আপনি একটি অ্যাপার্টমেন্ট থেকে অন্য অ্যাপার্টমেন্টে চলে যান An একটি আকর্ষণীয় পরীক্ষাটি হ'ল আপনার অ্যাপার্টমেন্টটি প্যাক করা এবং সমস্ত কিছু বাক্সে রেখে দেওয়া, তারপরে পরবর্তী অ্যাপার্টমেন্টে চলে যান এবং আপনার প্রয়োজন না হওয়া পর্যন্ত কোনও জিনিস প্যাকেজ করা উচিত নয় So তাই আপনি ' আপনার প্রথম খাবারটি তৈরি করছেন, এবং আপনি কোনও বাক্সের বাইরে কিছু টানছেন Then তারপরে এক মাস বা তার বেশি সময় পরে আপনি এটি ব্যবহার করেছেন আপনার জীবনের কী জিনিসগুলি আসলে আপনার প্রয়োজন তা নির্ধারণ করার জন্য, এবং তারপরে আপনি বাকী অংশটি নিয়ে যান স্টাফ - আপনি কতটা পছন্দ করেন বা এটি কতটা শীতল তা ভুলে যান - এবং আপনি কেবল এটিকে ফেলে দিন It's এটি আপনার জীবনকে কীভাবে সহজতর করে তোলে তা আশ্চর্যজনক এবং আপনি এই নীতিটি সমস্ত ধরণের ডিজাইনের ইস্যুতে ব্যবহার করতে পারেন: কেবল কারণ তারা কাজ করবেন না 'শীতল বা কেবল কারণ তারা আকর্ষণীয় ""

আপনি এখানে উদ্ধৃতি প্রসঙ্গে পড়তে পারেন

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

আর একটি বিষয় হ'ল'&& ',' || ', কাস্ট অপারেটর এবং অবশ্যই' নতুন 'এর মতো ওভারলোডিং অপারেটরগুলি বিকাশকারীদের দ্বারা সি ++ এ বৈশিষ্ট্যটির অপব্যবহার। মান এবং ব্যতিক্রমগুলি দ্বারা পাসের সাথে এটি সংমিশ্রণের ফলে যে জটিলতা হয়েছে তা ব্যতিক্রমী সি ++ বইতে ভালভাবে কভার করা হয়েছে ।


6
আপনি "পাস-বাই-ভ্যালু এবং ব্যতিক্রমগুলির সাথে মিলিত অপারেটর ওভারলোডিংয়ের জটিলতা" এর একটি কোড উদাহরণ সরবরাহ করতে পারেন? কয়েক বছর ভাষা নিয়ে খেলতে, এবং সি ++ তে সমস্ত কার্যকর / ব্যতিক্রমী বইয়ের মালিকানা এবং পড়া থাকা সত্ত্বেও, আপনি এর দ্বারা কী বোঝাতে চেয়েছেন তা বুঝতে আমি ব্যর্থ।
পেরেেসবাল

60
জেমস গোসলিংয়ের জন্য যা কাজ করে তা সবার জন্য কাজ করে না। তিনি "আকর্ষণীয়" প্যাকিং পরীক্ষাকে এক্সট্রাপোলেটিংয়ের জন্য অবিশ্বাস্যভাবে সংক্ষিপ্ত করে দেখিয়েছেন "বিশ্বের যে সমস্ত জিনিস আমার প্রয়োজন হয় না তা ফেলে দিন, তাই কেউ এই জিনিসটি ব্যবহার করতে পারে না।" তিনি কীভাবে আমার প্রয়োজন বা ব্যবহার করবেন তা স্পষ্টভাবে জানেন না।
বিটি

49
@BT: বেশীরভাগ enlightning যখন এই বিষয়ে স্ট্রোভস্ট্রুপের দৃষ্টিভঙ্গি তুলনায় গসলিং এর দৃষ্টিকোণ হল: Many C++ design decisions have their roots in my dislike for forcing people to do things in some particular way [...] Often, I was tempted to outlaw a feature I personally disliked, I refrained from doing so because I did not think I had the right to force my views on others. (B. Stroustrup)
প্যারেসেবল

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

16
@ হাসান: প্রতিটি ভাষার হ্যাক রয়েছে, জাভা এর জেনেরিক্স এর একটি দুর্দান্ত উদাহরণ। এখন, সম্পর্কে I'd like them to go have a look at some C++ code out there that is hideously put together with weird hacks and "exceptional" features of the language: খারাপ প্রোগ্রামাররা ভাষা নির্বিশেষে খারাপ কোড লিখবে। জাভাতে ফাংশন পরামিতিগুলির জন্য ধারণা পেতে কেবল "পাস-বাই-রেফারেন্স" অনুকরণ করার চেষ্টা করুন। আমি কোডটি দেখেছি, এবং এত কষ্ট পেয়ে আঘাত করেছে la এটি গোসলিংয়ের যে জাতীয় জিনিস ব্যবহার করা হয়নি, এটি জাভাতে ভয়ঙ্কর হ্যাকগুলির প্রয়োজন, তবুও, সি # এবং সি ++ উভয় ক্ষেত্রেই শূন্য মূল্যে মূলত বিদ্যমান।
প্যার্সেবল

22

বুস্ট.উনাইটস: লিঙ্ক পাঠ্য দেখুন

এটি অপারেটর ওভারলোডিংয়ের মাধ্যমে শূন্য-ওভারহেড ডাইমেনশনাল বিশ্লেষণ সরবরাহ করে। এটি কত পরিষ্কার হতে পারে?

quantity<force>     F = 2.0*newton;
quantity<length>    dx = 2.0*meter;
quantity<energy>    E = F * dx;
std::cout << "Energy = " << E << endl;

আসলে "শক্তি = 4 জে" আউটপুট দেয় যা সঠিক।


1
"ঠিক কীভাবে রক্ষণাবেক্ষণকে জটিল করে তোলে এবং পৃথিবীতে কোথা থেকে এই অপ্রচলিত কোডটি করা হয়?"
মাকিং হাঁস

13

জাভা ডিজাইনাররা স্থির করেছেন যে অপারেটর ওভারলোডিং এর পক্ষে মূল্যমানের চেয়ে বেশি সমস্যা। যে হিসাবে সহজ।

এমন একটি ভাষায় যেখানে প্রতিটি অবজেক্ট ভেরিয়েবল আসলেই একটি রেফারেন্স হয়, অপারেটর ওভারলোডিং কমপক্ষে সি ++ প্রোগ্রামারের কাছে যথেষ্ট অযৌক্তিক হওয়ার অতিরিক্ত বিপত্তি পেয়ে যায়। সি # এর == অপারেটর ওভারলোডিং এবং Object.Equalsএবং Object.ReferenceEquals(বা যা বলা হোক) এর সাথে পরিস্থিতি তুলনা করুন ।


8

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


4
অপারেটর ওভারলোডিং সহ সমস্ত সিনট্যাক্স-ভারী ভাষাগুলি সেই কৌশলটি ব্যবহার করত। আমি কখনই বুঝতে পারি নি যে তাদের কেন পদ্ধতির নামকরণ এবং অনুসন্ধানের একটি বিশেষ সংস্করণ আবিষ্কার করতে হবে। স্ট্রাস্ট্রাপ ডি ও ইসি ++ তে কোনও বিকল্প উল্লেখ করে না। সি শার্প দল Linq সিনট্যাক্স (সাথে সঠিক পদ্ধতির নেন where ...হয়ে .Where(i => ... )। যদি তারা পাটিগণিত অপারেটরদের সাথে একই কাজ করত তবে অনেক কিছুই সহজ এবং শক্তিশালী হত। জাভাতে একটি পরিষ্কার স্লেটের সুবিধা রয়েছে এবং এটি অধিকার পেতে পারে (যদিও ধর্মীয় কারণে, এটি সম্ভবত কখনও হবে না)।
ড্যানিয়েল আর্উইকার

@ ড্যানিয়েলআরউইকার, আমি প্রায়শই উল্লেখ করেছি যে যখন জটিল মতবিরোধ হয় যে লোকেরা উভয় পক্ষের অনুপ্রেরণাগুলি প্রকৃতির "ধর্মীয়" বলে ট্যাগ করবে।

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

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

6

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


14
In C++ developers would overload operators with functionality that would often have no relation to the commonly accepted nature of the given operator: এটি একটি কৃত্রিম দাবি। আমি 12 বছর থেকে পেশাগত সি ++ বিকাশকারী এবং আমি খুব কমই এই সমস্যাটির মুখোমুখি হয়েছি। আসলে, আমি সি ++ তে সর্বাধিক বাগ এবং ডিজাইনের ত্রুটিগুলি সি-স্টাইল কোড ( void *,
ক্যাসেটস

6
-1। আপনার নির্ধারিত প্রতিটি পরিবর্তনশীল হ'ল পাটিগণিত অপারেটরের প্রতীকগুলির মতো একটি প্রতীক। আপনি সেই পরিবর্তনশীল, একটি শব্দ বা একক বর্ণের নাম রাখতে কোনও বাক্যাংশ ব্যবহার করেন না কেন তা আপনার (বা আপনার দলের) সিদ্ধান্ত। অর্থবোধক আর কোনটি নয় তা কে বলবে? উত্তর আপনি প্রোগ্রামার। খাঁটি গণিতের মধ্যে, ম্যাট্রিকের মধ্যে গুণনের অর্থ মৌলিক গাণিতিকের দুটি সংখ্যার মধ্যে গুণনের থেকে আলাদা কিছু। তবুও আমরা উভয় প্রকারের গুণনের জন্য একই চিহ্ন ব্যবহার করি।
ইঞ্জিনিয়ার

2
@ পেয়ারসাবল: দুর্ভাগ্যক্রমে এই দাবিটি সঠিক। এটি কার্যকর অবস্থায় দেখতে আপনাকে IOstreams এর চেয়ে আরও দূরে দেখতে হবে না। ধন্যবাদ, বেশিরভাগ বিকাশকারীগণ বিদ্যমান অপারেটরগুলির জন্য নতুন শব্দার্থ আবিষ্কারের বিষয়ে আরও সচেতন।
বেন ভয়েগ্ট

5
@ বেনওয়েগ্ট: [...] এবং আমি এমনকি addফাংশনটি সত্যই অপব্যবহার হতে পারে (এমনকি একটি গুণ করা, বা একটি মিটেক্স অর্জন করার মতো ঘটনাও উল্লেখ করছি না) ... ব্যবহারকারী ১৪১৮৮ দ্বারা উল্লিখিত অপব্যবহার অপারেটরদের মধ্যেই সীমাবদ্ধ নয়, তবে অপারেটর ওভারলোডিং সম্পর্কে কিছু ধরণের প্যাথলজিকাল ভয় রয়েছে যে আমার বিশ্বাস সি বনাম সি ++ এর আগের দিনগুলি থেকে এসেছিল, এমন একটি ভয় যা সরাসরি জাভাতে অমার্জনিত হয়েছিল, তবে ধন্যবাদ, সি # তে যায় নি ... শেষ পর্যন্ত শব্দার্থবিজ্ঞানের প্রতি শ্রদ্ধা রেখে এবং স্পষ্ট ফাংশন / অপারেটরগুলি লিখতে বিকাশকারীদের কাজ। ভাষার নয়।
প্যার্সেবল

3
@ jbo5112: উদাহরণ: cout << f() || g(); প্রথম বন্ধনীগুলি এটি পরিষ্কার করে না, তারা এটিকে সঠিক করে। এবং এটি বিট শিফট অপারেটরদের অপব্যবহার করা হচ্ছে না, তাদের প্রয়োজন হবে না। এর cout << (5&3) << endl;চেয়ে ভাল কেন cout.fmt(5&3)(endl);? গ্লিফটি দেখতে সুন্দর দেখাচ্ছে বলে বিটওয়াইস অপারেটরদের পুনর্নির্মাণের চেয়ে স্ট্র্যাক্টের সদস্য ভেরিয়েবলে ফাংশন কল অপারেটরটি স্ট্রিমের জন্য অসীমতর ভাল নকশা হবে। তবে এটি কেবল স্ট্রিমগুলির সাথে ভুল হওয়া থেকে দূরে।
বেন ভয়েগট

5

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

অন্তত আমি মনে করি যে কারণ। আমি যাই হোক আপনার পাশে আছি :)



2
এটি ভাবনার খুব খারাপ উপায়। আপনি নিজেকে পায়ে গুলি করতে পারেন, আমরা বরং আপনার হাত কেটে ফেললাম, যাতে আপনি সক্ষম হবেন না। এবং অবশ্যই আমরা ধরে নিই যে আপনি একজন বোকা, যিনি নিজেকে গুলি করবেন।
এনটিজে

5

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


4

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


4

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

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

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

জাভা 8 এ অপারেটর ওভারলোডিং যুক্ত করার জন্য +1।


+স্ট্রিং-ইশকে যেকোন কিছুতে যুক্ত করার জন্য জাভা ব্যবহারটি আইএমএইচও বেশ মারাত্মক, যেমন /পুরো এবং ভগ্নাংশ বিভাগের জন্য সি এবং ফোরট্রেনের ওভারলোডিং । পাস্কালের অনেক সংস্করণে, কোনও সংখ্যার ধরণের গাণিতিক অপারেটরগুলির ব্যবহার অপারেশনগুলিকে কাস্ট করার সমান সংখ্যার সমান ফলাফল দেবে Real, যদিও ফলাফলগুলি পুরো সংখ্যাটি নাও হতে পারে Truncবা Roundতাদের পূর্ণসংখ্যার জন্য নির্ধারিত হওয়ার আগে অবশ্যই খাওয়ানো উচিত ।
সুপারক্যাট

2

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

নয়:

Complex a, b, c; a = b + c;

তুলনায় অনেক সহজ:

Complex a, b, c; a = b.add(c);

2
আমি কি? ;) সমান অর্থ নির্ধারিত বা তুলনা উভয়ই হতে পারে তবে = সর্বদা কার্যনির্বাহ এবং == সর্বদা তুলনা। নামগুলি নিজেরাই ত্রুটির বড় উত্সগুলি প্রবর্তন করতে পারে।

1

কখনও কখনও অপারেটর ওভারলোডিং, ফ্রেন্ড ক্লাস এবং একাধিক উত্তরাধিকার পেয়ে ভাল লাগবে।

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

// a = b + c
Complex a, b, c; a = b.add(c);

12
অবশ্যই, অন্য কোথাও উল্লিখিত হিসাবে আপনি কখনই অ্যাড ফাংশনটির অর্থ সম্পর্কে নিশ্চিত হতে পারবেন না।
গ্রহন করুন

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

1
কোডটি স্পষ্ট করতে মন্তব্যটি যুক্ত হয়েছে, কোডটি এমন ভাষায় কেমন দেখাচ্ছে যা অপারেটর ওভারলোডিংকে সমর্থন করে। তদ্ব্যতীত, মন্তব্যটি অপারেটরদের পদে লিখিত হয়েছে তা অপারেটর ওভারলোডিংয়ের বিরোধী bel
আলুয়ান হাদাদাদ

0

এটি এড়িয়ে চলা ভাল কারণ নয় তবে একটি ব্যবহারিক:

লোকেরা সর্বদা এটি দায়বদ্ধতার সাথে ব্যবহার করে না। পাইথন লাইব্রেরি স্ক্যাপি থেকে এই উদাহরণটি দেখুন:

>>> IP()
<IP |>
>>> IP()/TCP()
<IP frag=0 proto=TCP |<TCP |>>
>>> Ether()/IP()/TCP()
<Ether type=0x800 |<IP frag=0 proto=TCP |<TCP |>>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
<IP frag=0 proto=TCP |<TCP |<Raw load='GET / HTTP/1.0\r\n\r\n' |>>>
>>> Ether()/IP()/IP()/UDP()
<Ether type=0x800 |<IP frag=0 proto=IP |<IP frag=0 proto=UDP |<UDP |>>>>
>>> IP(proto=55)/TCP()
<IP frag=0 proto=55 |<TCP |>>

এখানে ব্যাখ্যা:

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


0

জাভা অপারেটর ওভারলোডিংয়ের নেটিভ সাপোর্টের বিকল্প

যেহেতু জাভাতে অপারেটর ওভারলোডিং নেই, তাই এখানে কয়েকটি বিকল্প আপনি দেখতে পারেন:

  1. অন্য একটি ভাষা ব্যবহার করুন। গ্রোভি এবং স্কালা উভয়েরই অপারেটর ওভারলোডিং রয়েছে এবং এটি জাভা ভিত্তিক।
  2. জাভা-ওও ব্যবহার করুন , একটি প্লাগইন যা জাভাতে অপারেটরকে ওভারলোডিং সক্ষম করে। মনে রাখবেন যে এটি প্ল্যাটফর্মটি স্বাধীন নয়। এছাড়াও, এটিতে অনেকগুলি সমস্যা রয়েছে এবং এটি জাভার সর্বশেষ প্রকাশের (যেমন জাভা 10) সাথে সামঞ্জস্য নয়। ( মূল স্ট্যাকওভারফ্লো উত্স )
  3. ব্যবহারের JNI , জাভা নেটিভ ইন্টারফেস, অথবা বিকল্প। এটি আপনাকে জাভাতে ব্যবহারের জন্য সি বা সি ++ (সম্ভবত অন্যরা?) পদ্ধতি লেখার অনুমতি দেয়। অবশ্যই এটি স্বাধীন প্ল্যাটফর্ম নয়।

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


0

জাভা ভাষা অপারেটর ওভারলোডিংকে সরাসরি সমর্থন করে না, আপনি এটি সক্ষম করতে যে কোনও জাভা প্রকল্পে ম্যানিফোল্ড সংকলক প্লাগইন ব্যবহার করতে পারেন । এটি জাভা 8 - 13 (বর্তমান জাভা সংস্করণ) সমর্থন করে এবং ইন্টেলিজ আইডিইএতে সম্পূর্ণরূপে সমর্থিত।

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