Dyadic ফাংশন assertEquals (প্রত্যাশিত, প্রকৃত) সাথে আসা সমস্যাগুলি সমাধান করা


10

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

এমনকি সুস্পষ্ট ডায়াডিক ফাংশনগুলিও assertEquals(expected, actual)সমস্যাযুক্ত। প্রত্যাশিত হওয়া উচিত যেখানে আপনি আসলটি কতবার রেখেছেন? দুটি যুক্তির কোনও প্রাকৃতিক অর্ডার নেই। প্রত্যাশিত, প্রকৃত অর্ডারিং এমন একটি সম্মেলন যা শিখতে অনুশীলনের প্রয়োজন।

লেখক একটি বাধ্যতামূলক বিন্দু তোলে। আমি মেশিন লার্নিংয়ে কাজ করি এবং এটি সর্বদা আসি। উদাহরণস্বরূপ, স্কেলরান গ্রন্থাগারের সমস্ত মেট্রিক ফাংশন (সম্ভবত ক্ষেত্রের সর্বাধিক ব্যবহৃত পাইথন লাইব্রেরি) আপনাকে ইনপুটগুলির ক্রম সম্পর্কে সতর্ক থাকতে হবে। উদাহরণ হিসাবে sklearn.metrics.homogeneity_score ইনপুট হিসাবে নেয় labels_trueএবং labels_pred। এই ফাংশনটি যা করে তা খুব প্রাসঙ্গিক নয়, যা প্রাসঙ্গিক তা হ'ল আপনি যদি ইনপুটগুলির ক্রমটি স্যুইচ করেন তবে কোনও ত্রুটি নিক্ষেপ করা হবে না। প্রকৃতপক্ষে ইনপুটগুলি স্যুইচ করা লাইব্রেরির অন্য একটি ফাংশন ব্যবহারের সমতুল্য ।

তবে বই যেমন ফাংশনগুলির জন্য একটি বোধগম্য ফিক্স বলতে যায় না assertEquals। আমি assertEqualsপ্রায়শই উপরে বর্ণিত ব্যক্তির মতো করে ফাংশনগুলির জন্য বা তার জন্য স্থিরতার কথা ভাবতে পারি না । এই সমস্যাটি সমাধান করার জন্য ভাল অনুশীলনগুলি কী কী?

উত্তর:


11

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

প্যারামিটার ক্রম সম্পর্কে কোনও বিভ্রান্তি রোধ করার জন্য ভাষা স্তরের উপায় রয়েছে: নামযুক্ত আর্গুমেন্ট। এটি দুর্ভাগ্যক্রমে জাভা বা সি ++ এর মতো সি-স্টাইল সিনট্যাক্স সহ অনেক ভাষায় সমর্থিত নয়। তবে পাইথনে প্রতিটি যুক্তিই যুক্তিযুক্ত যুক্তি হতে পারে। পরিবর্তে def foo(a, b)হিসাবে একটি ফাংশন কল foo(1, 2), আমরা করতে পারেন foo(a=1, b=2)। সি # এর মতো অনেকগুলি আধুনিক ভাষার একই বাক্য গঠন রয়েছে। স্মার্টটাক ভাষার পরিবার সর্বাধিক নামযুক্ত যুক্তি তুলে ধরেছে: কোনও অবস্থানগত আরগ নেই এবং সমস্ত কিছুর নাম দেওয়া হয়েছে। এটি এমন কোডের দিকে নিয়ে যেতে পারে যা প্রাকৃতিক ভাষার খুব কাছে পড়ে reads

আরও কার্যকর বিকল্প হ'ল এমন যুক্তি তৈরি করা যা নামের সাথে যুক্তিগুলি অনুকরণ করে। এগুলি সাবলীল এপিআই বা হ'ল সহায়ক ফাংশন যা প্রাকৃতিক প্রবাহ তৈরি করে। assertEquals(actual, expected)নাম বিভ্রান্তিকর। কিছু বিকল্প আমি দেখেছি:

  • assertThat(actual, is(equalTo(expected))): সহায়ক হিসাবে কিছু যুক্তি মোড়ানো দ্বারা, মোড়ানো কার্যকারিতা কার্যকরভাবে পরামিতি নাম হিসাবে পরিবেশন করে। ইউনিট পরীক্ষার দৃser়তার নির্দিষ্ট ক্ষেত্রে, এই কৌশলটি হ্যাক্রেস্ট ম্যাথার্স দ্বারা একটি এক্সটেনসিবল এবং কমপোজযোগ্য দৃ as়প্রদান সিস্টেম সরবরাহ করতে ব্যবহৃত হয় । এখানে অসুবিধাটি হ'ল আপনি প্রচুর বাসা বাঁধেন এবং প্রচুর সহায়ক ফাংশন আমদানি করতে হবে। এটি সি ++ এ আমার যাওয়ার কৌশল।

  • expect(actual).to.be(expected): একটি সাবলীল এপিআই যেখানে আপনি ফাংশন একসাথে কল করেন। এটি অতিরিক্ত বাসা বাঁধতে এড়ানোর পরেও এটি খুব বেশি এক্সটেনসিবল নয়। আমি যখন দেখতে পেয়েছি যে সাবলীল এপিআইগুলি খুব ভালভাবে পড়েছে, তবে একটি ভাল সাবলীল এপিআই নকশা করা আমার অভিজ্ঞতাতে প্রচুর প্রচেষ্টা করতে পারে, কারণ আপনার কল চেইনে নন-টার্মিনাল রাষ্ট্রগুলির জন্য অতিরিক্ত ক্লাস প্রয়োগ করা দরকার। এই প্রচেষ্টাটি কেবলমাত্র একটি স্বতঃপূরণ আইডিই এর প্রেক্ষাপটে অর্থ প্রদান করে যা পরবর্তী অনুমোদিত পদ্ধতি কলগুলির পরামর্শ দিতে পারে।


4

এই সমস্যা এড়াতে বিভিন্ন পদ্ধতি রয়েছে। এমন একটি যা আপনাকে কল করার পদ্ধতিটি পরিবর্তন করতে বাধ্য করে না:

বরং

assertEquals( 42, meaningOfLife() ); 

ব্যবহার

expected = 42;
actual = meaningOfLife();
assertEquals(expected, actual);

এটি কনভেনশনটিকে উন্মুক্ত জায়গায় বের করে দেয় যেখানে তাদের স্যুইচিং হওয়া স্পট করা সহজ। নিশ্চিতভাবেই এটি লেখা সহজ নয় তবে এটি পড়া সহজ।

আপনি যদি বলা পদ্ধতিটি পরিবর্তন করতে পারেন তবে আপনি টাইপিং সিস্টেমটি ব্যবহারের জন্য বাধ্যতামূলক পড়তে পারেন যা পড়া সহজ।

assertThat( meaningOfLife(), is(42) );

কিছু ভাষা আপনাকে এড়াতে দেয় কারণ তারা প্যারামিটারটির নাম দিয়েছে:

assertEquals( expected=42, actual=meaningOfLife() );

অন্যরা যাতে তাদের অনুকরণ করে না:

assertEquals().expected(42).actual( meaningOfLife() );

আপনি যা কিছু পান না কেন এটি এমন কোনও উপায় খুঁজে পায় যা এটি স্পষ্ট করে তোলে যা পড়ার সময় সঠিক। কনভেনশনটি কী তা আমাকে অনুমান করবেন না। আমাকে সেটা দেখাও.

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