যখন সংগ্রহের জন্য কোনও অনুরোধের শূন্য আইটেম থাকবে তখন প্রত্যাশিত আচরণ


13

ধরা যাক আপনাকে নিম্নলিখিত দেওয়া হয়েছে ...

List<Thing> theThings = fubar.Things.All();

যদি ফিরে আসার মতো কিছু না পাওয়া যায় তবে আপনি কীসের আশা করবেন ফুবার? থিংস.এল () সমস্ত ফিরে আসবে?

সম্পাদনা করুন: মতামত জন্য ধন্যবাদ। আমি কিছুটা অপেক্ষা করব এবং সর্বাধিক উত্স সহ এন্ট্রি গ্রহণ করব।

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


দেখতে বেশ শক্ত .কমত্য বলে মনে হচ্ছে [এখানে] [১]: খালি সংগ্রহ। সর্বদা. [1]: স্ট্যাকওভারফ্লো.com
জেসি সি স্লিকার

ডেটাটাইপ কীসের জন্য Things? যদি Thingsক্ষেত্রটি প্রত্যাবর্তন বাতিল হয়ে যায় তা যদি বোধগম্য হয় তবে আপনার ব্যতিক্রম পাওয়ার পক্ষে তা বোঝা যায় কারণ আপনি আপনার কল করার আগে শূন্যতার জন্য চেক করেননি All()। যাইহোক, আমি সেই লোকদের সাথে একমত যাঁরা মনে করেন যে fubar.Thingsশূন্যের পরিবর্তে খালি সংগ্রহ ফিরিয়ে দেওয়া উচিত।
কলিন ডি

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

ওএমজি তারা ব্যতিক্রম ছুঁড়ে ...! o_O
স্টুয়ার্ট 1

এখন, আরও মজাদার প্রশ্নটি হ'ল পৃথিবীতে কারও কারও পক্ষে জেনেরিক ক্ষেত্রে এমন ছোঁড়াছুড়ি হতে পারে, বা কী কেসটি থ্রোয়িংয়ের পরোয়ানা দেওয়ার পক্ষে এত বিশেষ করে তোলে ??
মার্টিন বা

উত্তর:


29

দুটি সম্ভাবনার মধ্যে (অর্থাত্ nullকোনও খালি সংগ্রহ ফিরিয়ে দেওয়া বা খালি সংগ্রহ ফিরিয়ে দেওয়া) আমি খালি সংগ্রহটি ফিরিয়ে আনব, কারণ এটি কলারকে ফিরে আসা মানটির একটি চেক এড়াতে দেয়। পরিবর্তে এটি লেখার

List<Thing> theThings = fubar.Things.All();
if (theThings != null) {
    for (Thing t : theThings) {
        t.doSomething();
    }
}

তারা এটি লিখতে সক্ষম হবে:

List<Thing> theThings = fubar.Things.All();
for (Thing t : theThings) {
    t.doSomething();
}

এই দ্বিতীয় কোড খণ্ডটি খাটো এবং সহজেই পড়তে সহজ, কারণ নীড়ের স্তর একের পর এক কম।


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

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

অতিরিক্ত নাল চেক যা আমাকে রাতে ঘুমাতে সহায়তা করে।
জোয়েল বি

6

আমি একটি খালি তালিকা আশা করি। theThingsএখনও একটি বস্তু হতে পারে, কিন্তু theThings.Countবা theThings.size()ফিরে হবে 0


5

এর মতো ডিজাইন সমস্যাগুলি নুল অবজেক্ট প্যাটার্ন দ্বারা সম্বোধন করা হয়

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

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

আপনার ক্ষেত্রে পরামর্শটি বিশেষভাবে প্রযোজ্য ( Listযখন কোনও Thingঅকার্যকর হবে না তখন ফিরে আসবে ):

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


3

আপনার উচিত, আইএমএইচও, একটি EMPTY মান ফেরত দেওয়া উচিত। আমি সি # সম্পর্কে জানি না, তবে জাভাতে আমরা এটি পেয়েছি:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

  // For the type-safe 
  List<String> s = Collections.emptyList();
  Set<Long> l = Collections.emptySet();
  Map<Date> d = Collections.emptyMap();

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html


1
সি # সমতুল্য Enumerable.Empty<T>(), যা একটি খালি ফেরত দেয় IEnumerable<T>(দেখুন msdn.microsoft.com/en-us/library/bb341042.aspx )
আভনার শাহার-কাশতান

1
বর্তমান দস্তাবেজগুলি এখানে রয়েছে: ডকস.অরাকল.com / জাভাস / / / ডকস / এপি / জাভা / উপিলি / সংগ্রহগুলি এইচটিএমএল - ১.৪.২ ডক এখন প্রায় দশ বছরের পুরানো।
স্টুয়ার্ট 1

2

আমি একটি শূন্য সংগ্রহ ফিরিয়ে দেব একটি নাল মান ফেরানোর কারণ আপনি কলিং কোডে নাল যাচাইকরণ লেখাটি এড়াতে পারবেন।


2

দুটি সমাধান তারা বিভিন্ন জিনিস বোঝায়।

আপনি যে জিনিসটি ফিরিয়ে দিচ্ছেন তার যদি শূন্য থাকে তবে আপনি সবসময় একটি খালি সংগ্রহ ফিরিয়ে দিন! ডিরেক্টরি তালিকার ক্ষেত্রে নিন। ডিরেক্টরিতে কোনও ফাইল না থাকলে আপনি ফাইলের একটি খালি সংগ্রহ ফিরিয়ে দেন।

অন্যদিকে, যদি ডিরেক্টরিটি বিদ্যমান না থাকে তবে এটি সত্যিই উপযুক্ত নয়। "আমি কিছুই ফিরিয়ে দিতে পারি না" এর অর্থ নিরপেক্ষভাবে আলাদা কিছু। সেক্ষেত্রে আপনার হয় হয় নালার দিকে ফিরে যাওয়া উচিত বা পরিস্থিতির উপর নির্ভর করে একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত, কিছুই যেমন ভুল ছিল না তেমন খালি সংগ্রহটি ফিরিয়ে দেবেন না।


খুব যুক্তিসঙ্গত ব্যাখ্যা। প্রত্যাবর্তিত ফলাফলটি অবৈধ রাষ্ট্রের জন্য আবরণ করা উচিত নয়, এর জন্য আমাদের ব্যতিক্রম রয়েছে।
Ivaylo স্লাভভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.