นี่คือรหัส C ++ ทั่วไป:
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;
...
ดูเหมือนว่ารหัส C ++ ที่เหมาะสม - คลาส, ฟังก์ชันตัวช่วยmatch
ซึ่งใช้โดยวิธีการFoo
, ค่าคงที่บางค่าสำหรับฟังก์ชันตัวช่วยนั้น
แล้วฉันต้องการเขียนแบบทดสอบ
มันจะมีเหตุผลอย่างสมบูรณ์แบบในการเขียนการทดสอบหน่วยแยกต่างหากmatch
เพราะมันค่อนข้างไม่สำคัญ
แต่อยู่ในเนมสเปซที่ไม่ระบุชื่อ แน่นอนผมสามารถเขียนการทดสอบซึ่งจะเรียก
Foo::f()
อย่างไรก็ตามมันจะไม่เป็นการทดสอบที่ดีถ้าFoo
หนักและซับซ้อนการทดสอบดังกล่าวจะไม่แยกผู้ทดสอบออกจากปัจจัยอื่น ๆ ที่ไม่เกี่ยวข้อง
ดังนั้นฉันต้องย้ายmatch
ทุกอย่างออกจากเนมสเปซนิรนาม
คำถาม:อะไรคือจุดที่ทำให้ฟังก์ชั่นและค่าคงที่อยู่ในเนมสเปซนิรนามถ้ามันทำให้มันใช้ไม่ได้ในการทดสอบ?
friend
ไม่แนะนำให้ใช้คำหลักที่มีวัตถุประสงค์นั้นในทางที่ผิด หากข้อ จำกัด สำหรับวิธีนำไปสู่สถานการณ์ที่คุณไม่สามารถทดสอบได้โดยตรงอีกต่อไปนั่นหมายความว่าวิธีการส่วนตัวไม่มีประโยชน์
foo.cpp
, ไม่ใช่ส่วนหัว! OP ดูเหมือนจะเข้าใจได้ค่อนข้างดีว่าคุณไม่ควรใส่เนมสเปซอันใดอันหนึ่งไว้ในส่วนหัว