การออกแบบ API ไลบรารี C ++


12

ฉันกำลังมองหาแหล่งข้อมูลที่ดีสำหรับการเรียนรู้เกี่ยวกับการออกแบบ API ที่ดีสำหรับไลบรารี C ++, การดูออบเจกต์ร่วม / dll เป็นต้นมีทรัพยากรมากมายในการเขียน API ที่ดี, คลาสที่ดี, เทมเพลตและอื่น ๆ ในระดับซอร์ส วางสิ่งต่าง ๆ เข้าด้วยกันใน libs และ executables ที่ใช้ร่วมกัน หนังสือเช่นการออกแบบซอฟต์แวร์ C ++ ขนาดใหญ่โดย John Lakos มีความน่าสนใจ แต่ล้าสมัยอย่างมาก

สิ่งที่ฉันกำลังมองหาคือคำแนะนำเช่นในการจัดการแม่แบบ ด้วยเทมเพลตใน API ของฉันฉันมักจะจบลงด้วยรหัสห้องสมุดในแฟ้มที่ปฏิบัติการได้ของฉัน (หรือไลบรารีอื่น ๆ ) ดังนั้นถ้าฉันแก้ไขข้อบกพร่องที่นั่นฉันไม่สามารถเปิดไลบรารีใหม่ได้ แต่ต้องคอมไพล์ใหม่และแจกจ่ายลูกค้าทั้งหมดของรหัสนั้น (และใช่ฉันรู้วิธีแก้ปัญหาบางอย่างเช่นพยายามสร้างอินสแตนซ์ที่พบบ่อยที่สุดในห้องสมุดเป็นต้น)

ฉันกำลังมองหาคำเตือนและข้อควรระวังอื่น ๆ เพื่อรักษาความเข้ากันได้ของไบนารีในขณะที่ทำงานกับไลบรารี C ++

มีเว็บไซต์หรือหนังสือที่ดีในเรื่องดังกล่าวหรือไม่?


ฉันจัดการด้วยวิธีนี้: sivut.koti.soon.fi/~terop/GameApi.html - นั่นคือในขณะที่มีเทมเพลตอยู่ภายใน lib ไม่มีอยู่ใน API ...
tp1

1
std::unique_ptrเป็นสิ่งใหม่ที่สวย คุณคิดว่าอะไรที่เหมาะสมกับ API ที่คุณเสนอมากขึ้น วิธีที่คุณต้องจัดการทรัพยากรทั้งหมดด้วยตนเองรับประกันการรั่วไหลและการลบซ้ำซ้อนอย่างแท้จริงหรือไม่? หรือวิธีการที่หลายประเภทของคุณมีชื่อหนึ่งหรือสองตัวอักษรทำให้วัตถุประสงค์ของพวกเขาเป็นไปไม่ได้?
DeadMG

1
@ tp1: แต่คุณไม่ได้สนใจว่าฉันจัดการกับมัน คุณเพียงแค่พูดว่า "จับพวกเขา" โดยไม่ทำอะไรเลย ฉันไม่ได้จัดการกับพวกเขาและตอนนี้อะไร แทนที่จะใช้คลาส RAII ซึ่งไม่อนุญาตให้มีข้อผิดพลาดดังกล่าว หากคุณเคยใช้unique_ptrมันจะไม่สามารถเขียนโค้ดแบบนั้นได้
DeadMG

1
@ tp1: ฉันสังเกตเห็นว่า Env สามารถถูกทำลายได้ นั่นมันสวยมาก ดูเหมือนจะไม่มีฟังก์ชั่นใด ๆ ในการจัดการวัตถุเลย ถ้าฉันต้องการจัดการหน่วยความจำที่ละเอียดกว่า "ทุกสิ่งที่ฉันเคยสร้าง" หรือ "ไม่มีอะไร" ก็จะปรากฏว่าฉันเมา
DeadMG

3
กรุณาใช้การสนทนาใด ๆ ที่จะขยายวิศวกรรมซอฟต์แวร์สำหรับการพูดคุย ข้อมูลที่เป็นประโยชน์ใด ๆ สามารถรวมอยู่ในคำถามหรือคำตอบได้หรือไม่?
ChrisF

คำตอบ:


12

ในความเป็นจริงมีหนังสือเล่มหนึ่งที่เป็นสิ่งที่คุณต้องการอย่างแท้จริง มันคือการโทรที่เหมาะสมเพียงพอการออกแบบ API สำหรับ C ++ เว็บไซต์ของหนังสือเล่มนี้มีซอร์สโค้ดจากหนังสือและErrataเช่นกัน


1
+1 แน่นอนสำหรับหนังสือ! ฉันมาเพื่อแนะนำสิ่งนี้ แต่ปรากฎว่าคุณเอาชนะฉันได้
zxcdw

+1: ฉันอ่านหนังสือเล่มนี้เสร็จแล้วและเป็นแหล่งข้อมูลที่ยอดเยี่ยม แนะนำเป็นอย่างยิ่ง
Korchkidu

3

มันเป็นไปไม่ได้เลยทีเดียว ความจริงง่ายๆคือในบางครั้งคุณต้องการคอมไพเลอร์ในการทำงานและคุณไม่สามารถเพียงแค่กำจัดสิ่งที่จำเป็น ไม่มีฟังก์ชั่นที่สามารถสร้างstd::vectorไลบรารีส่วนหัวเท่านั้นไม่ได้ คอมไพเลอร์สามารถทำงานได้หลายอย่าง แต่คุณไม่สามารถมีได้โดยไม่ต้องเรียกใช้และนั่นคือความจริงของชีวิต

นี่คือสิ่งที่คุณสามารถทำได้: อย่าใช้แม่แบบที่คุณไม่ต้องการ นี่คือสิ่งที่คุณไม่สามารถทำได้: สิ่งอื่น

ความจริงง่ายๆคือการคอมไพล์ใหม่กับเวอร์ชั่นใหม่นั้นไม่ได้เป็นภาระใหญ่เมื่อเทียบกับข้อดีของประสิทธิภาพความปลอดภัยและฟังก์ชั่นที่คุณจะได้รับจากไลบรารีที่พิมพ์แบบคงที่


2
ฉันพูดถึงว่าเป็นตัวอย่างที่จะคิดเกี่ยวกับ สิ่งที่ฉันกำลังมองหาคือแนวทางในประเด็นอื่น ๆ ที่คล้ายกันซึ่งฉันควรเตรียมไว้และแนวทางปฏิบัติที่ดีที่สุดในการจัดการสิ่งเหล่านั้น
ฮันเนส

ถ้าเวอร์ชันใหม่ทั้งหมดที่ทำลายความเข้ากันได้ของ ABI จะถูกใส่เข้าไปใน inline-namespace ใหม่สิ่งที่สำคัญไม่ว่าจะเป็นไลบรารีเฉพาะส่วนหัวหรือไม่
Deduplicator
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.