อนุสัญญาการตั้งชื่อทั่วไปสำหรับฟังก์ชั่นสาธารณะและส่วนตัวของ OO C คืออะไร? [ปิด]


12

คำถามสั้น ๆ
มีวิธีทั่วไปในการตั้งชื่อสมาชิก 'สาธารณะ' และ 'ส่วนตัว' ของโครงการ OO C หรือไม่?

ประวัติความเป็นมา
ผมเข้าใจว่าประชาชนและสมาชิกส่วนตัวไม่ได้จริงๆมีอยู่ในภาษา C อย่างไรก็ตามเช่นเดียวกับโปรแกรมเมอร์ C ส่วนใหญ่ฉันยังคงปฏิบัติต่อสมาชิกในฐานะสาธารณะหรือส่วนตัวเพื่อคงไว้ซึ่งการออกแบบ OO นอกเหนือจากวิธีการทั่วไปของ OO ฉันพบว่าตัวเองทำตามรูปแบบ (ดูตัวอย่างด้านล่าง) ซึ่งทำให้ฉันแยกแยะว่าวิธีใดมีความหมายสำหรับโลกภายนอกเทียบกับสมาชิกส่วนตัวที่อาจมีการตรวจสอบน้อยลง / มีประสิทธิภาพมากขึ้นเป็นต้น ... มีมาตรฐานหรือแนวปฏิบัติที่ดีที่สุดสำหรับสิ่งนั้นหรือเป็นตัวอย่างของฉันที่ด้านล่างเป็นวิธีที่ดีในการเข้าถึงสิ่งนี้หรือไม่?

ส่วนหัวตัวอย่าง

#ifndef _MODULE_X_H_
#define _MODULE_X_H_

bool MOD_X_get_variable_x(void);
void MOD_X_set_variable_x(bool);

#endif /* _MODULE_X_H_ */

ตัวอย่างแหล่งที่มา

// Module Identifier: MOD_X 
#include "module_x.h"

// Private prototypes
static void mod_x_do_something_cool(void);
static void mod_x_do_something_else_cool(void);

// Private Variables
static bool var_x;

// Public Functions - Note the upper case module identifier
bool MOD_X_get_variable_x(void)      {return var_x;}
void MOD_X_set_variable_x(bool input){var_x = input;}

// Private Functions  - Note the lower case module identifier
void mod_x_do_something_cool(void){
     // Some incredibly cool sub routine 
}

void mod_x_do_something_else_cool(void){
     // Another incredibly cool sub routine 
}

2
+1 สำหรับหัวข้อที่น่าสนใจ: การออกแบบ OO ดำเนินการใน C! ฉันจะทำตามวิธีการของคุณในการประกาศฟังก์ชั่นสาธารณะในไฟล์ส่วนหัวและฟังก์ชั่นส่วนตัวเป็นฟังก์ชั่นคงที่ในไฟล์. c ฉันไม่แน่ใจว่าทำไมคุณถึงต้องการการตั้งชื่อแบบเฉพาะ ทำไมไม่ใช้เช่นตัวพิมพ์ใหญ่สำหรับฟังก์ชันสาธารณะและส่วนตัว?
Giorgio

13
Bjarne Stroustrup ใส่กันสวยแบบครอบคลุมวิธีการเขียน object-oriented C ...
Ant

สำหรับวิธีการเขียนโปรแกรมเชิงวัตถุใน C ที่น่าสนใจอีกวิธีหนึ่งคุณสามารถดูชุดเครื่องมือกราฟิก Xt คุ้นเคยกับโปรแกรมเมอร์ X11 Ref: en.wikipedia.org/wiki/X_Toolkit_Intrinsics
sdg

@Giorgio: จุดสูงสุดและตัวพิมพ์เล็กสำหรับสมาชิกสาธารณะและส่วนตัวคือเพื่อให้เมื่อตรวจสอบรหัสหรือการบำรุงรักษารหัสมันเป็นที่รู้จักกันอย่างรวดเร็วถ้าเป็นสาธารณะหรือส่วนตัวโดยไม่ต้องค้นหาประกาศ
Adam Lewis

@Ant: Objective-C เป็นไปได้อีกอย่างหนึ่ง ฉันคิดว่าประเด็นที่นี่คือถ้าคุณเขียนโปรแกรมใน C คุณยังสามารถใช้การออกแบบ OO แน่นอนถ้าฉันใช้ OOP อย่างหนักฉันจะใช้ภาษา OO
Giorgio

คำตอบ:


17

การประชุมที่ฉันใช้คือ:

  • ฟังก์ชั่นสาธารณะ (ในไฟล์ส่วนหัว):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
    
  • ฟังก์ชั่นส่วนตัว (คงที่ในไฟล์การใช้งาน)

    static functionname(struct Classname * me, other args...)

อย่ามุ่งเน้นไปที่กรณี จุดคือการแยกความแตกต่างสองวิธีสาธารณะจากสองชั้นโดยการเติมคำนำหน้า (ชื่อชั้นเรียนในการประชุมนี้)

นอกจากนี้สิ่งที่ทำให้ OO-C เป็นวิธีที่วัตถุถูกส่งผ่านเป็นอาร์กิวเมนต์แรก


1
+1 ไม่ใช่ผู้เชี่ยวชาญ C ตัวใหญ่ แต่ก็ดูแข็งแกร่งและถูกต้อง (แม้จะอยู่ในเงื่อนไขการห่อหุ้มซึ่งฉันไม่เคยมีความสัมพันธ์กับ C - จนถึงตอนนี้)
Yam Marcovic

ระวังข้อ จำกัด ของตัวระบุที่บังคับใช้โดยคอมไพเลอร์บางตัว (เช่น 31 ตัวอักษรสำหรับบางตัว!)
detly

8

โดยทั่วไปการประชุมคือการไม่ใส่ฟังก์ชั่นส่วนตัวไว้ในส่วนหัวเลย

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

หากคุณจำเป็นต้องทำให้ฟังก์ชั่นใช้งานได้สำหรับบางคลาส แต่อย่างอื่นยังคงเป็นส่วนตัวมากกว่าที่คุณตั้งชื่อมันเหมือนกับวิธีอื่น ๆ แต่วางไว้ในส่วนหัว "-private" แยกต่างหาก

เช่นเดียวกับคำจำกัดความของประเภทเกินไป ถ้าเป็นไปได้คุณเพียงส่งต่อประกาศโครงสร้างเป็นชนิดที่ไม่สมบูรณ์ในส่วนหัวและกำหนดไว้ในแหล่งที่มาหรือในส่วนหัว "-private" คุณต้องมีคำจำกัดความเพื่อสืบทอดคลาสดังนั้นคุณจึงควรปฏิบัติต่อส่วนหัวที่ได้รับการป้องกันมากกว่าจะเป็นของส่วนตัว


น่าจะเป็นโค้ดเชิงวัตถุที่ใหญ่ที่สุดใน C คือแพลตฟอร์ม Gnome คุณสามารถส่วนใหญ่เห็นการประชุมในห้องสมุด GObject ที่ให้ต่ำสุดคลาสฐานระดับ มันเป็นสิ่งที่ฉันอธิบายข้างต้นอย่างคร่าวๆและใช้ทั่ว Gnome


ดีใจที่คุณสัมผัสกับความจริงที่ว่าสัญลักษณ์จะไม่สามารถมองเห็นได้ภายนอกหน่วยการรวบรวม ฉันเริ่มพูดคุยกับเพื่อนร่วมงานบางคนเกี่ยวกับหัวข้อนี้ อย่างไรก็ตามเพื่อชี้แจงฟังก์ชั่นส่วนตัวไม่ได้อยู่ในไฟล์ส่วนหัวพวกเขาจะประกาศแบบคงที่ในไฟล์ C
Adam Lewis

-1

หากมี "คลาส" จริงอยู่ในรูปแบบของ struct หรือทึบแสงหรือคล้ายกันฉันจะตั้งชื่อตาม:

typedef struct classname_t classname_t; 

ส่วนต่อท้าย _t เป็นหลักการตั้งชื่อทั่วไปใน C ซึ่งใช้โดยมาตรฐาน C เอง ที่พบได้น้อยคือการใช้อักษรตัวใหญ่สำหรับชั้นเรียน / ประเภท

สิ่งต่อไปที่คุณทำคือการคิดคำนำหน้าการตั้งชื่อสำหรับฟังก์ชั่นสาธารณะทั้งหมด โดยทั่วไปแล้วจะมีตัวอักษร 3 ตัว ฟังก์ชั่นทั้งหมดที่เป็นของ "ชั้นแอปเปิ้ล" อาจจะได้รับการตั้งชื่อapp_set_something(), app_get_something()ฯลฯ

จากนั้นคุณจะต้องการใช้ระเบียบการตั้งชื่อที่สอดคล้องกัน "การคอนสตรัค" อาจจะมีชื่อapp_init()หรือapp_construct()ที่ "destructor app_clear(), app_destruct(), app_destroy()หรือคล้ายกัน. ใช้ประชุมการตั้งชื่อเดียวกันสำหรับการเรียนทั้งหมดของคุณ. แล้วทำเช่นเดียวกันสำหรับฟังก์ชั่นหมา / ทะเยอทะยานและอื่น ๆ

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

ฉันจะไม่แนะนำให้ใช้ตัวพิมพ์ใหญ่เป็นวิธีการแยกความแตกต่างระหว่างส่วนตัวและสาธารณะ การประชุมในมาตรฐานการเข้ารหัส C เกือบทั้งหมดคือตัวอักษรตัวใหญ่ทั้งหมดระบุค่าคงที่มาโครหรือตัวประมวลผลล่วงหน้า การประชุมนั้นถูกใช้โดยมาตรฐาน C เองโดย Windows API โดยเคอร์เนล Linux และอื่น ๆ


_t สงวนไว้
Lilith River
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.