Các quy ước đặt tên điển hình cho các chức năng công cộng và riêng tư của OO C là gì? [đóng cửa]


12

Câu hỏi ngắn
Có cách nào điển hình để gọi tên các thành viên 'công khai' và 'riêng tư' của dự án OO C không?

Bối cảnh
Tôi hoàn toàn hiểu rằng các thành viên công cộng và tư nhân không thực sự tồn tại trong ngôn ngữ C. Tuy nhiên, giống như hầu hết các lập trình viên C, tôi vẫn coi các thành viên là công khai hoặc riêng tư để duy trì thiết kế OO. Ngoài các phương pháp OO điển hình tôi đã tìm thấy bản thân tôi sau một mô hình (xem ví dụ dưới đây) mà làm cho nó dễ dàng hơn cho tôi để phân biệt mà phương pháp này có nghĩa là cho thế giới bên ngoài vs các thành viên tin rằng có thể phải kiểm tra ít / hiệu quả hơn vv ... Liệu một tiêu chuẩn hoặc thực tiễn tốt nhất có tồn tại cho một điều như vậy hay là ví dụ của tôi dưới đây là một cách tốt để tiếp cận điều này?

Tiêu đề ví dụ

#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_ */

Nguồn ví dụ

// 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 Đối với chủ đề thú vị: Thiết kế OO được triển khai trong C! Tôi sẽ làm theo cách tiếp cận của bạn về việc khai báo các hàm công khai trong tệp tiêu đề và các hàm riêng dưới dạng các hàm tĩnh trong tệp .c triển khai. Tôi không chắc chắn tại sao bạn cần một quy ước đặt tên cụ thể mặc dù. Tại sao không sử dụng, ví dụ, chữ hoa cho cả chức năng công cộng và riêng tư?
Giorgio

13
Bjarne Stroustrup tập hợp một cách viết khá toàn diện về văn bản hướng đối tượng C ...
Ant

Đối với một cách thú vị khác để thực hiện lập trình dựa trên Object trong C, bạn có thể xem bộ công cụ đồ họa Xt, quen thuộc với các lập trình viên X11. Tham chiếu: en.wikipedia.org/wiki/X_Toolkit_Intrinsics
sdg

@Giorgio: Điểm quan trọng của chữ hoa và chữ thường đối với các thành viên công cộng và tư nhân là khi xem xét mã hoặc duy trì mã, bạn sẽ biết ngay nếu công khai hoặc riêng tư mà không phải tìm kiếm khai báo.
Adam Lewis

@Ant: Objective-C là một khả năng khác. Tôi nghĩ vấn đề ở đây là nếu bạn đang lập trình bằng C, bạn vẫn có thể sử dụng thiết kế OO. Tất nhiên, nếu tôi sử dụng nhiều OOP, tôi sẽ sử dụng ngôn ngữ OO.
Giorgio

Câu trả lời:


17

Quy ước tôi sử dụng là:

  • Chức năng công khai (trong tệp tiêu đề):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
    
  • Hàm riêng (tĩnh trong tệp thực hiện)

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

Đừng tập trung vào trường hợp. Vấn đề là phân biệt hai phương thức công khai với hai lớp bằng cách thêm tiền tố (tên lớp trong quy ước này).

Hơn nữa, điều làm cho OO-C là cách đối tượng được thông qua làm đối số đầu tiên.


1
+1 Không phải là một chuyên gia C lớn, nhưng điều đó có vẻ vững chắc và chính xác (ngay cả trong các điều khoản đóng gói, điều mà tôi chưa bao giờ tương quan với C - cho đến bây giờ).
Yam Marcovic

Cảnh giác với các giới hạn ký tự định danh được thi hành bởi một số trình biên dịch (ví dụ: 31 ký tự cho một số!)
đáng ghét

8

Thông thường quy ước là không đặt các chức năng riêng tư trong tiêu đề .

Vì bạn thường đặt việc thực hiện toàn bộ một đối tượng trong một nguồn, nên hàm riêng thường có thể chỉ là tệp tĩnh. Trong trường hợp đó, bạn thường bỏ qua tiền tố để lưu một số thao tác gõ (biểu tượng sẽ không hiển thị bên ngoài đơn vị biên dịch đó).

Nếu bạn vì một lý do nào đó cần phải cung cấp hàm cho một số lớp khác, nhưng nếu không thì vẫn riêng tư, hơn là bạn đặt tên cho nó giống như bất kỳ phương thức nào khác, nhưng đặt nó trong một tiêu đề "-private" riêng biệt.

Điều tương tự cũng áp dụng cho định nghĩa của loại. Nếu có thể, bạn chỉ chuyển tiếp khai báo cấu trúc là loại không hoàn chỉnh trong tiêu đề và xác định cấu trúc đó trong nguồn hoặc trong tiêu đề "-private". Bạn cần định nghĩa để kế thừa lớp, vì vậy bạn sẽ coi tiêu đề bổ sung là được bảo vệ hơn là những thứ riêng tư hơn.


Có lẽ phần lớn nhất của mã hướng đối tượng trong C là nền tảng Gnome. Bạn có thể dễ dàng thấy quy ước nhất trên thư viện GObject, nơi cung cấp các lớp cơ sở cấp thấp nhất . Nó đại khái như những gì tôi mô tả ở trên và được sử dụng trên khắp Gnome.


Vui mừng khi bạn chạm vào thực tế là biểu tượng sẽ không hiển thị bên ngoài đơn vị biên dịch. Nó chợt nhận ra tôi sau khi nói chuyện với một số đồng nghiệp về chủ đề này. Tuy nhiên, để làm rõ các chức năng riêng tư không có trong tệp tiêu đề, chúng được khai báo tĩnh trong tệp C.
Adam Lewis

-1

Nếu một "lớp" thực sự tồn tại, ở dạng cấu trúc, loại mờ hoặc tương tự, thì tôi đặt tên theo:

typedef struct classname_t classname_t; 

Hậu tố _t là một quy ước đặt tên rất phổ biến trong C, được sử dụng bởi chính tiêu chuẩn C. Ít phổ biến hơn là sử dụng chữ in hoa cho các lớp / loại.

Điều tiếp theo bạn làm là đưa ra một tiền tố đặt tên cho tất cả các chức năng công cộng. Điển hình là một số điều 3 chữ cái. Tất cả các chức năng thuộc về "lớp táo" có lẽ sẽ được đặt tên app_set_something(), app_get_something()v.v.

Sau đó, bạn sẽ muốn sử dụng một quy ước đặt tên nhất quán. Các "nhà xây dựng" có thể được đặt tên app_init()hoặc app_construct(), các "destructor app_clear(), app_destruct(), app_destroy()hoặc tương đương. Sử dụng quy ước đặt tên giống nhau cho tất cả các lớp học của bạn. Sau đó làm tương tự cho các chức năng setter / getter, và vân vân.

Các hàm riêng (tĩnh) không thực sự cần tiền tố lớp vì chúng không thể truy cập được bên ngoài tệp .c. Bạn vẫn có thể cung cấp cho họ cùng một tiền tố vì lý do thống nhất hoặc có thể chỉ cần đặt tên cho tất cả chúng bằng một tiền tố riêng, chẳng hạn như private_func(). Một cách rất phổ biến là đặt tên cho chúng bắt đầu bằng dấu gạch dưới, nhưng điều này rất tệ vì nó có thể va chạm với các chức năng của thư viện. Nói đúng ra, bạn không được phép sử dụng số nhận dạng bắt đầu bằng dấu gạch dưới.

Tôi không khuyến nghị sử dụng chữ hoa như một cách để phân biệt giữa riêng tư và công khai. Quy ước trong hầu hết tất cả các tiêu chuẩn mã hóa C là tất cả các chữ in hoa chỉ ra một hằng số, macro hoặc bộ xử lý trước xác định. Quy ước đó được sử dụng bởi chính tiêu chuẩn C, bởi API Windows, bởi nhân Linux, v.v.


_t được bảo lưu.
Sông Lilith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.