ইনপুট বনাম খালি ফলাফল সেট ব্যতীত ইনপুটগুলি প্রযুক্তিগতভাবে বৈধ হয় তবে অসন্তুষ্ট হয় না


108

আমি পাবলিক রিলিজের উদ্দেশ্যে একটি লাইব্রেরি তৈরি করছি। এটিতে অবজেক্টের সেটগুলিতে অপারেটিংয়ের বিভিন্ন পদ্ধতি রয়েছে - সেটগুলি নতুন ফর্ম হিসাবে তৈরি, পরিদর্শন, বিভাজন এবং প্রজেক্ট করা। যদি এটি প্রাসঙ্গিক হয় তবে এটি একটি নিউ # IEnumerableগেট প্যাকেজ হিসাবে প্রকাশের জন্য লিনিকিউ-স্টাইলের এক্সটেনশান যুক্ত একটি সি # শ্রেণির পাঠাগার ।

এই লাইব্রেরির কয়েকটি পদ্ধতিতে অসন্তুষ্টিজনক ইনপুট পরামিতি দেওয়া যেতে পারে। উদাহরণস্বরূপ, combinatoric পদ্ধতিতে, একটি পদ্ধতি সব সেট উৎপন্ন হয় এন আইটেম একটি উৎস সেট থেকে নির্মাণ করা যায় যে মি আইটেম। উদাহরণস্বরূপ, সেটটি দেওয়া হয়েছে:

1, 2, 3, 4, 5

এবং 2 এর সংমিশ্রণের জন্য জিজ্ঞাসা করে উত্পন্ন হবে:

1, 2
1, 3
1, 4
ইত্যাদি ...
5, 3
5, 4

এখন, এমন কিছু করা যা স্পষ্টভাবে সম্ভব নয়, যেমন 3 টি আইটেমের সেট দেওয়া এবং তারপরে 4 আইটেমের সংমিশ্রণের জন্য জিজ্ঞাসা করার সময় বিকল্পটি সেট করার সময় এটি কেবল প্রতিটি আইটেম একবার ব্যবহার করতে পারে।

এই পরিস্থিতিতে, প্রতিটি প্যারামিটার স্বতন্ত্রভাবে বৈধ:

  • উত্স সংগ্রহটি নাল নয় এবং এতে আইটেম রয়েছে
  • অনুরোধের আকারের সংমিশ্রণটি একটি ধনাত্মক ননজারো পূর্ণসংখ্যা
  • অনুরোধ করা মোড (প্রতিটি আইটেম কেবল একবার ব্যবহার করুন) একটি বৈধ পছন্দ

যাইহোক, পরামিতিগুলির স্থিতি যখন একসাথে নেওয়া হয় তখন সমস্যা দেখা দেয়।

এই দৃশ্যে, আপনি কী পদ্ধতিটি একটি ব্যতিক্রম (উদাহরণস্বরূপ InvalidOperationException) নিক্ষেপ করবেন বা খালি সংগ্রহটি প্রত্যাশা করবেন ? হয় আমার কাছে বৈধ বলে মনে হচ্ছে:

  • আপনি এম আইটেমগুলির একটি সেট থেকে এন আইটেমগুলির সংমিশ্রণ তৈরি করতে পারবেন না যেখানে এন> মি আপনি কেবল একবার প্রতিটি আইটেম ব্যবহার করার অনুমতি পেয়েছেন তাই এই ক্রিয়াকলাপটিকে অসম্ভব বলে মনে করা যেতে পারে ।InvalidOperationException
  • আকার এন এর সংমিশ্রনের সেট যা এম আইটেমগুলি থেকে উত্পাদিত হতে পারে যখন এন> মি খালি সেট হয়; কোন সংমিশ্রণ উত্পাদন করা যায় না।

একটি খালি সেট জন্য যুক্তি

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

var result = someInputSet
    .CombinationsOf(4, CombinationsGenerationMode.Distinct)
    .Select(combo => /* do some operation to a combination */)
    .ToList();

যদি আপনার ইনপুট সেটটি পরিবর্তনশীল আকারের হয় তবে এই কোডটির আচরণটি অনুমানযোগ্য। যদি 4 টিরও কম উপাদান থাকে .CombinationsOf()তখন কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় someInputSet, তবে এই কোডটি কখনও কখনও প্রি-চেকিং ছাড়াই রানটাইমে ব্যর্থ হয়। উপরের উদাহরণে এই চেকিং তুচ্ছ, তবে আপনি যদি লিনকিউ এর দীর্ঘ চেইনটির অর্ধেক অংশে এটি কল করে থাকেন তবে এটি ক্লান্তিকর হতে পারে। যদি এটি একটি খালি সেট দেয় তবে resultতা খালি হবে যা দিয়ে আপনি পুরোপুরি খুশি হতে পারেন।

একটি ব্যতিক্রম জন্য যুক্তি

আমার দ্বিতীয় উদ্বেগটি হ'ল খালি সেটটি ফিরলে সমস্যাগুলি লুকিয়ে থাকতে পারে - আপনি যদি এই পদ্ধতিটি লিনকুইয়ের চেইনের অর্ধেক অংশে কল করে থাকেন এবং এটি নিঃশব্দে একটি খালি সেট ফেরৎ দেয় তবে আপনি কিছু পদক্ষেপ পরে ইস্যুতে ছুটে যেতে পারেন, বা খালি দিয়ে নিজেকে খুঁজে পেতে পারেন ফলাফল সেট, এবং আপনার স্পষ্টভাবে ইনপুট সেটে কিছু থাকতে পারে যে কীভাবে ঘটেছিল তা স্পষ্ট নয়।

আপনি কী আশা করবেন এবং এর জন্য আপনার যুক্তি কী?


66
যেহেতু খালি সেটটি গাণিতিকভাবে সঠিক, সম্ভাবনা হ'ল আপনি যখন এটি পেয়ে যাবেন আসলে এটি আপনি যা চান তা। গাণিতিক সংজ্ঞা এবং সম্মেলনগুলি সাধারণত ধারাবাহিকতা এবং সুবিধার জন্য বেছে নেওয়া হয় যাতে জিনিসগুলি কেবল তাদের সাথে কাজ করে।
asmeurer

5
@asmeurer তারা আমার কাছে মনোনীত এনেছি যাতে উপপাদ্য সামঞ্জস্যপূর্ণ এবং সুবিধাজনক হয়। তাদের প্রোগ্রামিং সহজ করার জন্য বেছে নেওয়া হয় না। (এটি কখনও কখনও পক্ষের উপকার হয়, তবে কখনও কখনও তারা প্রোগ্রামিং আরও শক্ত করে
তোলে

7
@ jpmc26 "এগুলি বেছে নেওয়া হয়েছে যাতে উপপাদ্যগুলি সুসংগত এবং সুবিধাজনক হয়" - আপনার প্রোগ্রামটি সর্বদা প্রত্যাশা অনুযায়ী কাজ করে তা নিশ্চিত করে প্রয়োজনীয়তত্ত্ব একটি প্রপঞ্চ প্রমাণ করার সমতুল্য।
আর্টেম

2
@ jpmc26 আপনি ফাংশনাল প্রোগ্রামিংয়ের কথা উল্লেখ করেছেন কেন আমি তা পাই না। অপরিহার্য প্রোগ্রামগুলির জন্য নির্ভুলতা প্রমাণ করা বেশ সম্ভব, সর্বদা সুবিধাজনক এবং অনানুষ্ঠানিকভাবেও করা যেতে পারে - আপনি যখন নিজের প্রোগ্রামটি লেখেন তখন কিছুটা চিন্তা করুন এবং সাধারণ গাণিতিক জ্ঞান ব্যবহার করুন, এবং আপনি পরীক্ষায় কম সময় ব্যয় করবেন। পরিসংখ্যানগত এক ;-) নমুনাতে প্রমাণিত
artem

5
@ দিমিত্রিগ্রোরিয়েভ ১/২০ অপরিবর্তিত হিসাবে গাণিতিকভাবে আরও অনেক বেশি 1/0 অনন্ত হিসাবে।
asmeurer

উত্তর:


145

একটি খালি সেট ফেরত দিন

আমি একটি ফাঁকা সেট আশা করব কারণ:

3 সেট থেকে 4 সংখ্যার 0 টি সংমিশ্রণ রয়েছে যখন আমি কেবল একবারে প্রতিটি সংখ্যা ব্যবহার করতে পারি


5
গাণিতিকভাবে, হ্যাঁ, তবে এটি খুব সম্ভবত একটি ত্রুটির উত্স। যদি এই ধরণের ইনপুটটি প্রত্যাশিত হয়, তবে ব্যবহারকারী সাধারণ উদ্দেশ্যে লাইব্রেরিতে ব্যতিক্রমটি ধরতে হবে এমনটি আরও ভাল।
কেসি কুবাল

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

11
আসলে আপনি জানেন না যে এটি ব্যবহারকারীর চোখে একটি ত্রুটি। খালি সেটটি এমন কিছু যা ব্যবহারকারীর জন্য প্রয়োজনে যাচাই করা উচিত। if (ফলাফল.Any ()) DoSomething (ফলাফল.প্রথম ()); অন্যথায় ডসোমথিংএলস (); চেষ্টা করার চেয়ে অনেক ভাল {ফলাফল.প্রথম ()। ডোজোমথিং ();} ধরা {ডসোমথিংথেলস ();}
গুরান

4
@ ট্রাইপহাউন্ড এই সিদ্ধান্তটি শেষ পর্যন্ত ডেকে এনেছিল: বিকাশকারীকে এই পদ্ধতিটি ব্যবহার করে পরীক্ষা করা এবং তারপরে নিক্ষেপ করা প্রয়োজন, বিকাশের প্রচেষ্টা, প্রোগ্রামের কর্মক্ষমতা এবং কর্মক্ষেত্রের ক্ষেত্রে তারা চান না এমন একটি ব্যতিক্রম ছোঁড়ার চেয়ে অনেক ছোট প্রভাব ফেলবে and প্রোগ্রাম প্রবাহ সরলতা।
anaximander

6
@ ডার্থফেটটি এটির বিদ্যমান লিনকিউ এক্সটেনশন পদ্ধতির সাথে তুলনা করার চেষ্টা করুন: কোথায় ()। আমার যদি একটি ধারা থাকে: যেখানে (x => 1 == 2) আমি ব্যতিক্রম পাই না, আমি একটি খালি সেট পাই।
নেকোরাস

79

সন্দেহ হলে অন্য কাউকে জিজ্ঞাসা করুন।

আপনাদের উদাহরণ ফাংশন পাইথন সালে অনুরূপ একটি এক হয়েছে: itertools.combinations। আসুন দেখুন এটি কীভাবে কাজ করে:

>>> import itertools
>>> input = [1, 2, 3, 4, 5]
>>> list(itertools.combinations(input, 2))
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
>>> list(itertools.combinations(input, 5))
[(1, 2, 3, 4, 5)]
>>> list(itertools.combinations(input, 6))
[]

এবং এটি আমার কাছে পুরোপুরি সূক্ষ্ম বোধ করে। আমি এমন ফলাফল আশা করছিলাম যা আমি পুনরাবৃত্তি করতে পারি এবং আমি একটি পেয়েছি।

তবে স্পষ্টতই, আপনি যদি বোকা কিছু জিজ্ঞাসা করেন:

>>> list(itertools.combinations(input, -1))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: r must be non-negative

সুতরাং আমি বলব, যদি আপনার সমস্ত প্যারামিটারগুলি বৈধ হয় তবে ফলাফলটি খালি সেট খালি সেট দেয়, আপনি কেবল এটি করছেন না।


মন্তব্যগুলিতে @ বাকুরিউ যেমন বলেছিলেন , তেমন কোনও SQLপ্রশ্নের জন্যও এটি একই SELECT <columns> FROM <table> WHERE <conditions>। যতদিন <columns>, <table>, <conditions>ভাল গঠিত এবং বিদ্যমান নাম পড়ুন গঠিত হয়, আপনি অবস্থার একে অপরের অগ্রাহ্য একটি সেট নির্মাণ করতে পারেন। ফলস্বরূপ ক্যোয়ারিতে একটি নিক্ষেপ করার পরিবর্তে কোনও সারি পাওয়া যাবে না InvalidConditionsError


4
ডাউনভোটেড কারণ এটি সি # / লিনক ভাষার স্পেসে আইডিয়োমেটিক নয় (ভাষাতে কীভাবে একই রকম সীমাবদ্ধতার সমস্যাগুলি পরিচালনা করা হয় তার জন্য স্বেকারের উত্তর দেখুন)। এটি যদি পাইথনের প্রশ্ন হত তবে তা আমার কাছ থেকে +1 হবে।
জেমস স্নেল

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

1
তবুও, সি # প্রশ্নগুলির জন্য পাইথন একটি ভাল বাণী নয়: উদাহরণস্বরূপ সি # অনুমতি দিবে 1.0 / 0, পাইথন তা করবে না।
দিমিত্রি গ্রিগরিয়েভ

2
কীভাবে এবং কখন ব্যতিক্রম ব্যবহার করবেন সে সম্পর্কে @ ম্যাথিয়াসএটিঙ্গার পাইথনের নির্দেশিকা সি # এর থেকে খুব আলাদা, সুতরাং গাইডলাইন হিসাবে পাইথন মডিউলগুলির ব্যবহার ব্যবহার করা সি # এর পক্ষে ভাল মেট্রিক নয়।
পিপীলিকা পি

2
পাইথন বাছাইয়ের পরিবর্তে আমরা কেবল এসকিউএল বাছাই করতে পারি। একটি করে সুগঠিত SELECT একটি টেবিল উপর ক্যোয়ারী একটি ব্যতিক্রম উত্পাদন যখন ফলাফল সেট খালি? (স্পয়লার: না!)। ক্যোয়ারির "সুগঠিততা" কেবলমাত্র ক্যোয়ারির উপর নির্ভর করে এবং কিছু মেটাডেটা (যেমন টেবিলটি উপস্থিত রয়েছে এবং এই ক্ষেত্রটি রয়েছে (এই ধরণের সহ)?) একবার কোয়েরিটি সু-গঠন হয়ে গেলে এবং আপনি এটি সম্পাদন করেন আপনি যে কোনও একটি প্রত্যাশা করেন (সম্ভবত শূন্য) বৈধ ফলাফল বা একটি ব্যতিক্রম কারণ "সার্ভার" এর একটি সমস্যা ছিল (যেমন ডিবি সার্ভার ডাউন হয়েছে বা কিছু)।
বাকুরিউ

72

সাধারণ লোকের পদে:

  • যদি কোনও ত্রুটি হয় তবে আপনার ব্যতিক্রম বাড়াতে হবে। ত্রুটিটি ঠিক কোথায় ঘটেছে তা জানতে একক শৃঙ্খলাবদ্ধ কলের পরিবর্তে পদক্ষেপে জিনিসগুলি জড়িত থাকতে পারে।
  • যদি কোনও ত্রুটি না ঘটে তবে ফলস্বরূপ সেটটি খালি থাকে তবে কোনও ব্যতিক্রম বাড়াবেন না, খালি সেটটি ফিরে আসুন। একটি খালি সেট একটি বৈধ সেট।

23
+1, 0 একটি সম্পূর্ণ বৈধ এবং সত্যই অত্যন্ত গুরুত্বপূর্ণ সংখ্যা number এমন অনেকগুলি ঘটনা রয়েছে যেখানে কোনও ক্যোয়ারী বৈধভাবে শূন্য হিটগুলি ফিরিয়ে আনতে পারে যে ব্যতিক্রম উত্থাপন করা অত্যন্ত বিরক্তিকর হবে।
কিলিয়ান ফট

19
ভাল পরামর্শ, কিন্তু আপনার উত্তর কি পরিষ্কার?
ইয়ান

54
আমি এখনও বুদ্ধিমান কেউ নই যদি এই উত্তরটি ওপেনের উচিত throwবা খালি সেটটি ফেরত দেয় ...
জেমস স্নেল

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

3
আহ, আমি দেখছি - আপনি ভুল বুঝে থাকতে পারেন; আমি কিছু শৃঙ্খলিত করছি না, আমি একটি পদ্ধতি লিখছি যা আমি আশা করি যে একটি শৃঙ্খলে ব্যবহার করা হবে। আমি ভাবছি যে এই অনুমানমূলক ভবিষ্যতের বিকাশকারী যারা এই পদ্ধতিটি ব্যবহার করেন এটি উপরের দৃশ্যে ফেলে দিতে চান কিনা।
anaximander

53

আমি ইভানের উত্তরের সাথে একমত তবে একটি নির্দিষ্ট যুক্তি যুক্ত করতে চাই।

আপনি গাণিতিক ক্রিয়াকলাপগুলি নিয়ে কাজ করছেন, সুতরাং একই গাণিতিক সংজ্ঞাটি বজায় রাখা ভাল পরামর্শ হতে পারে। একটি গাণিতিক দৃষ্টিকোণ থেকে সংখ্যা R একটি এর -sets এন -set (অর্থাত nCr ) ভাল সব r এর জন্য সংজ্ঞায়িত করা হয়> এন> = 0. এটা শূন্য। সুতরাং একটি খালি সেট ফেরৎ গণিতের দিক থেকে প্রত্যাশিত মামলা হবে।


9
এটি একটি ভালো দিক. প্যালেট তৈরির জন্য রঙের সংমিশ্রণের মতো লাইব্রেরি যদি উচ্চতর স্তরের হয় - তবে এটির ত্রুটি ছুঁড়ে ফেলা বুদ্ধিমান। কারণ আপনি জানেন যে কোনও রঙের প্যালেট কোনও প্যালেট নয়। তবে কোনও এন্ট্রিবিহীন একটি সেট এখনও একটি সেট এবং গণিত এটি খালি সেট সমান হিসাবে সংজ্ঞায়িত করে।
ক্যাপ্টেন ম্যান

1
ইয়ানস উত্তরগুলির চেয়ে অনেক ভাল উত্তর কারণ এটি গাণিতিক অনুশীলনের উদ্ধৃতি দেয়। +1
user949300

24

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

একটি ফাইলের বিষয়বস্তু উদাহরণ হিসাবে নেওয়া:

  1. অনুগ্রহ করে আমাকে ফাইলের সামগ্রীগুলি আনুন, "অস্তিত্ব নেই। টেক্সট"

    ক। "সামগ্রীগুলি এখানে: অক্ষরের একটি খালি সংগ্রহ"

    B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর. "এরম, একটি সমস্যা আছে, সেই ফাইলটি নেই do আমি কী করব তা আমি জানি না!"

  2. অনুগ্রহ করে আমাকে ফাইলের সামগ্রীগুলি আনুন, "বিদ্যমান তবে খালি রয়েছে"

    ক। "সামগ্রীগুলি এখানে: অক্ষরের একটি খালি সংগ্রহ"

    B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর. "এরম, একটি সমস্যা আছে, এই ফাইলে কিছুই নেই। আমি কী করব জানি না!"

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

সুতরাং আপনার উদাহরণে একই পদ্ধতির প্রয়োগ:

  1. দয়া করে আমাকে 4 টি আইটেমের সমস্ত সংমিশ্রণ দিন {1, 2, 3}

    ক। কোনও নেই, এখানে একটি খালি সেট।

    B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর. একটি সমস্যা আছে, আমি কী করব জানি না।

আবার, যেমন "আইটেমস nullসেট হিসাবে প্রস্তাব করা হয়, তবে" এখানে একটি সমস্যা আছে "তা বোধগম্য হবে তবে উপরের অনুরোধটির" বোধহয় একটি খালি সেট "বুদ্ধিমান প্রতিক্রিয়া বলে মনে হচ্ছে।

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


4
এই পরামর্শটি ভাল, তবে এই ক্ষেত্রে প্রযোজ্য নয়। এর চেয়ে ভাল উদাহরণ: ৩০ শে জানুয়ারীর কত দিন পরে ?: ১ ফেব্রুয়ারির ৩০: ফেব্রুয়ারির কত দিন পরে ?: ০১: ৩০: মেকআপুরির কত দিন পরে ?: ব্যাতিক্রম ৩০ তারিখে কত কার্যদিবস রয়েছে? : ফেব্রুয়ারীর তম: ব্যতিক্রম
গুরান

9

এটি একটি সাধারণ উদ্দেশ্যে গ্রন্থাগারের জন্য যেমন আমার প্রবৃত্তিটি হবে শেষ ব্যবহারকারী চয়ন করতে দিন।

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


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

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

1
আমি অনুরূপ কিছু উত্তর দিতে চলেছিলাম। লিনক এক্সটেনশন পদ্ধতিগুলি Single()এবং SingleOrDefault()অবিলম্বে মনে উদয় হয়েছিল। যদি শূন্য বা> 1 ফলাফল থাকে তবে সিঙ্গল একটি ব্যতিক্রম ছুঁড়ে দেয়, যখন সিঙ্গলঅরডিফল্ট নিক্ষেপ করবে না এবং পরিবর্তে ফিরে আসবে default(T)। সম্ভবত ওপি ব্যবহার করতে পারে CombinationsOf()এবং CombinationsOfOrThrow()
রাবারডাক

1
@ উইল্ডকার্ড - আপনি একই ইনপুটটিতে দুটি ভিন্ন ফলাফলের কথা বলছেন যা একই জিনিস নয়। ওপি শুধুমাত্র একটি নির্বাচন) ফলাফলের আগ্রহী বা খ) একটি ব্যতিক্রম যা নিক্ষেপ না ফলে।
জেমস স্নেল

4
Singleএবং SingleOrDefault(বা Firstএবং FirstOrDefault) একটি সম্পূর্ণ আলাদা গল্প, @ রাবারডাক। আমার আগের মন্তব্যটি থেকে আমার উদাহরণ তুলে নেওয়া। "দু'টির চেয়ে বড় প্রাইমসের কি কি উপস্থিতি আছে?" এই প্রশ্নের কোনও উত্তর না দেওয়া পুরোপুরি ঠিক আছে? , যেহেতু এটি একটি গাণিতিক সুরক্ষা এবং বোধগম্য উত্তর। যাইহোক, আপনি যদি জিজ্ঞাসা করছেন "দু'জনের চেয়ে বড় এমনকি প্রথম কোনটি?" কোন প্রাকৃতিক উত্তর নেই। আপনি কেবল প্রশ্নের উত্তর দিতে পারবেন না, কারণ আপনি একক সংখ্যা চেয়েছেন are এটা না কেউ (এটা একটি একক সংখ্যা নয়, কিন্তু একটি সেট), না 0. তাই আমরা একটি ব্যতিক্রম নিক্ষেপ করা।
পল কার্টেসার 11

4

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

সুতরাং আমি ভুল কী হয়েছে তা বোঝার জন্য ব্যবহারকারীকে প্রয়োজনীয় তথ্য সরবরাহ করে যুক্তি-ধারণাটির পক্ষে ভোট দেব।

উদাহরণস্বরূপ, public static TSource ElementAt<TSource>(this IEnumerable<TSource>, Int32)লিনক- এ ফাংশনটি পরীক্ষা করুন । সূচক 0 এর চেয়ে কম বা উত্সের উপাদানের সংখ্যার সমান বা সমান হলে কোন আর্গুমেন্টআউটঅফরাঞ্জএক্সসেপশন ছুড়ে দেয়। এইভাবে সূচকটি কলারের দ্বারা সরবরাহিত গণনার ক্ষেত্রে বৈধ হয়।


3
ভাষার অনুরূপ পরিস্থিতির উদাহরণ উল্লেখ করার জন্য +1 1
জেমস স্নেল

13
অদ্ভুতভাবে, আপনার উদাহরণটি আমাকে ভাবতে পেরেছিল এবং এমন কিছুতে নিয়ে গিয়েছিল যা আমি মনে করি যে এটি একটি শক্তিশালী পাল্টা-উদাহরণ দেয়। যেমনটি আমি উল্লেখ করেছি, এই পদ্ধতিটি লিনকিউ-জাতীয় হিসাবে তৈরি করা হয়েছে, যাতে ব্যবহারকারীরা অন্যান্য লিনকিউ পদ্ধতির সাথে এটি একসাথে চেইন করতে পারে। আপনি যদি new[] { 1, 2, 3 }.Skip(4).ToList();কোনও খালি সেট পান তবে এটি আমার মনে করে যে খালি সেটটি ফিরিয়ে দেওয়া সম্ভবত এখানে সেরা বিকল্প।
anaximander

14
এটি কোনও ভাষা শব্দার্থবিজ্ঞানের সমস্যা নয়, সমস্যা ডোমেনের শব্দার্থকতা ইতিমধ্যে সঠিক উত্তর সরবরাহ করে, তা হল খালি সেটটি ফেরত দেওয়া। অন্য যে কোনও কিছু করা কম্বিনেটেটর সমস্যা ডোমেনে কাজ করা কারও জন্য অন্তত বিস্ময়ের নীতি লঙ্ঘন করে।
উক্কো

1
আমি একটি খালি সেট ফেরত দেওয়ার জন্য যুক্তিগুলি বুঝতে শুরু করছি। কেন এটা বোধগম্য হবে। কমপক্ষে এই বিশেষ উদাহরণের জন্য।
sbecker

2
@ এসবেকার, এই পয়েন্টটি বাড়িতে আনার জন্য: প্রশ্নটি যদি " কতগুলি সংমিশ্রণ রয়েছে ..." তবে "শূন্য" একটি সম্পূর্ণ বৈধ উত্তর হবে। একই টোকেন দ্বারা, "কি হয় একটি সম্পূর্ণ বৈধ উত্তর হিসাবে খালি সেট আছে সমন্বয় যেমন যে ..."। যদি প্রশ্নটি ছিল, "এই প্রথম সংমিশ্রণটি কী এমন ...", তবে এবং কেবল তখনই একটি ব্যতিক্রম উপযুক্ত হবে, কারণ প্রশ্নটি উত্তরযোগ্য নয়। আরও দেখুন পল কে এর মন্তব্য
ওয়াইল্ডকার্ড

3

আপনার নিম্নলিখিতগুলির মধ্যে একটি করা উচিত (যদিও ধারাবাহিকভাবে মৌলিক সমস্যাগুলি যেমন নেতিবাচক সংখ্যার সংমিশ্রণের সংখ্যার উপর ক্রমাগত চালিয়ে যাওয়া অব্যাহত থাকে):

  1. দুটি বাস্তবায়ন সরবরাহ করুন, একটি যা খালি সেট দেয় যখন ইনপুটগুলি একসাথে অযৌক্তিক হয় এবং এমন একটি যা নিক্ষেপ করে। তাদের কল করার চেষ্টা করুন CombinationsOfএবং CombinationsOfWithInputCheck। বা যা আপনার পছন্দ। আপনি এই তাই ইনপুট-পরীক্ষণের এক সংক্ষিপ্ত নামে এবং তালিকা একটিতে থাকে বিপরীত করতে CombinationsOfAllowInconsistentParameters

  2. লিনক পদ্ধতির জন্য, IEnumerableআপনি যে সঠিক ভিত্তিটি উল্লেখ করেছেন ঠিক সেই ফাঁকে ফাঁকে ফিরুন । তারপরে, আপনার লাইব্রেরিতে এই লিনক পদ্ধতিগুলি যুক্ত করুন:

    public static class EnumerableExtensions {
       public static IEnumerable<T> ThrowIfEmpty<T>(this IEnumerable<T> input) {
          return input.IfEmpty<T>(() => {
             throw new InvalidOperationException("An enumerable was unexpectedly empty");
          });
       }
    
       public static IEnumerable<T> IfEmpty<T>(
          this IEnumerable<T> input,
          Action callbackIfEmpty
       ) {
          var enumerator = input.GetEnumerator();
          if (!enumerator.MoveNext()) {
             // Safe because if this throws, we'll never run the return statement below
             callbackIfEmpty();
          }
          return EnumeratePrimedEnumerator(enumerator);
       }
    
       private static IEnumerable<T> EnumeratePrimedEnumerator<T>(
          IEnumerator<T> primedEnumerator
       ) {
          yield return primedEnumerator.Current;
          while (primedEnumerator.MoveNext()) {
             yield return primedEnumerator.Current;
          }
       }
    }

    অবশেষে, এটির মতো ব্যবহার করুন:

    var result = someInputSet
       .CombinationsOf(4, CombinationsGenerationMode.Distinct)
       .ThrowIfEmpty()
       .Select(combo => /* do some operation to a combination */)
       .ToList();

    বা এই মত:

    var result = someInputSet
       .CombinationsOf(4, CombinationsGenerationMode.Distinct)
       .IfEmpty(() => _log.Warning(
          $@"Unexpectedly received no results when creating combinations for {
             nameof(someInputSet)}"
       ))
       .Select(combo => /* do some operation to a combination */)
       .ToList();

    অনুগ্রহ করে নোট করুন যে লিনাক চেইনটি যখন গণনা করা হয় তার পরে কিছু সময়ের পরিবর্তে তৈরি করা বা কর্ম আচরণের জন্য জনসাধারণের থেকে পৃথক হওয়া ব্যক্তিগত পদ্ধতিটি প্রয়োজন হয় ing আপনি এটি এখনই নিক্ষেপ করতে চান

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

আমার মনে হয় # 2 বেশ ভাল, দুর্দান্ত, দুর্দান্ত! এখন শক্তি কলিং কোডে রয়েছে এবং কোডটির পরবর্তী পাঠক বুঝতে পারবেন এটি ঠিক কী করছে এবং অপ্রত্যাশিত ব্যতিক্রমগুলি মোকাবেলা করতে হবে না।


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

আপনি মূলত আমার উত্তরটির একই কাজটি করছেন, যদি আপনি যদি কোনও শর্ত জিজ্ঞাসা করতে খুশি হন তবে আপনার ফলাফলটি
ইউউ

আমার উত্তর কীভাবে আপনার উত্তরটি "মূলত একইভাবে করা হয়" তা দেখতে পাচ্ছি না। এগুলি আমার কাছে সম্পূর্ণ আলাদা বলে মনে হয়।
এরিক

মূলত আপনি কেবল "আমার খারাপ শ্রেণি" এর একই শর্তটি প্রয়োগ করছেন। তবে আপনি তা বলছেন না ^^। আপনি কি সম্মত হন, যে আপনি ক্যোয়ারী ফলাফলে 1 টি উপাদানটির অস্তিত্ব প্রয়োগ করছেন?
গেম ডেভেলপার

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

2

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

আমি মনে করি এটি কলারের প্রত্যাশার উপর নির্ভর করে যদি এটি ত্রুটি হয় বা কোনও গ্রহণযোগ্য ফলাফল হয় - তাই আমি পছন্দটি কলারের কাছে স্থানান্তর করব। হতে পারে একটি বিকল্প পরিচয়?

.CombinationsOf(4, CombinationsGenerationMode.Distinct, Options.AllowEmptySets)


10
আপনি যেখানে যাচ্ছেন সেখানে পৌঁছে যাওয়ার সময়, আমি তাদের আচরণ পরিবর্তন করে এমন প্রচুর বিকল্প পাস করার পদ্ধতিগুলি এড়াতে চেষ্টা করব। ইতিমধ্যে যে মোড এনাম রয়েছে সেখানে আমি এখনও 100% খুশি নই; আমি কোনও বিকল্পের প্যারামিটারের ধারণাটি পছন্দ করি না যা কোনও পদ্ধতির ব্যতিক্রম আচরণের পরিবর্তন করে। আমার মনে হয় যদি কোনও পদ্ধতির ব্যতিক্রম ছুঁড়ে ফেলার প্রয়োজন হয় তবে এটি নিক্ষেপ করা প্রয়োজন; আপনি যদি সেই ব্যতিক্রমটি আড়াল করতে চান তবে তা কলিং কোড হিসাবে আপনার সিদ্ধান্ত, এবং এমন কিছু নয় যা আপনি আমার কোডটি সঠিক ইনপুট বিকল্পটি দিয়ে করতে পারেন।
anaximander

যদি কলার এমন একটি সেট প্রত্যাশা করে যা শূন্য নয়, তবে খালি সেটটি হ্যান্ডেল করা বা একটি ব্যতিক্রম ছোঁড়া কলারের পক্ষে। যতদূর কলির সম্পর্কিত, খালি সেটটি পুরোপুরি সূক্ষ্ম উত্তর। এবং খালি সেটগুলি ঠিক আছে কি না তা নিয়ে আপনার বিভিন্ন মতামত সহ একাধিক কলার থাকতে পারে।
gnasher729

2

এর সুস্পষ্ট উত্তর না থাকলে সিদ্ধান্ত নেওয়ার জন্য দুটি পন্থা রয়েছে:

  • প্রথমে একটি বিকল্প ধরে রেখে কোড লিখুন, তারপরে অন্যটি। কোনটি অনুশীলনে সবচেয়ে ভাল কাজ করবে তা বিবেচনা করুন।

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


2

আপনার নিজের বিশ্লেষণের উপর ভিত্তি করে, খালি সেটটি ফিরে আসা স্পষ্টভাবে সঠিক বলে মনে হয়েছে - আপনি এমনকি এটি এমন কিছু হিসাবে চিহ্নিত করেছেন যা কিছু ব্যবহারকারী সম্ভবত ব্যবহার করতে পারেন এবং কিছু ব্যবহার নিষিদ্ধ করার ফাঁদে পড়েছেন না কারণ আপনি কখনই ব্যবহারকারী এটির ব্যবহার করতে চান তা কল্পনা করতে পারবেন না ঐ দিকে.

যদি আপনি সত্যিই অনুভব করেন যে কিছু ব্যবহারকারীর অদম্য রিটার্ন জোর করতে পারে, তবে তাদের সবার প্রতি চাপ দেওয়ার পরিবর্তে তাদের সেই আচরণের জন্য জিজ্ঞাসা করার একটি উপায় দিন । উদাহরণস্বরূপ, আপনি:

  • ব্যবহারকারীর জন্য যে কোনও বস্তু ক্রিয়া সম্পাদন করছে তার একটি কনফিগারেশন বিকল্প করুন।
  • এটি এমন একটি পতাকা তৈরি করুন যা ব্যবহারকারী optionচ্ছিকভাবে ফাংশনে প্রবেশ করতে পারে।
  • AssertNonemptyতারা তাদের চেইনগুলিতে রাখতে পারে এমন একটি চেক সরবরাহ করুন ।
  • দুটি ক্রিয়াকলাপ করুন, একটি যা অযৌক্তিকতা দাবি করে এবং একটি যা না করে।

এই কিছু সারগর্ভ প্রস্তাব উপর পয়েন্ট হয়েছে এবং পূর্বে 12 উত্তর ব্যাখ্যা বলে মনে হচ্ছে না
মশা

1

এটি আপনার ব্যবহারকারীরা কী প্রত্যাশা করে তা নির্ভর করে। (কিছুটা সম্পর্কহীন) উদাহরণের জন্য যদি আপনার কোড বিভাগটি সম্পাদন করে তবে আপনি ব্যতিক্রম নিক্ষেপ করতে পারেন বা ফিরে আসতে পারেন Infবা NaNযখন আপনি শূন্য দ্বারা ভাগ করেন। উভয়ই সঠিক বা ভুল নয়:

  • আপনি যদি Infপাইথন লাইব্রেরিতে ফিরে যান, লোকজন ত্রুটিগুলি আড়াল করার জন্য আপনাকে আক্রমণ করবে
  • আপনি যদি কোনও মতলব লাইব্রেরিতে ত্রুটি বাড়ান, লোকেরা আপনাকে মূল্যবোধ হারিয়ে যাওয়া সহ প্রক্রিয়ায় ব্যর্থ হওয়ার জন্য আপনাকে আক্রমণ করবে

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

যে সমাধানগুলি ব্যবহারকারী চয়ন করতে দেয় (যেমন "কঠোর" পরামিতি যুক্ত করা যায়) তা চূড়ান্ত নয়, যেহেতু তারা মূল প্রশ্নটিকে নতুন সমমানের সাথে প্রতিস্থাপন করে: "কোন মানটির strictডিফল্ট হওয়া উচিত?"


2
আমি আমার উত্তরে NaN যুক্তিটি ব্যবহার করার বিষয়ে চিন্তাভাবনা করেছি এবং আমি আপনার মতামতটি ভাগ করেছি। আমরা ওপি
গেম ডেভেলপার 3-10 '

0

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

সাধারণ সেট বিধি:

  • Set.Foreach (সম্পৃক্ত); // খালি সেটগুলির জন্য সর্বদা সত্য ফিরে আসে
  • Set.Exists (সম্পৃক্ত); // সর্বদা খালি সেটগুলির জন্য মিথ্যা ফিরিয়ে দেয়

আপনার প্রশ্নটি খুব সূক্ষ্ম:

  • এটা হতে পারে আপনার ফাংশনের ইনপুট আছে যা একটি সম্মান চুক্তি : যে ক্ষেত্রে কোনো অবৈধ ইনপুট একটি ব্যতিক্রম বাড়াতে হবে, এটাই, ফাংশন নিয়মিত পরামিতি অধীনে কাজ করছে না।

  • এটি হতে পারে যে আপনার ফাংশনটির ইনপুটটিকে ঠিক একটি সেটের মতো আচরণ করতে হবে এবং তাই খালি সেটটি ফেরত দিতে সক্ষম হওয়া উচিত।

এখন আমি যদি আপনার মধ্যে থাকতাম তবে আমি "সেট" পথে যেতে পারতাম তবে একটি বড় "বিউট" দিয়েছিলাম।

ধরে নিন আপনার কাছে এমন একটি সংগ্রহ রয়েছে যা "হাইপোথিসিস দ্বারা" কেবলমাত্র ছাত্র ছাত্রী থাকা উচিত:

class FemaleClass{

    FemaleStudent GetAnyFemale(){
        var femaleSet= mySet.Select( x=> x.IsFemale());
        if(femaleSet.IsEmpty())
            throw new Exception("No female students");
        else
            return femaleSet.Any();
    }
}

এখন আপনার সংগ্রহটি আর একটি "খাঁটি সেট" নয়, কারণ এটিতে আপনার একটি চুক্তি রয়েছে এবং তাই আপনার ব্যতিক্রম ব্যতীত আপনার চুক্তিটি প্রয়োগ করা উচিত।

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

আপনারা সর্বদা যা স্বাভাবিক এবং সামঞ্জস্যপূর্ণ বলে মনে করেন তা করা উচিত: আমার কাছে একটি সেট নিয়মগুলি মেনে চলা উচিত, যখন জিনিসগুলি সেট না হয় তাদের সঠিকভাবে চিন্তার নিয়ম থাকা উচিত।

আপনার ক্ষেত্রে এটি করা ভাল ধারণা বলে মনে হচ্ছে:

List SomeMethod( Set someInputSet){
    var result = someInputSet
        .CombinationsOf(4, CombinationsGenerationMode.Distinct)
        .Select(combo => /* do some operation to a combination */)
        .ToList();

    // the only information here is that set is empty => there are no combinations

    // BEWARE! if 0 here it may be invalid input, but also a empty set
    if(result.Count == 0)  //Add: "&&someInputSet.NotEmpty()"

    // we go a step further, our API require combinations, so
    // this method cannot satisfy the API request, then we throw.
         throw new Exception("you requsted impossible combinations");

    return result;
}

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

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


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

আপনার "সোমমেথোদ" এর কারণটি আর কোনও সেট-এর মতো আচরণ করা উচিত নয় এর কারণটি হ'ল আপনি "সেটগুলির বাইরে" একটি অংশের তথ্য জিজ্ঞাসা করছেন, বিশেষভাবে মন্তব্য করা অংশটি দেখুন "&&InputSet.NotEmpty ()"
গেমডোপোপার

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

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

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