İş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, match
yö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 match
anonim 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?
friend
anahtar 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.