อ่านSICPและเรียนรู้โครงการและการปฏิบัติความคิดของชนิดข้อมูลนามธรรม จากนั้นการเข้ารหัสใน C นั้นง่าย (เนื่องจาก SICP, บิตของ C, และบิตของ PHP, Ruby, ฯลฯ ) ความคิดของคุณจะกว้างพอและคุณจะเข้าใจว่าการเขียนโปรแกรมเชิงวัตถุอาจไม่ใช่รูปแบบที่ดีที่สุดใน ทุกกรณี แต่สำหรับบางโปรแกรมเท่านั้น) ระมัดระวังเกี่ยวกับการจัดสรรหน่วยความจำแบบไดนามิก Cซึ่งอาจเป็นส่วนที่ยากที่สุด C99หรือC11มาตรฐานการเขียนโปรแกรมภาษาและห้องสมุดมาตรฐาน Cเป็นจริงค่อนข้างยากจน (มันไม่ทราบเกี่ยวกับ TCP หรือไดเรกทอรี!) และคุณมักจะต้องห้องสมุดภายนอกบางส่วนหรือการเชื่อมต่อ (เช่นPOSIX , libcurlสำหรับไลบรารีไคลเอ็นต์ HTTP, libonionสำหรับไลบรารีเซิร์ฟเวอร์ HTTP, GMPlibสำหรับ bignums, บางไลบรารีเช่นlibunistringสำหรับ UTF-8, ฯลฯ ... )
"วัตถุ" ของคุณมักจะอยู่ใน C บางส่วนที่เกี่ยวข้องstruct
-s และคุณกำหนดชุดของฟังก์ชั่นการทำงานกับพวกเขา สำหรับฟังก์ชั่นสั้น ๆ หรือฟังก์ชั่นที่ง่ายมากให้พิจารณากำหนดด้วยฟังก์ชั่นที่เกี่ยวข้องstruct
เช่นเดียวกับstatic inline
ในไฟล์ส่วนหัวที่foo.h
จะเป็น#include
-d ที่อื่น
ขอให้สังเกตว่าการเขียนโปรแกรมเชิงวัตถุไม่ได้เป็นเพียงกระบวนทัศน์การเขียนโปรแกรม ในบางโอกาสกระบวนทัศน์อื่น ๆ นั้นคุ้มค่า ( การเขียนโปรแกรมการทำงาน à la Ocaml หรือ Haskell หรือแม้แต่ Scheme หรือ Commmon Lisp, การเขียนโปรแกรมเชิงตรรกะ à la Prolog, ฯลฯ ฯลฯ ... อ่านบล็อกของ J.Pitratเกี่ยวกับปัญญาประดิษฐ์ที่เปิดเผย) ดูหนังสือของสกอตต์: ภาษาการเขียนโปรแกรมใช้งานจริง
ที่จริงแล้วโปรแกรมเมอร์ใน C หรือ Ocaml มักไม่ต้องการโค้ดในรูปแบบการเขียนโปรแกรมเชิงวัตถุ ไม่มีเหตุผลที่จะบังคับให้คุณคิดถึงวัตถุเมื่อมันไม่มีประโยชน์
คุณจะกำหนดบางstruct
ฟังก์ชั่นและฟังก์ชั่นการทำงานของมัน (มักจะผ่านตัวชี้) คุณอาจต้องการสหภาพที่ติดแท็ก (บ่อยครั้ง, struct
กับสมาชิกแท็ก, บ่อยครั้งenum
, และunion
ภายใน), และคุณอาจพบว่ามีประโยชน์ในการมีสมาชิกอาร์เรย์ที่มีความยืดหยุ่นในตอนท้ายของstruct
-s
ดูข้างในซอร์สโค้ดของซอฟต์แวร์เสรีที่มีอยู่ในC (ดูgithub & sourceforge
เพื่อค้นหา) อาจเป็นไปได้ว่าการติดตั้งและใช้งานการกระจาย Linux นั้นมีประโยชน์:มันเกือบจะเป็นซอฟต์แวร์ฟรีเท่านั้น แต่ก็มีตัวรวบรวมซอฟต์แวร์ C ที่ยอดเยี่ยม ( GCC , Clang / LLVM ) และเครื่องมือในการพัฒนา ดูการเขียนโปรแกรม Linux ขั้นสูงหากคุณต้องการพัฒนาสำหรับ Linux
อย่าลืมที่จะรวบรวมกับคำเตือนทั้งหมดและข้อมูลการแก้ปัญหาเช่นgcc -Wall -Wextra -g
-notably ในระหว่างการพัฒนาและการแก้จุดบกพร่อง phases- และเรียนรู้การใช้เครื่องมือบางอย่างเช่นvalgrindการล่าสัตว์การรั่วไหลของหน่วยความจำที่gdb
ดีบัก ฯลฯ ดูแลเพื่อเข้าใจดีสิ่งที่ไม่ได้กำหนด พฤติกรรมและหลีกเลี่ยงอย่างยิ่ง (จำไว้ว่าโปรแกรมอาจมี UB บางอย่างและบางครั้งดูเหมือนจะ "ทำงาน")
เมื่อคุณต้องการโครงสร้างเชิงวัตถุ (โดยเฉพาะอย่างยิ่งการสืบทอด ) คุณสามารถใช้ตัวชี้ไปยังโครงสร้างที่เกี่ยวข้องและฟังก์ชัน คุณสามารถมีเครื่องจักรvtableของคุณเองมี "วัตถุ" แต่ละตัวเริ่มต้นด้วยตัวชี้ไปยังตัวชี้struct
ฟังก์ชั่นที่มี คุณใช้ประโยชน์จากความสามารถในการแปลงชนิดของตัวชี้ไปเป็นอีกประเภทของตัวชี้ (และจากข้อเท็จจริงที่ว่าคุณสามารถส่งจากstruct super_st
ชนิดเขตข้อมูลที่มีชนิดเดียวกับที่เริ่มต้นstruct sub_st
เพื่อเลียนแบบการสืบทอด) โปรดสังเกตว่า C ก็เพียงพอที่จะใช้ระบบวัตถุที่ค่อนข้างซับซ้อนโดยเฉพาะอย่างยิ่งโดยทำตามอนุสัญญาบางอย่าง- ดังที่GObject (จาก GTK / Gnome) แสดงให้เห็น
เมื่อคุณต้องการอย่างแท้จริงปิดคุณจะมักจะเลียนแบบพวกเขาด้วยการเรียกกลับมีการประชุมว่าฟังก์ชั่นการใช้โทรกลับทุกคนจะผ่านทั้งตัวชี้ฟังก์ชันและข้อมูลของลูกค้าบางคน (บริโภคโดยชี้ทำงานเมื่อมันเรียกว่า) คุณอาจมี (ตามธรรมเนียม) การปิดเหมือนของคุณเองstruct
(ที่มีตัวชี้ฟังก์ชั่นบางอย่างและค่าปิด)
เนื่องจาก C เป็นภาษาระดับต่ำมากจึงเป็นสิ่งสำคัญที่จะต้องกำหนดและจัดทำเอกสารการประชุมของคุณเอง (โดยได้รับแรงบันดาลใจจากการฝึกปฏิบัติในโปรแกรม C อื่น ๆ ) โดยเฉพาะอย่างยิ่งเกี่ยวกับการจัดการหน่วยความจำ มันจะมีประโยชน์ที่จะมีความคิดบางอย่างเกี่ยวกับสถาปัตยกรรมชุดการเรียนการสอน อย่าลืมว่าCคอมไพเลอร์อาจทำจำนวนมากของการเพิ่มประสิทธิภาพในรหัสของคุณ (ถ้าคุณขอให้) จึงไม่ดูแลมากเกินไปเกี่ยวกับการทำไมโครเพิ่มประสิทธิภาพด้วยมือออกจากที่คอมไพเลอร์ของคุณ ( สำหรับการรวบรวมที่ดีที่สุดของการปล่อยตัว ซอฟต์แวร์). หากคุณสนใจเกี่ยวกับการเปรียบเทียบและประสิทธิภาพแบบดิบคุณควรเปิดใช้งานการปรับให้เหมาะสม (เมื่อโปรแกรมของคุณได้รับการดีบั๊ก)gcc -Wall -O2
อย่าลืมว่าบางครั้งmetaprogrammingเป็นประโยชน์ บ่อยครั้งที่ซอฟต์แวร์ขนาดใหญ่ที่เขียนใน C ประกอบด้วยสคริปต์หรือโปรแกรม ad-hoc เพื่อสร้างรหัส C ที่ใช้ในที่อื่น (และคุณอาจเล่นเทคนิคpreprocessor Cสกปรกเช่นX-macros ) มีตัวสร้างโปรแกรม C บางตัวที่มีประโยชน์ (เช่นyaccหรือgnu bisonเพื่อสร้าง parsers, gperfเพื่อสร้างฟังก์ชันแฮชที่สมบูรณ์แบบ ฯลฯ ... ) ในบางระบบ (โดยเฉพาะ Linux & POSIX) คุณสามารถสร้างรหัส C บางอย่างที่รันไทม์ในgenerated-001.c
ไฟล์รวบรวมมันไปยังวัตถุที่ใช้ร่วมกันโดยใช้คำสั่งบางอย่าง (เช่นgcc -O -Wall -shared -fPIC generated-001.c -o generated-001.so
) ที่รันไทม์โหลดวัตถุที่ใช้ร่วมกันแบบไดนามิกโดยใช้dlopenและได้รับการชี้ฟังก์ชันจากชื่อใช้dlsym ฉันกำลังใช้เทคนิคดังกล่าวในMELT (ภาษาเฉพาะโดเมนที่เหมือนเสียงกระเพื่อมซึ่งอาจเป็นประโยชน์กับคุณเนื่องจากช่วยให้สามารถปรับแต่งคอมไพเลอร์GCC ได้ )
ระวังแนวคิดและเทคนิคการรวบรวมขยะ ( การนับการอ้างอิงมักเป็นเทคนิคในการจัดการหน่วยความจำใน C และ IMHO เป็นรูปแบบการรวบรวมขยะที่ไม่ดีซึ่งไม่จัดการกับการอ้างอิงแบบวงกลมได้ดีคุณอาจมีตัวชี้ที่อ่อนแอเพื่อช่วยในเรื่องนั้น แต่มันอาจจะยุ่งยาก) ในบางครั้งคุณอาจพิจารณาใช้เก็บขยะ Boehm ของอนุรักษ์นิยม
qux = foo.bar(baz)
qux = Foo_bar(foo, baz)