มากของวาทกรรมในหัวข้อที่นี่ทำให้รู้สึกว่ามีบางสิ่งที่พื้นฐานมากเกี่ยวกับ C ++ ที่ทำให้namespaces
และclass
ES / struct
s แตกต่างกันมาก
คลาสแบบสแตติก (คลาสที่สมาชิกทั้งหมดเป็นแบบสแตติกและคลาสจะไม่มีอินสแตนซ์) เป็นวัตถุเอง มันไม่ได้เป็นเพียงแค่การnamespace
บรรจุฟังก์ชั่น
แม่แบบการเขียนโปรแกรมเมตาช่วยให้เราสามารถใช้คลาสคงที่เป็นวัตถุเวลารวบรวม
พิจารณาสิ่งนี้:
template<typename allocator_type> class allocator
{
public:
inline static void* allocate(size_t size)
{
return allocator_type::template allocate(size);
}
inline static void release(void* p)
{
allocator_type::template release(p);
}
};
ในการใช้งานเราต้องการฟังก์ชั่นที่บรรจุอยู่ในคลาส เนมสเปซจะไม่ทำงานที่นี่ พิจารณา:
class mallocator
{
inline static void* allocate(size_t size)
{
return std::malloc(size);
}
inline static void release(void* p)
{
return std::free(p);
}
};
ตอนนี้ที่จะใช้มัน:
using my_allocator = allocator<mallocator>;
void* p = my_allocator::allocate(1024);
...
my_allocator::release(p);
ตราบใดที่ตัวจัดสรรใหม่แสดงallocate
และrelease
ฟังก์ชันที่เข้ากันได้การสลับไปยังตัวจัดสรรใหม่นั้นเป็นเรื่องง่าย
สิ่งนี้ไม่สามารถทำได้ด้วยเนมสเปซ
คุณต้องการฟังก์ชั่นเพื่อเป็นส่วนหนึ่งของชั้นเรียนหรือไม่? เลขที่
การใช้คลาส anti-pattern คงที่ใช่หรือไม่? มันขึ้นอยู่กับบริบท
สิ่งต่าง ๆ จะแตกต่างกันหรือไม่หากการรวบรวมฟังก์ชั่นยูทิลิตี้ต้องการข้อมูลที่ใช้ร่วมกันเช่นแคชที่สามารถเก็บไว้ในเขตข้อมูลส่วนตัวคงที่
ในกรณีดังกล่าวสิ่งที่คุณพยายามจะบรรลุนั้นน่าจะได้รับบริการที่ดีที่สุดผ่านการเขียนโปรแกรมเชิงวัตถุ