ฉันกำลังประเมินห้องสมุดซึ่งปัจจุบัน API สาธารณะมีลักษณะเช่นนี้:
libengine.h
/* Handle, used for all APIs */ typedef size_t enh; /* Create new engine instance; result returned in handle */ int en_open(int mode, enh *handle); /* Start an engine */ int en_start(enh handle); /* Add a new hook to the engine; hook handle returned in h2 */ int en_add_hook(enh handle, int hooknum, enh *h2);
ทราบว่าenh
เป็นที่จับทั่วไปใช้เป็นหมายเลขอ้างอิงไปยังประเภทข้อมูลที่แตกต่างกัน ( เครื่องมือและตะขอ )
ภายใน APIs เหล่านี้ส่วนใหญ่แน่นอน "การจัดการ" กับโครงสร้างภายในที่พวกเขาได้malloc
:
engine.c
struct engine { // ... implementation details ... }; int en_open(int mode, *enh handle) { struct engine *en; en = malloc(sizeof(*en)); if (!en) return -1; // ...initialization... *handle = (enh)en; return 0; } int en_start(enh handle) { struct engine *en = (struct engine*)handle; return en->start(en); }
ส่วนตัวฉันเกลียดการซ่อนสิ่งที่อยู่เบื้องหลังtypedef
s โดยเฉพาะอย่างยิ่งเมื่อมันลดความปลอดภัยของประเภท (ให้ข้อenh
ฉันจะรู้ได้อย่างไรว่ามันหมายถึงอะไรจริง ๆ ?)
ดังนั้นฉันจึงส่งคำขอดึงแนะนำการเปลี่ยนแปลง API ต่อไปนี้ (หลังจากปรับเปลี่ยนทั้งห้องสมุดเพื่อให้สอดคล้อง):
libengine.h
struct engine; /* Forward declaration */
typedef size_t hook_h; /* Still a handle, for other reasons */
/* Create new engine instance, result returned in en */
int en_open(int mode, struct engine **en);
/* Start an engine */
int en_start(struct engine *en);
/* Add a new hook to the engine; hook handle returned in hh */
int en_add_hook(struct engine *en, int hooknum, hook_h *hh);
แน่นอนว่าสิ่งนี้ทำให้การใช้งาน API ภายในดูดีขึ้นมากกำจัดการปลดเปลื้องและการรักษาความปลอดภัยประเภทไปยัง / จากมุมมองของผู้บริโภค
libengine.c
struct engine
{
// ... implementation details ...
};
int en_open(int mode, struct engine **en)
{
struct engine *_e;
_e = malloc(sizeof(*_e));
if (!_e)
return -1;
// ...initialization...
*en = _e;
return 0;
}
int en_start(struct engine *en)
{
return en->start(en);
}
ฉันชอบสิ่งนี้ด้วยเหตุผลดังต่อไปนี้:
- เพิ่มประเภทความปลอดภัย
- ปรับปรุงความชัดเจนของประเภทและวัตถุประสงค์
- ลบมันได้ปลดเปลื้องและ
typedef
s - มันเป็นไปตามรูปแบบที่แนะนำสำหรับประเภททึบแสงใน C
อย่างไรก็ตามเจ้าของโครงการหยุดชะงักที่คำขอดึง (ถอดความ):
struct engine
ส่วนตัวผมไม่ชอบความคิดของการเปิดเผยนั้น ฉันยังคิดว่าวิธีปัจจุบันสะอาดและเป็นมิตรมากขึ้นตอนแรกฉันใช้ประเภทข้อมูลอื่นสำหรับการจัดการเบ็ด แต่จากนั้นตัดสินใจที่จะเปลี่ยนไปใช้
enh
ดังนั้นการจัดการทุกประเภทจึงใช้ชนิดข้อมูลเดียวกันร่วมกันเพื่อให้ง่ายขึ้น หากสิ่งนี้สับสนเราสามารถใช้ประเภทข้อมูลอื่นได้อย่างแน่นอนมาดูกันว่าคนอื่น ๆ คิดอย่างไรกับข่าวประชาสัมพันธ์นี้
ขณะนี้ไลบรารีนี้อยู่ในช่วงเบต้าส่วนตัวดังนั้นจึงไม่มีรหัสผู้บริโภคมากนักที่จะต้องกังวล (ยัง) นอกจากนี้ฉันยังทำให้งงชื่อเล็กน้อย
ทึบแสงจัดการอย่างไรดีกว่าโครงสร้างทึบแสงที่มีชื่อ?
หมายเหตุ: ฉันถามคำถามนี้ที่การตรวจสอบโค้ดซึ่งมันถูกปิด