আমি অন্যান্য উত্তর দ্বারা ইঙ্গিতযুক্ত অন্য কিছু যুক্ত করতে চাই, তবে আমার মনে হয় না যে এটি স্পষ্টভাবে উল্লেখ করা হয়েছে:
@ পাক বলেন, "ফাংশন নামে প্রথম উল্লিখিত যুক্তিটি সত্যই প্রথম প্যারামিটারের নিশ্চয়তা নেই।"
@cbojar বলেছেন "অস্পষ্ট যুক্তির পরিবর্তে প্রকারগুলি ব্যবহার করুন"
সমস্যাটি হ'ল প্রোগ্রামিং ভাষাগুলি নামগুলি বোঝে না: এগুলিকে কেবল অস্বচ্ছ, পারমাণবিক প্রতীক হিসাবে ধরা হয়। সুতরাং, কোড মন্তব্যগুলির মতো, কোনও ফাংশনটির নামকরণ এবং এটি কীভাবে বাস্তবে পরিচালিত হয় তার মধ্যে অগত্যা কোনও সম্পর্ক নেই।
assertExpectedEqualsActual(foo, bar)
কিছু বিকল্পের সাথে (এই পৃষ্ঠা থেকে এবং অন্য কোথাও) তুলনা করুন , যেমন:
# Putting the arguments in a labelled structure
assertEquals({expected: foo, actual: bar})
# Using a keyword arguments language feature
assertEquals(expected=foo, actual=bar)
# Giving the arguments different types, forcing us to wrap them
assertEquals(Expected(foo), Actual(bar))
# Breaking the symmetry and attaching the code to one of the arguments
bar.Should().Be(foo)
এই সমস্তটির ভার্বোজের নামের চেয়ে আরও কাঠামো রয়েছে, যা ভাষাটিকে দেখার জন্য অস্বচ্ছভাবে কিছু দেয়। ফাংশনটির সংজ্ঞা এবং ব্যবহারও এই কাঠামোর উপর নির্ভর করে, তাই এটি বাস্তবায়ন কী করছে (নাম বা মতামত যেমন মন্তব্য করতে পারে) এর সাথে সামঞ্জস্য হতে পারে না।
আমি যখন এইরকম সমস্যার মুখোমুখি হই বা এড়াতে যাই তখন হতাশ হয়ে কম্পিউটারে চেঁচামেচি করার আগে আমি প্রথমে মেশিনটিকে দোষ দেওয়া কি এটি 'ন্যায্য' কিনা তা জিজ্ঞাসা করার জন্য এক মুহূর্ত সময় নিই। অন্য কথায়, মেশিনকে আমি যা চেয়েছিলাম তার থেকে আলাদা করার জন্য পর্যাপ্ত তথ্য দেওয়া হয়েছিল?
এই জাতীয় কলটি assertEqual(expected, actual)
যতটা বোঝায় ততই assertEqual(actual, expected)
সেগুলিকে মিশ্রিত করা এবং মেশিনটির সামনে লাঙল দেওয়া এবং ভুল কাজটি করা আমাদের পক্ষে সহজ। তাহলে আমরা ব্যবহৃত assertExpectedEqualsActual
পরিবর্তে, এটা করা হতে পারে আমাদের ভুল করা সম্ভাবনা কম, কিন্তু এটা মেশিনে আর তথ্য (ইংরেজি বুঝতে পারছি না, ও নাম পছন্দমত শব্দার্থবিদ্যা প্রভাবিত হওয়া উচিত নয়) দেয়।
কী কী "কাঠামোগত" পদ্ধতির কাছে আরও বেশি পছন্দনীয় করে তোলে যেমন কীওয়ার্ড আর্গুমেন্ট, লেবেলযুক্ত ক্ষেত্র, স্বতন্ত্র প্রকার ইত্যাদি etc. অতিরিক্ত তথ্যও মেশিন পঠনযোগ্য , তাই আমাদের কাছে মেশিন স্পটটি ভুল ব্যবহার হতে পারে এবং আমাদের জিনিসগুলি সঠিকভাবে করতে সহায়তা করতে পারে। assertEqual
কেস যেহেতু একমাত্র সমস্যা বেঠিক বার্তা হবে, খুব খারাপ নয়। আরও দুষ্টু উদাহরণ হতে পারে String replace(String old, String new, String content)
, যা বিভ্রান্ত করা সহজ যার সাথে String replace(String content, String old, String new)
খুব আলাদা অর্থ রয়েছে। একটি সহজ প্রতিকার হ'ল একটি জোড়া নেওয়া [old, new]
, যা ভুলগুলি তত্ক্ষণাত ত্রুটি ঘটায় (এমনকি কোনও প্রকারভেদ ছাড়াই) without
নোট করুন যে এমনকি প্রকারের সাথে আমরা নিজেদেরকে 'আমরা কী চাই তা মেশিনটিকে না বলে' খুঁজে পাই। উদাহরণস্বরূপ, "স্ট্র্যলি টাইপড প্রোগ্রামিং" নামক এন্টি-প্যাটার্নটি সমস্ত ডেটা স্ট্রিং হিসাবে বিবেচনা করে, যা যুক্তিগুলি মিশ্রিত করা সহজ করে তোলে (এই ক্ষেত্রে), কিছুটা পদক্ষেপ (যেমন পালানো) সম্পাদন করতে ভুলে যাওয়া, দুর্ঘটনাক্রমে আক্রমণকারীদের ভাঙ্গা (যেমন: আনসারসিয়েবল জেএসএন তৈরি করা), ইত্যাদি
এটি "বুলিয়ান ব্লাইন্ডনেস" এর সাথেও সম্পর্কিত, যেখানে আমরা কোডের এক অংশে বুলিয়ানস (বা সংখ্যা ইত্যাদি) গণনা করি, তবে অন্যগুলিতে ব্যবহার করার চেষ্টা করার সময় তারা প্রকৃতপক্ষে কী উপস্থাপন করছে তা পরিষ্কার নয় whether আমাদের এগুলি মিশ্রিত করা ইত্যাদি রয়েছে this এটির সাথে তুলনা করুন eg উদাহরণস্বরূপ স্বতন্ত্র এনামগুলির সাথে যা বর্ণনামূলক নাম রয়েছে (উদাহরণস্বরূপ LOGGING_DISABLED
পরিবর্তে false
) এবং যার ফলে যদি আমরা তাদের মিশ্রিত করি তবে একটি ত্রুটি বার্তা সৃষ্টি করে।