सी परियोजना नामकरण संघर्ष से बचने


13

मैं मध्यम आकार के C लाइब्रेरी प्रोजेक्ट के लिए फ़ंक्शन नामकरण परंपराओं पर व्यावहारिक वास्तविक-विश्व सलाह खोजने के लिए संघर्ष कर रहा हूं। मेरी लाइब्रेरी परियोजना को कुछ मॉड्यूल और अपने स्वयं के हेडर के साथ सबमॉडल्स में विभाजित किया गया है, और शिथिल एक OO शैली का अनुसरण करता है (सभी फ़ंक्शन पहले तर्क के रूप में एक निश्चित संरचना लेते हैं, कोई ग्लोबल्स आदि)। यह हमारी तरह कुछ रखी है:

MyLib
  - Foo
    - foo.h
    - foo_internal.h
    - some_foo_action.c
    - another_foo_action.c
    - Baz
      - baz.h
      - some_baz_action.c
  - Bar
    - bar.h
    - bar_internal.h
    - some_bar_action.c

आम तौर पर फ़ंक्शन बहुत अधिक बड़े होते हैं (उदाहरण के लिए) स्टिक some_foo_actionऔर another_foo_actionएक foo.cकार्यान्वयन फ़ाइल में, अधिकांश फ़ंक्शन को स्थिर बनाते हैं, और इसे एक दिन कहते हैं।

मैं अपने ग्राहक कार्यक्रमों के साथ अपने उपयोगकर्ताओं के लिए संघर्ष से बचने के लिए पुस्तकालय का निर्माण करते समय अपने आंतरिक ("मॉड्यूल निजी") प्रतीकों को हटाने के साथ सौदा कर सकता हूं, लेकिन सवाल यह है कि मेरे पुस्तकालय में प्रतीकों का नाम कैसे दिया जाए? अब तक मैं कर रहा हूँ:

struct MyLibFoo;
void MyLibFooSomeAction(MyLibFoo *foo, ...);

struct MyLibBar;
void MyLibBarAnAction(MyLibBar *bar, ...);

// Submodule
struct MyLibFooBaz;
void MyLibFooBazAnotherAction(MyLibFooBaz *baz, ...);

लेकिन मैं पागल लंबे प्रतीक नामों (उदाहरणों की तुलना में लंबे समय तक) के साथ समाप्त कर रहा हूं। अगर मैं "नकली नाम स्थान" के साथ नामों को उपसर्ग नहीं करता हूं, तो मॉड्यूल के आंतरिक प्रतीक सभी टकरावों का नाम देते हैं।

नोट: मैं ऊंट / पास्कल मामले आदि के बारे में परवाह नहीं करता, बस खुद के नाम।

जवाबों:


10

प्रीफ़िक्सिंग (अच्छी तरह से, affixing) वास्तव में एकमात्र विकल्प है। आपके द्वारा देखे जाने वाले कुछ पैटर्न <library>_<name>(उदाहरण के लिए, OpenGL, ObjC रनटाइम), <module/class>_<name>(जैसे Linux के भाग), <library>_<module/class>_<name>(जैसे, GTK +)। आपकी योजना पूरी तरह से उचित है।

यदि वे पूर्वानुमेय हैं तो लंबे नाम आवश्यक रूप से बुरे नहीं हैं। तथ्य यह है कि आप पागल लंबे नामों और कार्यों के साथ समाप्त हो रहे हैं जो एक ही स्रोत फ़ाइल में संबंधित कार्यों के साथ छड़ी करने के लिए बहुत बड़े हैं, विभिन्न चिंताओं को उठाते हैं। क्या आपके पास कुछ और ठोस उदाहरण हैं?


मैं देखता हूं कि आप कहां से आ रहे हैं - मैंने सोचा है कि क्या मैं अलग-अलग फाइलों में विभाजित होने के बारे में बहुत अधिक चिंतित हूं, लेकिन यह पठनीयता, रखरखाव और git mergeआईएनजी के साथ बहुत मदद करता है । उदाहरण के रूप में मेरे पास ओपनजीएल के साथ यूआई ड्राइंग के लिए एक मॉड्यूल है, और मेरे पास .cप्रत्येक तत्व के लिए अलग-अलग फाइलें हैं जिनकी मुझे आवश्यकता है ( slider.c, indicator.cआदि)। इन तत्वों के कार्यान्वयन में एक मुख्य ड्राइंग फ़ंक्शन हो सकता है कि कुछ सौ लाइनें लंबी हों, और उचित संख्या में staticसहायक हों। वे यूआई मॉड्यूल के भीतर से कुछ शुद्ध ज्यामिति फ़ंक्शन भी कहते हैं। क्या यह ध्वनि काफी सामान्य है?
दान हल्दी

लंबे नामों का एक बेहतर उदाहरण मेरा ऑडियो मॉड्यूल हो सकता है - मेरे पास एक पदानुक्रम है जैसे Audio Module > Engines > Channels > Filtersकुछ का मतलब है MyLibAudioEngines<EngineName>Channel<ActionName>। या मेरे फ़िल्टर सबमॉड्यूल में: MyLibAudioFilters<FilterName><Type><Action>उदा। MyLibAudioFiltersBigSoundingCompressorFloat32Process
डैन हॉलिडे

उसमें से कोई भी अनुचित नहीं लगता है। एक फ़ंक्शन के लिए कुछ सौ लाइनें थोड़ी लंबी लगती हैं लेकिन अगर आप जो ड्राइंग कर रहे हैं वह जटिल है, तो उससे बचना मुश्किल हो सकता है। क्या यह भारी है या सिर्फ बहुत सारे निर्देश हैं?
user2313838

पुन: ऑडियो मॉड्यूल नाम, आप AudioFilters / AudioEngines संक्षिप्त कर सकते हैं क्योंकि मुझे लगता है कि यह बताना आसान होगा कि क्या यह नाम के आधार पर फ़िल्टर या मॉड्यूल है। फ्लोट 32 जैसे डेटाटाइप क्वालीफायर को भी संक्षिप्त किया जा सकता है (जैसे 'डी', 'एफ') क्योंकि इस तरह के संक्षिप्तीकरण C प्रोग्रामिंग में आम हैं।
user2313838

आपके उत्तर के लिए धन्यवाद - कभी-कभी सी प्रोग्राम आर्किटेक्चर (विशेषकर उच्च स्तर की भाषाओं की तुलना में) पर अच्छी जानकारी प्राप्त करना असंभव लगता है। कई सी किताबें जो मैंने पढ़ी हैं, उनमें कई मॉड्यूल या एक से अधिक फ़ाइल होने के विचार पर विचार करना मुश्किल है! कुल मिलाकर, मुझे नहीं लगता कि मैं बहुत कुछ बदलूंगा, सिवाय इस पर विचार करने के कि क्या कुछ लंबे नामों के लिए संक्षिप्त रूप से रहना है।
डैन हॉलिडे

5

सी पुस्तकालयों के लिए सामान्य सम्मेलन पुस्तकालय के नाम को बाहरी रूप से उपयोग करने योग्य नामों के लिए उपसर्ग के रूप में उपयोग करना है, जैसे

struct MyLibFoo;
void MyLibAFooAction(...);

पुस्तकालय-आंतरिक नामों के लिए जो अभी भी पुस्तकालय की कई इकाइयों में सुलभ होना चाहिए, कोई सख्त सम्मेलन नहीं है, लेकिन मैं पुस्तकालय के नाम के उपसर्ग और एक संकेत का उपयोग करूंगा कि यह एक आंतरिक कार्य है। उदाहरण के लिए:

struct MyLibInternalFooBaz;
void MyLibInternalFooBazAction();

मैं मानता हूं कि इससे ऐसे नाम हो सकते हैं जो टाइप करने के लिए काफी लंबे और कठिन हैं, लेकिन दुर्भाग्य से यह वह कीमत है जो हमें C ++ नामस्थान जैसी एक तंत्र के लिए नहीं है। नामों की लंबाई को कम करने के लिए, कुछ स्पष्टता की कीमत पर, आप अपने नामों में संक्षिप्त रूप का उपयोग करने का विकल्प चुन सकते हैं, लेकिन आपको फायदे और नुकसान को सावधानी से तौलना होगा।


3

यदि आप लंबे उपसर्गों से बचना चाहते हैं, तो आप लाइब्रेरी के नामों को संक्षिप्त कर सकते हैं जैसे कि Apple iOS और OS X में क्या करता है:

  • NSString OS की नेक्स्टस्टेप जड़ों से एक स्ट्रिंग है
  • कैलेयर एक कोर एनिमेशन परत है

2

फ़ंक्शन पॉइंटर्स के साथ एक वैश्विक संरचना चर होने का क्या मतलब है?

lib.h

#pragma once

typedef struct
{
    void (*doFoo)(int x);
    const char *(*doBar)(void *p);
} YourApi;

extern const YourApi yourApi;

lib.c:

#include "lib.h"

#include <stdio.h>

static void doFoo(int x)
{
    printf("Doing foo %d\n", x);
}

static const char *doBar(void *p)
{
    printf("Doing bar: %p\n", p);
    return "Hello";
}

const YourApi yourApi = {
    doFoo,
    doBar};

हार्नेस:

#include "lib.h"

int main()
{
    yourApi.doFoo(42);
    yourApi.doBar("asd");
}

स्थैतिक खोजशब्द अनुवाद इकाई के दायरे को सीमित कर देता है इसलिए यह दूसरों से नहीं टकराएगा।

उपयोगकर्ता तो एक संकेतक का उपयोग करके इसे छोटा कर सकता है YourApi *ya = &yourApi, फिर उपयोग कर रहा है ya->doFoo(...)

यह आपके पुस्तकालय को परीक्षण के लिए नकली करने का एक अच्छा तरीका प्रदान करता है।


कूल पैटर्न, इसके लिए थोड़ा बॉयलरप्लेट की आवश्यकता होती है, लेकिन यह स्वतः पूर्ण को अधिक उपयोगी बना देगा।
रिक लव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.