OO C genel ve özel işlevleri için tipik adlandırma kuralları nelerdir? [kapalı]


12

Kısa Soru
Bir OO C projesinin 'genel' ve 'özel' üyelerini adlandırmanın tipik bir yolu var mı?

Arka plan
Kamu ve özel üyelerin C dilinde gerçekten bulunmadığını tamamen anlıyorum . Bununla birlikte, çoğu C programcısı gibi, OO tasarımını korumak için üyelere hala kamu veya özel muamele ediyorum. Tipik OO yöntemlerine ek olarak bana hangi yöntemleri ayırt etmek daha kolay hale getiren bir desen (aşağıdaki örneğe bakın) Aşağıdaki kendime bulduk demek daha az kontrolleri olabilir özel üyelerin vs dış dünyaya yönelik / daha verimli vb vardır ... Böyle bir şey için standart ya da en iyi uygulama var mı ya da benim örneğim buna yaklaşmak için iyi bir yol mu?

Örnek Başlık

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

Örnek Kaynak

// 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 İlginç bir konu için: C'de OO tasarımı uygulandı! Başlık dosyasındaki genel işlevleri ve uygulama .c dosyasındaki statik işlevler olarak özel işlevleri bildirme yaklaşımınızı izlerdim. Yine de neden belirli bir adlandırma kuralına ihtiyacınız olduğundan emin değilim. Neden hem genel hem de özel işlevler için büyük harf kullanmıyorsunuz?
Giorgio

13
Bjarne Stroustrup nesne odaklı C yazma oldukça kapsamlı bir şekilde bir araya ...
Karınca

C'de Nesne tabanlı programlama yapmanın bir başka ilginç yolu için, X11 programcılarına aşina olan Xt grafik araç takımına bakabilirsiniz. Referans: en.wikipedia.org/wiki/X_Toolkit_Intrinsics
sdg

@Giorgio: Herkese açık ve özel üyeler için büyük ve küçük harflerin noktası, kodu incelerken veya kodu korurken, bir açıklama aramak zorunda kalmadan genel veya özel bir bakışta bilinir.
Adam Lewis

@Ant: Objective-C başka bir olasılık. Buradaki nokta, eğer C dilinde programlama yapıyorsanız, yine de OO tasarımını kullanabileceğinizdir. Tabii ki OOP'u yoğun bir şekilde kullanırsam OO diline giderim.
Giorgio

Yanıtlar:


17

Kullandığım sözleşme:

  • Genel işlev (başlık dosyasında):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
  • Özel işlev (uygulama dosyasında statik)

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

Davaya odaklanma. Mesele, bir önek (bu kuraldaki sınıf adı) önleyerek iki ortak yöntemi iki sınıftan ayırmaktır.

Dahası, OO-C'yi yapan şey, nesnenin ilk argüman olarak geçirilme şeklidir.


1
+1 Büyük bir C uzmanı değil, ancak sağlam ve doğru görünüyor (şimdiye kadar C ile hiçbir zaman ilişkilendirmediğim kapsülleme terimlerinde bile).
Yam Marcovic

Bazı derleyiciler tarafından uygulanan tanımlayıcı karakter sınırlarına dikkat edin (örneğin bazıları için 31 karakter!)
Ağustos'ta

8

Genellikle konvansiyon, özel fonksiyonları başlığa koymamaktır .

Normalde bir nesnenin uygulanmasını tamamen tek bir kaynağa koyduğunuzdan, özel işlev genellikle yalnızca dosya statik olabilir. Bu durumda, bazı yazımları kaydetmek için genellikle öneki atlarsınız (sembol bu derleme biriminin dışında görünmez).

Herhangi bir nedenden ötürü, işlevi başka bir sınıf için kullanılabilir hale getirmeniz gerekiyorsa, ancak yine de özel, diğer herhangi bir yöntem gibi adlandırdığınızdan, ancak ayrı bir "-private" başlığına koyun.

Aynısı türün tanımı için de geçerlidir. Mümkünse, yapıyı yalnızca başlıkta eksik tür olarak ileri bildirir ve kaynakta veya "-private" başlığında tanımlarsınız. Sınıfı devralmak için tanıma ihtiyacınız vardır, bu nedenle ekstra başlığa özel şeyler yerine korumalı olarak davranırsınız.


Muhtemelen C'deki en büyük nesne yönelimli kod Gnome platformudur. En düşük düzeyde temel sınıflar sağlayan GObject kütüphanesinde konvansiyonu en kolay şekilde görebilirsiniz . Kabaca yukarıda tarif ettiğim ve Gnome boyunca kullanılır.


Sembolün derleme biriminin dışında görünmeyeceğine sevindiniz. Bu konuda bazı iş arkadaşlarınızla konuştuktan sonra benden şaştı. Ancak özel işlevlerin başlık dosyasında olmadığını açıklığa kavuşturmak için C dosyasında statik olarak bildirilirler.
Adam Lewis

-1

Gerçek bir "sınıf", bir yapı, opak tip veya benzeri şeklinde varsa, o zaman ben buna göre adlandırın:

typedef struct classname_t classname_t; 

_T soneki, C standardının kendisi tarafından kullanılan C'de çok yaygın bir adlandırma kuralıdır. Daha az yaygın olan, sınıflar / türler için büyük harf kullanmaktır.

Yapacağınız bir sonraki şey, tüm genel işlevler için bir adlandırma öneki oluşturmaktır. Genellikle 3 harfli bir şey. "Elma sınıfına" mensup Tüm fonksiyonlar belki adının verileceğini app_set_something(), app_get_something()vb

Ardından tutarlı bir adlandırma kuralı kullanmak isteyeceksiniz. "Yapıcı" adlı olabilir app_init()ya app_construct(), "yoketme app_clear(), app_destruct(), app_destroy()veya benzer. Sonra ayarlayıcı / alıcı fonksiyonları için aynı şeyi. Bütün sınıflar için aynı adlandırma kuralı kullanın ve böyle devam eder.

Özel (statik) işlevler, .c dosyası dışında hiçbir şekilde erişilebilir olmadıklarından, sınıf önekine gerçekten ihtiyaç duymazlar. Tutarlılık nedenlerinden ötürü hala aynı öneki verebilir ya da hepsini basitçe gibi özel bir önekle adlandırabilirsiniz private_func(). Çok yaygın bir yol, onlara altçizgi ile başlayan isimler vermektir, ancak bu kötüdür, çünkü kütüphane işlevleriyle çarpışabilir. Kesinlikle bir alt çizgiyle başlayan tanımlayıcıları kullanmanıza izin verilmez.

Özel ve kamu arasında ayrım yapmak için büyük harf kullanılmasını önermem. Hemen hemen tüm C kodlama standartlarındaki kural, tüm harflerin büyük harfinin sabit, makro veya bir ön-işlemci tanımını gösterdiğidir. Bu kural C standardı tarafından, Windows API tarafından, Linux çekirdeği vb. Tarafından kullanılır.


_t saklıdır.
Lilith River
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.