সি # পদ্ধতির নামগুলিতে কখন "চেষ্টা" ব্যবহার করার কথা?


180

পদ্ধতির নাম "চেষ্টা" দিয়ে শুরু করা হলে এর অর্থ কী তা আমরা আমাদের সহকর্মীদের সাথে আলোচনা করছিলাম।

নিম্নলিখিত মতামত ছিল:

  • "চেষ্টা করুন" ব্যবহার করুন যখন পদ্ধতিটি নাল মান দিতে পারে।
  • "চেষ্টা করুন" ব্যবহার করুন যখন পদ্ধতিটি ব্যতিক্রম ছুঁড়ে না ফেলে।

সরকারী সংজ্ঞা কি? "চেষ্টা" পদ্ধতির নামে কী বলে? এটি সম্পর্কে কিছু সরকারী নির্দেশিকা আছে?


83
+1 লোকেরা যারা তাদের কার্যকারিতার নামগুলিতে এই জাতীয় চিন্তাভাবনা রেখেছিল তারা আসলে "পরবর্তী লোক" খুঁজছেন। কেন এটি নিকটতম ভোট পাচ্ছে তা নিশ্চিত নয় (এবং এটি এমন এক লোকের কাছ থেকে এসেছিল যিনি আজ রাতে তাদের প্রচুর ভোট দিয়েছেন )
জোনাথন রেইনহার্ট

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

16
মাইক্রোসফ্টের একটি অফিসিয়াল বিবৃতি আছে যা প্রশ্নের উত্তর দিয়েছে (আমার উত্তর দেখুন)। এটি কীভাবে সত্য নয়?
এরিক শিয়েরবুম

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

4
@ এরিক্স্চিয়রবুম এটি এমএস নির্দেশিকা সত্য fact এমএস নির্দেশিকাটি হ'ল সঠিক নির্দেশিকাটি ব্যবহারের জন্য বিষয়বস্তু এবং বিতর্কযোগ্য।
পরিবেশন করুন

উত্তর:


148

এটি ট্রাইপার্স প্যাটার্ন হিসাবে পরিচিত এবং মাইক্রোসফ্ট দ্বারা নথিভুক্ত করা হয়েছে। সরকারী ব্যতিক্রমসমূহ এবং পারফরমেন্স দুটিই MSDN পৃষ্ঠাটি জানাচ্ছে :

ব্যতিক্রম সম্পর্কিত পারফরম্যান্স সমস্যাগুলি এড়াতে সদস্যদের জন্য ট্রাইপার্স প্যাটার্নটি বিবেচনা করুন যা সাধারণ পরিস্থিতিতে ব্যতিক্রম হতে পারে।

সুতরাং আপনার যদি এমন কোড থাকে যার জন্য নিয়মিত ব্যবহারের কেসটি বোঝায় যে এটি কোনও ব্যতিক্রম ছুঁড়ে ফেলতে পারে (যেমন কোনও ইনট পার্স করা), ট্রাইপার্স প্যাটার্নটি বোঝায়।


2
আরেকটি দরকারী লিঙ্ক যা এই প্যাটার্নটির দলিল (ট্রাইপার্সে অনুসন্ধান করুন) ব্লগস.এমএসএনএন
বিবেক মহারাজ

2
মূলত, আপনার যদি ট্রাইপার্স পদ্ধতি আছে, আপনার কাছে এমন একটি পার্স পদ্ধতি থাকা উচিত যা ট্রাইপার্স মিথ্যা বলে প্রত্যাবর্তনের সময় ছুড়ে দেয়। বিপরীতে, যদি আপনার কাছে পার্স পদ্ধতি আছে, আপনার ট্রাই পার্সে পদ্ধতি থাকার কথা বিবেচনা করা উচিত যা পার্স নিক্ষেপ করার সময় মিথ্যা ফিরে আসবে
3Doubloons

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

এই ধরণের কি আসলেই মাইক্রোসফ্টের নির্দেশিকা প্রয়োজন? মোটামুটি প্রাথমিক জিনিস মনে হচ্ছে।
ডেভ লরেন্স

19
এটা তোলে হয় মৌলিক সামগ্রী, কিন্তু তার মানে এই নয় যে, নির্দেশিকা দরকারী নয়। আপনি যদি প্ল্যাটফর্মটি যথেষ্ট পরিমাণে জানেন না তবে এখনই বেসিক স্টাফগুলি পাওয়া বেশ শক্ত হতে পারে।
এরিক শিয়েরবুম

119

(সংশোধিত) এরিকের পরামর্শ অনুসারে অফিসিয়াল গাইডলাইন রয়েছে।

আমি যখন TrySomethingপদ্ধতিটি দেখি , আমি অনুমান করি

  • ছুঁড়ে না
  • আয় bool
  • যদি আমি মান আশা করি তবে এটি 'আউট' প্যারামিটারের মাধ্যমে ফিরে আসে
  • অস্তিত্ব আছে Somethingপদ্ধতি, আমাকে ব্যতিক্রম নিজেকে পরিচালনা করতে অনুমতি দেয়। (সম্পাদনা করুন, জেসি ওয়েব দ্বারা প্রস্তাবিত)

4
সংশোধন - এর অফিসিয়াল গাইডলাইন রয়েছে। এরিকের উত্তর দেখুন।
নোহর করুন

8
+1 তবে আমার চতুর্থ প্রত্যাশাও রয়েছে: যদি কোনও TryFooপদ্ধতি থাকে তবে একটি অনুরূপ Fooপদ্ধতি থাকবে যা আমাকে যে কোনও ব্যতিক্রম নিজেই পরিচালনা করতে দেয়। এই পদ্ধতির স্বাক্ষরগুলি সম্ভবত আলাদা হবে তাই অন্যান্য কোড পরিবর্তন না করে সেগুলির ব্যবহারগুলি বিনিময়যোগ্য নয়।
জেসি ওয়েব

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

1
"ফেলে দেয় না" আমার কাছে অত্যধিক জেনারেল মনে হয়েছে ized উদাহরণস্বরূপ, Int32.TryParse (স্ট্রিং, নাম্বার স্টাইলস, আইফোরমেটপ্রোভিডার, ইন্টার 32) যদি স্টাইলের প্যারামিটার পছন্দ না করে তবে আর্গুমেন্টএক্সসেপশন নিক্ষেপ করে।
জিরকা হানিকা

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

8

আমি মনে করি আপনি tryযখন এগিয়ে যেতে চান তখন আপনার ব্যবহার করা উচিত । কোনও পদ্ধতি কিছু মূল্য দেয় বা না দেয় তা বিবেচ্য নয়।

কেস 1: এটি যদি জরিমানা ফিরে আসে তবে আপনি কোনও উপায়ে এগিয়ে যেতে পারেন।

কেস 2: যদি এটি ফিরে না আসে: এটি এখনও ঠিক আছে; আপনি অন্য কোন উপায়ে এগিয়ে যেতে পারেন।

এবং যদি আপনি সেই পদ্ধতির আউটপুট হিসাবে কিছু মান আশা করেন তবে outপ্যারামিটারটি ব্যবহার করুন ।

উদাহরণ

int value
if (dictionary.TryGetValue("key", out value))
{
    // Proceed in some way
}
else
{
    // Proceed in some other way
}

6

আপনাকে পদ্ধতির নামে "চেষ্টা করুন" ব্যবহার করতে হবে, আপনি যখন এই সত্যটি প্রকাশ করতে চান যে পদ্ধতিটি আহবানটি বৈধ ফলাফল দিতে পারে না। এটি NET স্ট্যান্ডার্ড অনুসরণ করে, যাইহোক, কোনও ব্যতিক্রম নয় এমন ফাংশন নয়, যা ফাংশনটি কিছু VALIDবা NON_VALIDপ্রোগ্রামের দৃষ্টিকোণ থেকে মূল্য দেয় value

শেষে, এই নামকরণ কনভেনশন সম্পর্কে আপনার গ্রুপে ব্যবহার করার সিদ্ধান্ত নিয়েছে।


5

tryআপনার পদ্ধতিতে অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করুন যদি:

  • আপনি কোন ব্যতিক্রম নিক্ষেপ করবেন না
  • আপনার পদ্ধতিতে নিম্নলিখিত স্বাক্ষর রয়েছে: bool TrySomething(input, out yourReturn)

সুতরাং মূলত যদি আমরা- tryস্মৃতিগুলি ব্যবহার করি তবে আমরা কেবল একটি বুলিয়ান ফলাফল পাই।

সুতরাং নিম্নলিখিত কোডটি কোনও ব্যতিক্রম ছুঁড়ে ফেলবে না:

string input = "blabla";
int number;
if (int.TryParse(input, out number))
{
// wooohooo we got an int!
} else
{
//dooh!
}

যদিও এই কোডটি (এবং এক্ষেত্রে) ব্যতিক্রম ছুঁড়ে ফেলতে পারে:

string input = "blabla";
int number;
try
{
     number = int.Parse(input); //throws an exception
}
catch (Exception)
{
     //dooh!
}

চেষ্টা করার পদ্ধতিগুলি ব্যবহার করা কোডের একটি নিরাপদ এবং আরও সুরক্ষামূলক উপায়। এছাড়াও কোড স্নিপেট # 2 এটি পূর্ণসংখ্যা না হলে কার্যকর করতে আরও কার্যকারিতা গ্রহণ করে।


আপনার কোড স্নিপেট # 2 পড়তে হবে int number = int.Parse(input);যদি আপনি চান এই প্রসঙ্গে এটি আরও অর্থবহ হতে পারে।
পিয়েরে আরনাড

@ পিয়ারআরনাড ধন্যবাদ, এটি পরিবর্তন!
ফ্যাবিয়ান বিগলার

int number;ট্রাই ব্লক এবং number = ...অ্যাসাইনমেন্টের আগে আপনি এখনও ঘোষণাটি মিস করছেন ।
পিয়েরে আরনাড

@ পিয়ারআরনাড আপনাকে ধন্যবাদ, আমি এখন 'ইনটি নম্বর' অন্তর্ভুক্ত করেছি।
ফ্যাবিয়ান বিগলার

মনে রাখবেন যে ব্যতিক্রমটি সরাসরি TryLoadFile(path, out file)র‌্যামের বাইরে চলে যাওয়ার মতো সরাসরি ক্রিয়াকলাপের সাথে কিছুটা সম্পর্কিত না হলে আপনি এখনও ব্যতিক্রমগুলি ছুঁড়ে ফেলতে পারেন । সুতরাং কলার কোনও খারাপ পথ বা অ্যাক্সেস অস্বীকারের জন্য কোনও ত্রুটি আশা করবে না, তবে ত্রুটিযুক্ত জিনিসগুলির ক্ষেত্রেও ব্যতিক্রম যা ভুল হতে পারে। এবং এটি নথি।
লুক পুপলেট

0

চাচা বব তার ক্লিন কোড বইটিতে নীচের উদাহরণটি দিয়েছেন । যখনই আমরা কোনও ব্যতিক্রম নিক্ষেপ হওয়ার আশা করি আমরা Tryকোনও পদ্ধতির নামের উপসর্গটি ব্যবহার করতে পারি :

public void sendShutDown()
{
    try{
        tryToShutDown();
    } catch (DeviceShutDownError e) {
        logger.log(e);            
    }
}

এবং তারপরে (অভিযোজিত):

private void tryToShutDown()
{
    //some code with no error handling, but
    //something might go wrong here
}

tryToShutDownপদ্ধতি কোনো ত্রুটি পরিচালনা করে না, কারণ যে দায়িত্ব sendShutDownপদ্ধতি।

TryParseমাইক্রোসফট প্যাটার্ন পরিষ্কার কোড গাইডলাইন বলছেন যে আমরা আউটপুট পরামিতি এড়িয়ে চলা উচিত লঙ্ঘন করে।

যদি আমরা সি # এর নতুন সংস্করণ বিকাশ না করে থাকি তবে আমাদের মাইক্রোসফ্টের সমস্ত নির্দেশিকাগুলির সাথে লেগে থাকতে হবে না। কখনও কখনও তারা সেরা হয় না।

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