OO C 공개 및 개인 기능에 대한 일반적인 명명 규칙은 무엇입니까? [닫은]


12

짧은 질문
OO C 프로젝트의 'public'및 'private'멤버의 이름을 지정하는 일반적인 방법이 있습니까?

배경
저는 공개 및 비공개 회원이 실제로 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 흥미로운 주제 : C로 구현 된 OO 디자인! 헤더 파일에 공개 함수를 선언하고 구현 .c 파일에 개인 함수를 정적 함수로 선언하는 접근 방식을 따르십시오. 그래도 왜 특정 명명 규칙이 필요한지 잘 모르겠습니다. 공공 및 개인 기능 모두에 대문자를 사용하지 않는 이유는 무엇입니까?
Giorgio

13
Bjarne Stroustrup은 객체 지향 C를 작성하는 매우 포괄적 인 방법을 모았습니다.
Ant

C에서 객체 기반 프로그래밍을 수행하는 또 다른 흥미로운 방법은 X11 프로그래머에게 친숙한 Xt 그래픽 툴킷을 볼 수 있습니다. 참조 : 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"헤더에 넣으십시오.

유형의 정의에도 동일하게 적용됩니다. 가능하면 구조를 헤더에 불완전한 유형으로 전달하고 소스 또는 "개인"헤더에 정의하십시오. 클래스를 상속하려면 정의가 필요하므로 여분의 헤더를 개인 정보가 아닌 보호 된 것으로 취급합니다.


아마도 C에서 가장 큰 객체 지향 코드는 Gnome 플랫폼 일 것입니다. 가장 낮은 수준의 기본 클래스를 제공하는 GObject 라이브러리 의 규칙을 가장 쉽게 볼 수 있습니다 . 그것은 내가 위에서 설명한 것과 대략 그놈 전체에서 사용됩니다.


컴파일 유닛 외부에서는 심볼이 보이지 않습니다. 이 주제에 대해 동료들과 이야기를 나 me 고 나에게 새벽이 왔습니다. 그러나 개인 함수가 헤더 파일에 없다는 것을 명확히하기 위해 C 파일에 정적으로 선언됩니다.
Adam Lewis

-1

구조체, 불투명 한 형식 또는 이와 유사한 형식으로 실제 "클래스"가 존재하면 다음과 같이 이름을 지정합니다.

typedef struct classname_t classname_t; 

_t 접미사는 C 표준 자체에서 사용되는 C에서 매우 일반적인 명명 규칙입니다. 클래스 / 타입에 대문자를 사용하는 것이 일반적이지 않습니다.

다음으로해야 할 일은 모든 공용 함수의 이름 접두사를 만드는 것입니다. 일반적으로 3 글자 정도입니다. "apple class"에 속하는 모든 함수의 이름은 아마도 다음 app_set_something()과 같습니다 app_get_something().

그런 다음 일관된 명명 규칙을 사용하려고합니다. 은 "생성자"라는 이름의 수 app_init()또는 app_construct()은 "소멸자 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.