İşte tipik bir C ++ kodu:
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;
...
İyi bir deyimsel C ++ kodu gibi görünüyor - bir sınıf, matchyöntemler tarafından kullanılan bir yardımcı fonksiyon Foo, o yardımcı fonksiyon için bazı sabitler.
Ve sonra testler yazmak istiyorum.
Bunun için ayrı bir birim testi yazmak mükemmel bir mantıklı olacaktır match, çünkü oldukça önemsiz değildir.
Ancak anonim bir ad alanında bulunur.
Tabii ki bir test yazabilirim Foo::f(). Bununla birlikte Foo, ağır ve karmaşıksa iyi bir test olmayacaktır , bu test testçiyi diğer ilgisiz faktörlerden izole etmeyecektir.
Bu yüzden matchanonim ad alanından başka her şeyi taşımak zorundayım .
Soru: İşlevleri ve sabitleri anonim ad alanına yerleştirmenin amacı nedir, eğer onları testlerde kullanılamaz hale getirirse?
friendanahtar kelimeyi bu amaçla kötüye kullanmanın önerilmediği konusunda birçok uzmanın büyük bir fikir birliği bulacaksınız . bir yöntem kısıtlaması, artık doğrudan test edemeyeceğiniz bir duruma yol açarsa, bu özel yöntemlerin yararlı olmadığını gösterir.
foo.cppüstbilgide değil! OP, anon ad alanlarını bir başlığa koymamanız gerektiğini gayet iyi biliyor gibi görünüyor.