শর্তসাপেক্ষে set.add () এর বুলিয়ান রিটার্ন?


15

সেট শ্রেণীর অ্যাড অপারেটর একটি বুলিয়ান প্রদান করে যা সত্য (যদি যোগ করতে হবে) ইতিমধ্যে সেখানে না ছিল এবং অন্যথায় মিথ্যা। লেখা হয়

if (set.add(entry)) {
    //do some more stuff
}

ক্লিন কোড লেখার ক্ষেত্রে ভাল স্টাইল হিসাবে বিবেচিত? আপনি একবারে দু'টি কাজ করার পরে আমি ভাবছি। 1) উপাদান যুক্ত করা এবং 2) উপাদানটির অস্তিত্ব ছিল কিনা তা যাচাই করা।


6
আপনি সেই স্ট্যান্ডার্ডের কথা বলছেন java.util.Set, addযখন উপাদানটি ইতিমধ্যে ছিল না , তখন সত্য হয় ?
ব্যবহারকারী 2357112

1
আমি সাধারণত বিপরীত পরীক্ষা বিবেচনা করব:if (!set.add(entry)) {// entry already present, possibly a case you want to handle}
njzk2

একবারে দুটি কাজ করে কিছু ভুল আছে?
ব্যবহারকারী 207421

@ ব্যবহারকারী 2357112 হ্যাঁ, এটা ঠিক।
আন্দ্রেস ব্রাউন

উত্তর:


19

হ্যাঁ, তাই

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


আপনার উত্তরের জন্য ধন্যবাদ. @ নীলস ভ্যানরিজমারসডাল তার উত্তরে উল্লেখ করেছেন যে এটি করা কমান্ডটি ভেঙে দেয় এবং বিচ্ছেদ পৃথক করে, তাই না? আপনি কি তা মনে করেন না?
আন্দ্রেস ব্রাউন 13

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

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

2
@ জার্গ ডব্লু মিতাগ: পৃষ্ঠা 759 এর কী? যেহেতু একটি পারমাণবিক অপারেশন অভ্যন্তরীণভাবে "চেক টু অ্যাক্ট" বিরোধী প্যাটার্নের বিরুদ্ধে অনাক্রম্য, তাই এটি নির্ধারণের থ্রেডকে কীভাবে সুরক্ষিত করা যায় তার যে কোনও "পুরো অধ্যায়" পড়ার জন্য এটি বিভক্ত করা উপকারী বলে মনে হয় না how আবার। যেহেতু আপনি কোনও আসল যুক্তির নাম দেননি, তাই আমার "সেই যুক্তিগুলির বিষয়ে নির্দিষ্ট আপত্তি" নেই।
হোলার

1
@ জার্গ ডব্লু মিটাগ: ঠিক আছে, আমি এই পৃষ্ঠায় উত্তর সম্পর্কে কথা বলছি, Set.addবিকল্পের নামকরণ না করে একক অপারেশন হিসাবে নিরুত্সাহিত করছি । যদি উদ্দেশ্যযুক্ত অপারেশনটি কোনও একক উপাদান যুক্ত করে এটি যুক্ত করা হয়েছে কিনা তা খুঁজে বের করার জন্য, আরও কার্যকর বিকল্পের প্রয়োজন নেই যা এখনও সুবিধা ছাড়াই অপারেশনটিকে জটিল করে তোলে। আমি আশা করি আপনি সচেতন যে Set.addএটি একটি বিল্টিন জেআরই পদ্ধতি যা প্রথমে>> 700 পৃষ্ঠার বইয়ের অধ্যয়ন না করে ব্যবহার করা যেতে পারে।
হলগার

12

আমি বলব যে এটি যথাসম্ভব পরিষ্কার নয়, কারণ এটি রক্ষণাবেক্ষণকারীকে ইতিমধ্যে জানতে বা ফেরতের মানটি কী বোঝায় তা সন্ধান করতে বাধ্য করে। এর অর্থ কী ইতিমধ্যে বিদ্যমান আছে, ইতিমধ্যে বিদ্যমান ছিল না, সফলভাবে successfullyোকানো হয়েছিল? আপনি যদি এটি ব্যবহার না করেন তবে আপনি জানেন না, এমনকি যদি আপনি এটি করেন তবে এটি অনেক বেশি মানসিক বোঝা।

আমি নিম্নলিখিত পছন্দ করতে চান:

boolean added = set.add(entry);

if (added) {
    //do some more stuff
}

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



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

9
আমি দ্বিতীয় @ হোলজার যদি আপনি না জানেন Set.add, আপনি অনভিজ্ঞ এবং আপনি এগুলি শিখতে এবং আরও অভিজ্ঞ হওয়ার জন্য এই পদ্ধতিগুলি সন্ধান করা উচিত
মনিকা 18

7
notAlreadyPresentসেরা শব্দ নয়। আমি ব্যবহার করব added, এবং পাঠকের কাছে কেন একটি মান একটি কেন সেট করা হবে না তা জানতে আশা করি।
njzk2

3
@ জাস্টিনটাইম: কোন কোডটি করে তা বর্ণনা করার জন্য মন্তব্য ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হয়। আপনার কোডটি স্ব-বর্ণনামূলক হওয়া উচিত। একটি কোড পর্যালোচনাতে, আমি আপনার উদাহরণটি অগ্রহণযোগ্য হিসাবে পতাকাঙ্কিত করব।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

8

যদি সত্যিকার অর্থ সাফল্য হয় তবে এটি ভাল, স্পষ্ট কোড।

একটি বিস্তৃত কনভেনশন রয়েছে যে কোনও ক্রিয়াকলাপ বা পদ্ধতি সাফল্যে সত্য (বা এমন কিছু যা সত্যের কাছে মূল্যায়ন করে) প্রত্যাবর্তন করে। আপনার কোডটি যতক্ষণ অনুসরণ করে, ততক্ষণ আমার মনে হয় শর্তাধীন পদ্ধতিটি রাখা ভাল putting

এর মতো কোডটি অযথা আমার দৃষ্টিতে বিশৃঙ্খলাযুক্ত:

boolean frobulate_succeeded = thing.frobulate();

if (frobulate_succeeded) {
    ...
}

মনে হচ্ছে আপনি নিজেকে পুনরাবৃত্তি করছেন।

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


একটি আইটেমে সেট যোগ করার প্রসঙ্গে সাফল্য বলতে কী বোঝায়? ব্যতিক্রম নিক্ষেপ করা মানে সাফল্য; সত্য বনাম মিথ্যা মানে এই প্রসঙ্গে আরও নির্দিষ্ট কিছু।
মনিকা 18

@ সলোমনফের সেক্রেট এই ক্ষেত্রে, একটি ব্যতিক্রমের অর্থ সেটটি উপাদান যুক্ত করতে অস্বীকার করেছিল, এর falseঅর্থ হল যে উপাদানটি ইতিমধ্যে উপস্থিত ছিল না কারণ এটি যুক্ত করা হয়নি, এবং এর trueঅর্থ উপাদানটি ইতিমধ্যে উপস্থিত ছিল না। হিসাবে add()যদি সেট ইতিমধ্যে, এটি ধারন করে না সেটে উপাদান যোগ করে trueতাই মানে যে উপাদান সফলভাবে সেট যোগ করা হয়েছিল।
জাস্টিন সময় - মনিকা

@ জাস্টিনটাইম আপনি দুটি ক্ষেত্রে নিজের মূল্য বিচারগুলি যুক্ত করছেন। আরেকটি ব্যাখ্যা হ'ল সাফল্য হ'ল পদ্ধতিটি ফিরে আসার সময় আইটেমটি সেটটিতে থাকে। আইটেমটি ইতিমধ্যে সেটে addথাকলে , কিছু না করে সফল হয়। আইটেমটি ইতিমধ্যে সেটে না থাকলে সেটটিতে addআইটেমটি যুক্ত করে সফল হয়। কোন ব্যাখ্যাটি সঠিক তা নির্বিচারে। সাফল্যের কম স্বেচ্ছাসেবী সংজ্ঞাটি ভাষা থেকে থাকে: পদ্ধতিটি যদি সাধারণত ফিরে আসে তবে সফল হয়।
মনিকা 18

1
সাফল্যের সর্বনিম্ন নির্বিচার সংজ্ঞাটি হ'ল পদ্ধতিটি কার্য সম্পাদনের জন্য নির্ধারিত টাস্কটি সফলভাবে সম্পাদন করেছে। আমার যদি কোনও পদ্ধতি থাকে firstLessThanSecond(int l, int r)এবং trueযদি তা ফিরে আসে তবে l > rবা falseযদি l <= rতা হয় তবে সেই পদ্ধতিটি সফলভাবে ফিরে আসার পরেও তা সফল হয় না
জাস্টিন সময় - মনিকা

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

2

আমি বলবো এটি খুব সি-এর মতো। বেশিরভাগ সময় আমি কোনও মিউটেশন ফলাফলের জন্য বর্ণনামূলক-নামযুক্ত ভেরিয়েবল পছন্দ করি এবং কোনও ifঅবস্থাতে কোনও মিউটেশন ঘটছে না ।

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

যদি কারও যদি শর্তটিতে একটি and/ orধারা যোগ করে শর্তটি প্রসারিত করতে হয় তবে তারা .add()সংক্ষিপ্ত-সার্কিট মূল্যায়নের কারণে নির্দিষ্ট ক্ষেত্রে ফোন না করে থাকতে পারে । সংক্ষিপ্ত-সার্কিটের বিশেষত প্রত্যাশিত না হলে এটি বাগ হিসাবে শেষ হতে পারে।


আমি যদি লিখি if (set.contains(entry)){set.add(entry); //do more stuff}তাও কি সংকলক দ্বারা মুছে ফেলা হয়?
আন্দ্রেয়াস ব্রাউন 14

1
@ আন্ড্রেস ব্রাউন: আমার মনে হয় না; সংকলকটির মধ্যে containsএবং এর মধ্যে অর্থপূর্ণ লিঙ্ক সম্পর্কে কোনও ধারণা নেই add। এছাড়াও, এটি entryসেটে দেখার দ্বিগুণ কাজ করে ; এটি খুব বড় সেট এবং খুব হালকা লুপের জন্য ভূমিকা নিতে পারে।
9 হাজার

1
সুতরাং আমি এটি গ্রহণ করি আপনি বরং লিখবেন না if (set.contains(entry)){set.add(entry); //do more stuff}বরং পরিবর্তে উদাহরণস্বরূপ কার্ল বিলেফেল্টের উত্তরটি দিয়ে যান?
আন্দ্রেয়াস ব্রাউন 14

@ আন্দ্রেস ব্রাউন: হুবহু (উক্ত উত্তরটি উন্নত)।
9000

1
একটি ভাল পয়েন্ট। যদি ভবিষ্যতে দেবের শর্ট সার্কিটগুলির সাথে অন্যান্য শর্ত থাকতে পারে তবে ইফসগুলিতে মিউটেশনগুলি জটিল।
njzk2

0

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

"পরিষ্কার কোড সহজ এবং সরাসরি। ক্লিন কোড ভাল-লিখিত গদ্যের মতো পড়ে। ক্লিন কোড ডিজাইনারের অভিপ্রায়কে কখনই অস্পষ্ট করে না বরং বরং খাস্তা বিমূর্ততা এবং নিয়ন্ত্রণের সোজা লাইনগুলিতে পূর্ণ।

- অ্যাপ্লিকেশন সহ অবজেক্ট ওরিয়েন্টেড অ্যানালাইসিস এবং ডিজাইনের গ্র্যাডি বুচ লেখক "

আমার জন্য আপনার কোডের উদ্দেশ্যটি অস্পষ্ট। যদি এন্ট্রি সফল যোগ করা হয় বা ইতিমধ্যে বিদ্যমান থাকে তখনই যদি উভয়কেই কার্যকর করা হয়? কি add()ফিরে আসে? আইটেম? ত্রুটি-কোড?


2
ঠিক আছে, হ্যাঁ আমি এটাই ভেবেছিলাম। তবে আমি এটিও মনে করি @ কিলিয়ান ফথের একটি বিষয় রয়েছে। আমি যদি কোয়েরি এবং কমান্ড আলাদা করতে চাইতাম তবে আমাকে লিখতে হবে if (set.contains(entry)){set.add(entry); //do more stuff}যা মূর্খ বলে মনে হয়। আপনি এই গ্রহণ কি?
আন্দ্রেস ব্রাউন 13

আমি একটি ভাল নাম প্রস্তাব করার জন্য এই কোডটির ডোমেন এবং প্রসঙ্গটি জানি না, তবে আমি এটিকে পরিষ্কার অভিপ্রায় দিয়ে কোনও ফাংশনে আবদ্ধ করব। উদাহরণস্বরূপ: এনট্রিএক্সিস্টঅরক্রিয়েটইন্ট্রি (এন্ট্রি), এতে আপনার () + যুক্ত () যুক্তি যুক্ত থাকতে পারে এবং একটি বুলিয়ান ফিরে আসতে পারে। এখানে অনুরূপ প্রশ্ন: সফ্টওয়্যারেনজেনারিং.স্ট্যাকেক্সেক্সঞ্জ / প্রশ্নগুলি / ১৪৯70০৮ / clean যা পরিষ্কার কোডের বাইরে এই অনুশীলনটি নিয়ে আলোচনা করে।
নীলস ভ্যান রেইমার্সডাল

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

1
"কী যোগ করে () ফিরে?" আমি আশা করি যে কোনও জাভা বিকাশকারী কোড রিভিউ করে Collectionএপিআই জানতে পারে ।
njzk2

3
@ ড্যান 1111 এর সাথে একমত এটি বিশেষত বোবা কারণ এটি ধরণের জিনিস যা জাতি অবস্থার জন্য উর্বর স্থল করে makes
পল ড্রাগার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.