আপনি কি ব্যক্তিগত পদ্ধতি থেকে আর্গুমেন্টেক্সেপশন বা আর্গুমেন্টলেক্সসেপশন ফেলে দেন?


20

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

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

আমার অনুভূতি হ'ল এই ব্যতিক্রমগুলি সাধারণত একটি API এর মতো কিছুতে কার্যকর যা প্রকাশ্যে প্রকাশিত হতে চলেছে।

উত্তর:


22

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

যেসব ক্ষেত্রে আপনি "অবৈধআর্গুমেন্টএক্সেপশন" নিক্ষেপ করতে চান সে ক্ষেত্রে এটি অবশ্যই উল্লেখযোগ্য Assert সংস্করণ 1.1.2 থেকে রয়েছে। চেক সম্পাদনের জন্য কম কোড লেখার ক্ষেত্রে - এটি আমার পক্ষে কমপক্ষে - খুব সহায়ক হয়েছে।

তবে ব্যক্তিগত পদ্ধতিতে প্যারামিটারগুলি পরীক্ষা করতে আপনি "দৃser়তা" ব্যবহার করতে পারেন। এটি তাদের আসল উদ্দেশ্যগুলির মধ্যে একটি। তারা এগুলি ব্যবহার করার আরও কারণ, নিম্নলিখিত লিঙ্কটি পরীক্ষা করে দেখুন যা কখন সংস্থানগুলি ব্যবহার করতে হবে এবং কখন ব্যতিক্রম ব্যবহার করতে হবে তাও পুরোপুরি ব্যাখ্যা করে। সংস্থাগুলি উত্পাদন কোডে অন্তর্ভুক্ত হবে না এবং সংকলক ডিফল্টরূপে সেগুলি সরিয়ে দেয়। সুতরাং তারা যা আপনি সন্ধান করছেন: বিকাশকারীদের সহায়তা করা, ব্যবহারকারীদের জন্য অদৃশ্য। জাভাতে আপনাকে দৃ enable়তা সক্ষম করতে সংকলকটি বলতে একটি বিশেষ পতাকা ("-ea") ব্যবহার করতে হবে। আপনি তাদের "ডিবাগিং" বন্ধু হিসাবে বিবেচনা করতে পারেন।

এখানে কীভাবে সংস্থান ব্যবহার করা যায় তা এখানে:


1
অ্যাপাচি কমন্সেও একটি বৈধতা বর্গ রয়েছে যা স্প্রিংয়ের দৃ As় শ্রেণীর সাথে একইভাবে কাজ করে
রোজা রিখটার

@ ক্যান্তিদো হ্যাঁ এবং আমি আরও যুক্ত করব যে গুগলের পেয়ারাতে পূর্ব শর্তগুলির ক্লাসটি একইভাবে কাজ করে। তথ্যের জন্য ধন্যবাদ :-)
জালান

2

এটি নির্ভর করে অন্য সব কিছুর মতো ...

যদি সর্বজনীন পদ্ধতিগুলি সরল মোড়ক দেয় যা বেসরকারী পদ্ধতিটিকে কল করে (কোনও ব্যক্তিগত ওভারলোডেড পদ্ধতির লাইনের সাথে) তবে প্রতিটি জনসাধারণের মধ্যে এটির পরীক্ষা না করে ব্যক্তিগত পদ্ধতিতে ব্যতিক্রম বোধ করা বোধগম্য হতে পারে।

সাধারণত যদি এটি উপরোক্ত সংজ্ঞাটি মেনে না চলে তবে আমি সাধারণত আর্গুমেন্টগুলি চেক করতাম না / কোনও ব্যক্তিগত পদ্ধতিতে একটি ব্যতিক্রম ছুঁড়ে দেখতাম না। যদিও অন্যান্য ক্ষেত্রেও আমি সাধারণত কিছু ব্যয়বহুল ক্রিয়াকলাপ সম্পাদন করার আগে একটি ব্যক্তিগত পদ্ধতিতে এটি করি যা আর্গুমেন্ট অবৈধ হলে পার্ট ওয়ে ব্যর্থ হতে পারে।


2

আমি বুঝতে পারি যে প্রশ্নটির কোনও ভাষা ট্যাগ না থাকলেও সম্ভবত এটি সম্ভবত "কফি ভাষাগুলি" সম্পর্কে কথা বলছে। তবে কেবল সম্পূর্ণতার জন্য, আমি সি ++ বিশ্বে কিছুটা বিচ্যুত আপাত conকমত্যের কথা উল্লেখ করতে চাই।

তিনটি বিষয় রয়েছে যা সি ++ প্রোগ্রামাররা সাধারণত আগ্রহী:

  • এটির কি অপ্টিমাইজড বিল্ডগুলিতে শূন্য-ওভারহেড থাকবে? (এটি কি "সংকলিত" করা যেতে পারে?)
  • ত্রুটিটি সনাক্ত করা হয়েছে ঠিক ঠিক সেই বিন্দুতে ডিবাগারে আটকাতে আমি কি এটি ব্যবহার করতে পারি?
  • ঘোষিত ফাংশনগুলি থেকে সমস্যার প্রতিবেদন করতে আমি কি এটি ব্যবহার করতে পারি noexcept?

অতীতে, আমি এই জাতীয় কোড লিখে প্রথম সমস্যাটির সাথে যোগাযোগ করেছি

int
factorial(const int n)
{
  if (CHECK_ARGS)
    {
      if (n < 0)
        throw std::invalid_argument {"n < 0"};
    }
  int fac = 1;
  for (int i = 2; i <= n; ++i)
    fac *= i;
  return fac;
}

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

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

বুস্ট মান কোডিং এই সঙ্গে সম্মত হন:

প্রোগ্রামার ত্রুটিগুলি সম্পর্কে কী?

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

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

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


1

নিম্নলিখিত কাঠামো বিবেচনা করুন:

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

  2. ব্যবহারকারী ইন্টারফেস মোড়কের: এই ফাংশনটি অভ্যন্তরীণ ফাংশন গোপন করে এবং InvalidArgumentExceptions ভুল মান হ্যান্ডেল এবং তার ইনপুট সংশোধন করার ব্যবহারকারী বলতে ব্যবহার করে: Assert(x).hasLength(4);, Assume(y).isAlphanumeric();, Assert(z).isZipCode();, Assume(mailAdress).matchesRegex(regex_MailAdress);, Reject(x).ifEmpty();, ইত্যাদি

  3. ব্যাচ ইন্টারফেসের মোড়ক: এই ফাংশনটি অভ্যন্তরীণ ফাংশনটি মোড় করে এবং দীর্ঘকালীন চলমান কোনও কাজকে বাধা না দিয়ে ভুল মানগুলি পরিচালনা করতে লগিং, বৈধতা চিহ্নিতকরণ এবং পরিসংখ্যান ব্যবহার করে। চিহ্নগুলি পরে কেউ ফলাফল-ডাটাবেস পরীক্ষা করে এবং পরিষ্কার করে ব্যবহার করতে পারে।

  4. কমান্ড লাইন ইন্টারফেস মোড়ক: এই ফাংশনটি অভ্যন্তরীণ ফাংশনটি আবৃত করে এবং শেষ ইনপুটটির জন্য আবার জিজ্ঞাসা করে।

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


0

নাল রেফারেন্স চেক এড়াতে আরও ভাল উপায় আছে: আপনার জন্য চেক করতে কোড চুক্তি বা একটি এওপি ফ্রেমওয়ার্ক ব্যবহার করুন। গুগল "সি # কোড চুক্তি" বা "পোস্টশার্প"।


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