OO Cのパブリック関数とプライベート関数の一般的な命名規則は何ですか?[閉まっている]


12

短い質問
OO Cプロジェクトの「パブリック」メンバーと「プライベート」メンバーに名前を付ける一般的な方法はありますか?

背景
私は、パブリックおよびプライベートメンバーがC言語に実際に存在しないことを完全に理解しています。ただし、ほとんどのCプログラマーと同様に、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で実装されたオブジェクト指向設計!ヘッダーファイルでパブリック関数を宣言し、実装.cファイルでプライベート関数を静的関数として宣言するというアプローチに従います。ただし、特定の命名規則が必要な理由はわかりません。パブリック関数とプライベート関数の両方に大文字などを使用しないのはなぜですか?
ジョルジオ

13
ビャーネ・ストロヴストルップは...一緒にオブジェクト指向のCを書くのはかなり包括的な方法を置く
Antの

Cでオブジェクトベースのプログラミングを行う別の興味深い方法については、X11プログラマーに馴染みのあるXtグラフィックツールキットをご覧ください。参照:en.wikipedia.org/wiki/X_Toolkit_Intrinsics
sdg

@Giorgio:パブリックメンバーとプライベートメンバーの大文字と小文字のポイントは、コードを確認したりコードを保守したりするときに、宣言を検索せずにパブリックかプライベートかを一目でわかるようにすることです。
アダムルイス

@Ant:Objective-Cは別の可能性です。ここでのポイントは、Cでプログラミングしている場合でも、オブジェクト指向設計を使用できるということです。もちろん、OOPを多用する場合は、OO言語を使用します。
ジョルジオ

回答:


17

私が使用する規則は次のとおりです。

  • パブリック関数(ヘッダーファイル内):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
  • プライベート関数(実装ファイル内で静的)

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

ケースに焦点を合わせないでください。ポイントは、プレフィックス(この規則ではクラス名)を追加することにより、2つのクラスから2つのパブリックメソッドを区別することです。

さらに、OO-Cを作成するのは、オブジェクトが最初の引数として渡される方法です。


1
+1大きなCの専門家ではありませんが、それは堅実で正しいように見えます(カプセル化の用語でも、これは今までCと相関していませんでした)。
ヤムマルコビッチ

一部のコンパイラによって強制される識別子の文字制限に注意してください(たとえば、一部の場合は31文字です!)
12

8

通常、コンベンションはヘッダーに私的機能全く置かないことです。

通常、1つのオブジェクトの実装を1つのソースに完全に配置するため、プライベート関数は通常、ファイルスタティックにすることができます。その場合、通常は接頭辞をスキップして入力を節約します(シンボルはそのコンパイルユニットの外に表示されません)。

何らかの理由で関数を他のクラスで利用可能にする必要があるが、それ以外の場合はまだプライベートにする場合は、他のメソッドと同じように名前を付け、別の「-private」ヘッダーに入れます。

同じことが型の定義にも当てはまります。可能であれば、ヘッダーで構造を不完全な型として前方宣言し、ソースまたは「-private」ヘッダーで定義します。クラスを継承するには定義が必要なので、余分なヘッダーをプライベートなものではなく保護されたものとして扱います。


おそらくCのオブジェクト指向コードの最大の部分はGnomeプラットフォームです。GObjectライブラリの規約を最も簡単に確認できますこれは、最低レベルの基本クラスを提供します。それは私が上記で説明したおおよそのものであり、Gnome全体で使用されています。


コンパイルユニットの外ではシンボルが表示されないという事実に触れてくれてうれしいです。このトピックについて同僚と話をした後、私は気がつきました。ただし、プライベート関数がヘッダーファイルにないことを明確にするために、Cファイルで静的に宣言されています。
アダムルイス

-1

実際の「クラス」が構造体、不透明型などの形で存在する場合、次のように名前を付けます。

typedef struct classname_t classname_t; 

_t接尾辞はCで非常に一般的な命名規則であり、C標準自体によって使用されます。あまり一般的ではありませんが、クラス/タイプには大文字を使用します。

次に行うことは、すべてのパブリック関数の名前付けプレフィックスを作成することです。通常、いくつかの3文字のもの。「リンゴのクラス」に属するすべての機能は、おそらくという名前になり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は予約されています。
リリスリバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.