Libro

Effective C++ ฉบับที่ 3: 55 แนวทางเขียน C++ ให้ปลอดภัยขึ้น

หนังสือของ Scott Meyers ฉบับที่ 3 (Addison-Wesley, 2005) รวม 55 แนวทางสำหรับเขียน C++ บทความนี้สรุปจากสารบัญรายข้อและ Item 27 ที่สำนักพิมพ์เผยแพร่ เพื่อช่วยดูว่าเล่มนี้เหมาะกับระดับของคุณหรือไม่ และควรรู้อะไรเรื่องมาตรฐานภาษาที่ใช้

ภาพประกอบบทความ: ปกหนังสือ Effective C++ โดย Scott Meyers

ขอบเขตของบทความ: สรุปจากสารบัญรายข้อและ Item 27 ที่สำนักพิมพ์เผยแพร่ให้อ่านตัวอย่าง รวมกับข้อมูลหนังสือจากหน้าสำนักพิมพ์และเว็บไซต์ผู้เขียน ยังไม่ได้อ่านข้ออื่นนอกจาก Item 27 ข้อสังเกตเรื่องข้ออื่นมาจากชื่อข้อในสารบัญเท่านั้น

คนที่เขียน C++ ได้แล้วมักเจอปัญหาที่คอมไพเลอร์ไม่เตือน เช่น ทรัพยากรรั่ว destructor ที่ไม่ถูกเรียก หรือการ cast ที่ดูถูกต้องแต่ทำงานกับสำเนาของออบเจกต์ หนังสือเล่มนี้รวบรวมแนวทางสั้น ๆ ที่ช่วยหลีกเลี่ยงปัญหาแบบนั้น โดยจัดเป็นข้อ ๆ ที่อ่านแยกกันได้

หนังสือเล่มนี้ว่าด้วยอะไร

Effective C++: 55 Specific Ways to Improve Your Programs and Designs ฉบับที่ 3 เขียนโดย Scott Meyers อยู่ในชุด Addison-Wesley Professional Computing Series ตีพิมพ์วันที่ 12 พฤษภาคม 2005 ความยาว 320 หน้า ISBN 978-0-321-33487-9 (หน้าหนังสือของ InformIT)

หน้าสำนักพิมพ์ระบุว่าเนื้อหามากกว่าครึ่งเป็นของใหม่เมื่อเทียบกับฉบับก่อน มีบทใหม่ว่าด้วย resource management และ templates และพูดถึง exceptions, design patterns, multithreading และไลบรารี TR1 รวมถึงเปรียบเทียบกับ Java, C# และ C เพื่อช่วยคนที่ย้ายมาจากภาษาเหล่านั้น เว็บไซต์ของผู้เขียนให้คำอธิบายฉบับที่ 3 ในทำนองเดียวกันและมีหน้า errata แยกไว้ (aristeia.com)

เนื้อหาครอบคลุมหัวข้ออะไร

สารบัญแบ่ง 55 ข้อเป็น 9 บท (สารบัญบน InformIT):

บท

ชื่อบท

ข้อ

ตัวอย่างชื่อข้อ

1

Accustoming Yourself to C++

1–4

View C++ as a federation of languages; Use const whenever possible

2

Constructors, Destructors, and Assignment Operators

5–12

Declare destructors virtual in polymorphic base classes; Handle assignment to self in operator=

3

Resource Management

13–17

Use objects to manage resources

4

Designs and Declarations

18–25

Make interfaces easy to use correctly and hard to use incorrectly

5

Implementations

26–31

Minimize casting; Strive for exception-safe code

6

Inheritance and Object-Oriented Design

32–40

Make sure public inheritance models "is-a"

7

Templates and Generic Programming

41–48

Use traits classes for information about types; Be aware of template metaprogramming

8

Customizing new and delete

49–52

Understand the behavior of the new-handler

9

Miscellany

53–55

Pay attention to compiler warnings; Familiarize yourself with Boost

ภาคผนวก B เป็นตารางจับคู่ข้อระหว่างฉบับที่ 2 กับฉบับที่ 3 ซึ่งช่วยคนที่เคยอ่านฉบับเก่า

แนวคิดที่น่าสนใจจาก Item 27

Item 27 Minimize casting เปิดให้อ่านเป็นตัวอย่าง ยาวเจ็ดหน้า (Item 27) และแสดงรูปแบบการเขียนของทั้งเล่มได้ชัด คือเริ่มจากหลักการ ยกโค้ดที่ดูถูกแต่ผิด แล้วจบด้วยสรุปสั้น

  • cast ทำลายการรับประกันของ type system ผู้เขียนเตือนคนที่มาจาก C, Java หรือ C# ว่าการ cast ในภาษาเหล่านั้นจำเป็นกว่าและอันตรายน้อยกว่าใน C++

  • ใช้ cast แบบ C++ ได้แก่ const_cast, dynamic_cast, reinterpret_cast และ static_cast แต่ละแบบมีหน้าที่ชัดเจน หาในโค้ดได้ง่ายกว่า และช่วยให้คอมไพเลอร์ตรวจการใช้ผิดได้

  • cast สร้างโค้ดตอนรันได้ ผู้เขียนชี้ว่าออบเจกต์เดียวอาจมีที่อยู่มากกว่าหนึ่งค่าเมื่อมองผ่าน pointer ของคลาสแม่และคลาสลูก จึงไม่ควร cast โดยอาศัยสมมติฐานเรื่องการวางหน่วยความจำ

  • ตัวอย่างที่ผิดแบบเงียบ การ static_cast ตัว *this ไปเป็นคลาสแม่เพื่อเรียกฟังก์ชันของคลาสแม่ ไม่ได้เรียกบนออบเจกต์ปัจจุบัน แต่เรียกบนสำเนาชั่วคราว วิธีที่ถูกคือเรียก Window::onResize() ตรง ๆ

  • ระวัง `dynamic_cast` อาจช้าในบาง implementation และความต้องการใช้มักบอกว่าการออกแบบมีปัญหา ทางเลือกคือเก็บ pointer ของคลาสลูกใน container โดยตรง หรือย้าย virtual function ขึ้นไปที่คลาสแม่

ข้อสรุปท้ายข้อมีสามประเด็น คือ หลีกเลี่ยง cast เมื่อทำได้ ถ้าจำเป็นให้ซ่อนไว้ในฟังก์ชัน และเลือก cast แบบ C++ แทนแบบเก่า

พื้นฐานที่ควรมีก่อนอ่าน

จาก Item 27 ผู้อ่านควรเขียน C++ ได้แล้วและเข้าใจ class, inheritance, virtual function และ pointer เพราะตัวอย่างใช้แนวคิดเหล่านี้โดยไม่อธิบายพื้นฐาน เว็บไซต์ผู้เขียนเรียกเล่มนี้ว่าเป็นหนังสือ C++ เล่มที่สอง ไม่ใช่เล่มแรกสำหรับเริ่มเรียนภาษา

เหมาะกับใคร และใครควรเริ่มจากเล่มอื่นก่อน

  • เหมาะ กับนักพัฒนาที่เขียน C++ อยู่แล้ว เช่น งานระบบเทรดหรือไลบรารีคำนวณที่ต้องการประสิทธิภาพ และอยากรู้ว่าจุดไหนของภาษามักทำให้เกิดบั๊ก

  • ควรอ่านคู่กับเล่มที่ใหม่กว่า เพราะฉบับนี้ออกปี 2005 ก่อนมาตรฐาน C++11 ตัวอย่างใน Item 27 ยังใช้ std::tr1::shared_ptr และ typedef แบบเก่า ผู้เขียนมีหนังสือ Effective Modern C++ ที่ว่าด้วย C++11 และ C++14 แยกต่างหาก

  • ควรเริ่มจากเล่มอื่นก่อน ถ้ายังไม่เคยเขียน C++ มาก่อน

ข้อจำกัดของข้อมูลที่ใช้ในบทความนี้

  • อ่านเฉพาะ Item 27 และสารบัญ ข้ออื่นสรุปจากชื่อข้อเท่านั้น

  • ข้อมูลในแคตตาล็อกของ Libro ใช้ ISBN 9780132702065 ซึ่งเป็นรหัสจาก Google Books ส่วนหน้าสำนักพิมพ์แสดง ISBN ฉบับพิมพ์ 978-0-321-33487-9 ทั้งสองอ้างถึงฉบับที่ 3 ปี 2005 ตามปกในโฟลเดอร์หนังสือ ควรยืนยันรูปแบบไฟล์อีกครั้งตอนสอบถาม

  • บทความนี้ไม่ได้คอมไพล์หรือทดสอบโค้ดใดในเล่ม

แหล่งอ้างอิง

  • ปกหนังสือ Effective C++

    Effective C++

    Scott Meyers

    สารบัญมี 55 ข้อใน 9 บท ตั้งแต่ const และการจัดการทรัพยากร ไปจนถึง template, inheritance และการปรับแต่ง new/delete

    ดูรายละเอียด

บทความนี้อ่านจบได้ในตัวเอง หนังสือด้านบนคือจุดต่อยอดสำหรับผู้ที่ต้องการศึกษาลึกขึ้น