নামবিহীন নেমস্পেসগুলি অকেট অযোগ্য করে তোলে


12

এখানে একটি সাধারণ সি ++ কোড রয়েছে:

foo.hpp

#pragma once

class Foo {
public:
  void f();
  void g();
  ...
};

foo.cpp

#include "foo.hpp"

namespace {
    const int kUpperX = 111;
    const int kAlternativeX = 222;

    bool match(int x) {
      return x < kUpperX || x == kAlternativeX;
    }
} // namespace

void Foo::f() {
  ...
  if (match(x)) return;
  ...

এটি দেখতে একটি শালীন আইডোমেটিক সি ++ কোডের মতো দেখাচ্ছে - একটি শ্রেণি, একটি সহায়ক ফাংশন matchযা Fooসেই সহায়িকার ফাংশনের জন্য কিছু ধ্রুবকের পদ্ধতি দ্বারা ব্যবহৃত হয় ।

এবং তারপরে আমি পরীক্ষা লিখতে চাই।
এটির জন্য পৃথক ইউনিট পরীক্ষা লেখার পক্ষে সম্পূর্ণ যুক্তিযুক্ত হবে match, কারণ এটি বেশ অ-তুচ্ছ।
তবে এটি একটি অজ্ঞাতনাস্থলে বাস করে।
অবশ্যই আমি একটি পরীক্ষা লিখতে পারি যা কল করবে Foo::f()। তবে এটি Fooভারী এবং জটিল হলে এটি একটি ভাল পরীক্ষা হবে না, এই ধরনের পরীক্ষা টেস্টিকে অন্যান্য সম্পর্কযুক্ত কারণ থেকে আলাদা করবে না।

সুতরাং আমাকে matchএবং সমস্ত কিছু অনামী নামস্থান থেকে সরে যেতে হবে ।

প্রশ্ন: বেনাম নেমস্পেসে ফাংশন এবং ধ্রুবকগুলি রাখার বিন্দুটি কী, যদি এটি পরীক্ষাগুলিতে তাদের অকেজো করে তোলে?


3
@ বিЈовић কোডটি পুনরায় পড়ুন - বেনামে নাম স্থানটি foo.cppশিরোনামে নেই! ওপি আপনাকে বেশিরভাগই বুঝতে পারে যে আপনার কোনও শিরোনামে অনন নেমস্পেসগুলি রাখা উচিত নয়।
আমন

কোনও বেনামে নেমস্পেসে ইউনিট টেস্টিং সি ++ কোডের কিছু ধারণা ... তবে "পয়েন্ট" হ'ল এনক্যাপসুলেশন ভাল। সর্বোপরি প্রাইভেট সদস্য ফাংশনগুলির ক্ষেত্রে আপনার একই সমস্যাটি রয়েছে: সেগুলি নিরঙ্কুশভাবে পরীক্ষা করা যায় না, তবে আপনি ইউনিট পরীক্ষার জন্য গোপন তথ্য (উদাহরণস্বরূপ stackoverflow.com/a/3676680/3235496 ) ছেড়ে দিতে চান না ।
মানিলিও

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

@ ডকব্রাউন আমি আননের মধ্যে কীভাবে কার্য সম্পাদন করতে পারি তা জিজ্ঞাসা করছি না। নামব্যবধান। আমি জিজ্ঞাসা করছি "কেন আননে কোড রাখি? নামের জায়গাগুলি?" (প্রশ্নের শেষে লেখাটি দেখুন)। শিরোনামকে অন্যরকম কিছুতে পরিবর্তন করার জন্য দোষারোপ করুন Ixrec।
অ্যাবিক্স

2
@ অ্যাকেক্স: আমি অন্য উপরে উল্লিখিত অন্যান্য জবাবগুলিতে আপনি এখানে অনেক বিশেষজ্ঞের একটি বিশাল sensক্যমত্য দেখতে পাবেন যে ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করা সত্যিই খারাপ ধারণা, এবং friendএই উদ্দেশ্যে কীওয়ার্ডটি অপব্যবহার করা বাঞ্ছনীয় নয় your আপনার অনুমানের সাথে যুক্ত করুন যে কোনও পদ্ধতির জন্য কোনও বিধিনিষেধ যদি এমন পরিস্থিতির দিকে পরিচালিত করে যেখানে আপনি এটি সরাসরি পরীক্ষা করতে পারবেন না, তবে বোঝানো হবে যে ব্যক্তিগত পদ্ধতিগুলি কার্যকর ছিল না।
ডক ব্রাউন

উত্তর:


7

আপনি যদি বেসরকারী বাস্তবায়ন-বিশদটি ইউনিট-টেস্ট করতে চান, তবে আপনি নামবিহীন নেমস্পেসের জন্য প্রাইভেট (বা সুরক্ষিত) শ্রেণি-সদস্যদের জন্য একই ধরণের ডজ করুন:

বিরতি এবং পার্টি।

ক্লাস করার সময় আপনি অপব্যবহারের সময় friend, নামবিহীন নেমস্পেসের জন্য আপনি #include-Mhanism অপব্যবহার করেন যা আপনাকে কোড পরিবর্তন করতে বাধ্যও করে না।
এখন যেহেতু আপনার টেস্ট-কোড (বা সবকিছুকে প্রকাশ করার জন্য আরও ভাল কিছু) একই টিউতে রয়েছে, কোনও সমস্যা নেই।

সাবধানতার একটি শব্দ: আপনি যদি বাস্তবায়ন-বিশদটি পরীক্ষা করেন তবে সেগুলি পরিবর্তন হলে আপনার পরীক্ষাটি ভঙ্গ হবে। কেবলমাত্র সেগুলি বাস্তবায়ন-বিশদ পরীক্ষা করার জন্য নিশ্চিত হন যা যাইহোক ফাঁস হবে, বা স্বীকার করুন যে আপনার পরীক্ষাটি অস্বাভাবিকভাবে সংক্ষিপ্ত।


6

আপনার উদাহরণের ফাংশনটি বেশ জটিল দেখাচ্ছে এবং ইউনিট পরীক্ষার উদ্দেশ্যে এটি শিরোনামে স্থানান্তর করা ভাল।

বেনাম নামস্থানে ফাংশন এবং ধ্রুবকগুলি রাখার বিন্দু কী, যদি এটি পরীক্ষাগুলিতে তাদের অকেজো করে তোলে?

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

তবে এটি যদি আপনার ইউনিট পরীক্ষাগুলি খুব জটিল করে তোলে তবে আপনি এটি ভুল করছেন wrong সেক্ষেত্রে ফাংশনটি সেখানে নেই। তারপরে সময়টি পরীক্ষার সহজ করার জন্য কিছুটা রিফ্যাক্টরিং করার সময় এসেছে।

সুতরাং, বেনামে নেমস্পেসে কেবল খুব সাধারণ কাজ করা উচিত, কখনও কখনও ধ্রুবক এবং প্রকার (টাইপিডেফ সহ) সেই অনুবাদ ইউনিটে ব্যবহৃত হয়।


5

ম্যাচের জন্য পৃথক ইউনিট পরীক্ষা লেখার পক্ষে এটি সম্পূর্ণ যুক্তিযুক্ত হবে, কারণ এটি বেশ অ-তুচ্ছ।

আপনি যে কোডটির জন্য দেখিয়েছেন matchতা কোনও ত্রুটিযুক্ত প্রান্তের মামলা ছাড়াই বেশ তুচ্ছ 1-লাইনার, বা এটি সরল উদাহরণের মতো? যাইহোক, আমি ধরে নিব এটি সরল ...

প্রশ্ন: বেনাম নামস্থানে ফাংশন এবং ধ্রুবকগুলি রাখার বিন্দুটি কী, যদি এটি পরীক্ষাগুলিতে তাদের অকেজো করে তোলে?

এই প্রশ্নটি হ'ল আমাকে এখানে কীভাবে ঝাঁপিয়ে পড়তে চেয়েছিল যেহেতু ডেডুপ্লিকেটর ইতিমধ্যে ব্রেক ইন এবং #includeট্রিকির মাধ্যমে অ্যাক্সেস পাওয়ার জন্য একটি দুর্দান্ত উপায় দেখিয়েছে । তবে এখানে শব্দবহুল শব্দগুলি মনে হয় যেন প্রতিটি একক অভ্যন্তরীণ বাস্তবায়নের বিশদ পরীক্ষা করে নেওয়া সর্বজনীন শেষ লক্ষ্য kind

এমনকি ইউনিট পরীক্ষার লক্ষ্য সর্বদা কার্যকারিতাটির প্রতিটি ছোট ছোট দানাদার অভ্যন্তরীণ মাইক্রো-ইউনিট পরীক্ষা করা নয় isn't একই প্রশ্নটি সি-তে স্ট্যাটিক ফাইল-স্কোপ ফাংশনের ক্ষেত্রে প্রযোজ্য আপনি এমনকি pimplsসি ++ তে বিকাশকারীদের কেন সাদা বাক্সে উভয়ই কৌশল friendship এবং #includeকৌশল প্রয়োজন , উন্নত সংকলনের সময়ের জন্য বাস্তবায়নের বিশদটি সহজ পরীক্ষামূলকতার ট্রেড করতে হবে কেন তা জিজ্ঞাসা করে প্রশ্নটির উত্তর দেওয়া আরও শক্ত করে তুলতে পারেন , যেমন

এক ধরণের বাস্তববাদী দৃষ্টিকোণ থেকে, এটি স্থূল মনে হতে পারে তবে matchকিছু প্রান্তের ক্ষেত্রে সঠিকভাবে প্রয়োগ করা যেতে পারে না যা এটির কারণ হতে পারে। যাইহোক, যদি একমাত্র বাইরের বর্গ, Fooঅ্যাক্সেস আছে যা matchসম্ভবত একটি উপায় এটি ব্যবহার করতে পারে না যে এনকাউন্টার ঐ প্রান্ত ক্ষেত্রে, তারপর, এটা বরং অপ্রাসঙ্গিক শুদ্ধি করতে Fooযে matchএই প্রান্ত মামলা যে যদি না সম্মুখীন করা হবে না হয়েছে Fooপরিবর্তন, যা বিন্দু এর পরীক্ষাগুলি Fooব্যর্থ হবে এবং আমরা তাত্ক্ষণিকভাবে জানব।

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

তাহলে লোকেরা কেন সি ++ এ বেনামে নামস্থানগুলিতে বা সি-এর অভ্যন্তরীণ লিঙ্কেজ সহ ফাইল-স্কোপ স্ট্যাটিক ফাংশন হিসাবে বাইরের বিশ্ব থেকে আড়াল করে ফাংশন সংজ্ঞায়িত করে? এবং এটাই মূলত: বাইরের বিশ্ব থেকে তাদের আড়াল করা। জটিলতা কমাতে (যা অন্যত্র অ্যাক্সেস করা যায় না অন্য কোথাও সমস্যা সৃষ্টি করতে পারে না) ইত্যাদি জটিলতার হ্রাস পর্যন্ত এর বেশ কয়েকটি প্রভাব রয়েছে a সম্ভবত ব্যক্তিগত বা আভ্যন্তরীণ প্রয়োগের বিশদগুলির পরীক্ষা-নিরীক্ষা যখন এটি করা শেষ করে তখন লোকদের মনে একটাই জিনিস নয়, বলুন, বিল্ড টাইম হ্রাস করা এবং বাইরের বিশ্ব থেকে অহেতুক জটিলতা লুকিয়ে রাখা।


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