مبادئ التصميم وأفضل الممارسات وأنماط التصميم لـ C (أو البرمجة الإجرائية بشكل عام)؟ [مغلق

StackOverflow https://stackoverflow.com/questions/2492446

  •  21-09-2019
  •  | 
  •  

سؤال

هل هناك أي مبادئ تصميم معروفة وأفضل الممارسات وأنماط التصميم التي يمكن للمرء متابعتها أثناء تصميم مشروع C؟ أو مبادئ تصميم مفيدة للبرمجة الإجرائية (الضرورية) بشكل عام؟

(أنا طفل من "الجيل الموجهة للكائن" وعلي تصميم مشروع C كبير لأول مرة)

هل كانت مفيدة؟

المحلول

المعلومات المختبئة - كما تبناها Parnas (أساسيات البرمجيات).

إدارة دقيقة للرؤوس والوضوح:

  • يجب أن يكون كل شيء في ملف مصدر يمكن إخفاؤه من العالم الخارجي ؛ يجب أن تتعرض الواجهة الخارجية الموثقة فقط.
  • يتم الإعلان عن كل ما يتم كشفه في رأس.
  • يتم استخدام هذا الرأس عندما تكون هناك حاجة إلى الوظيفة (وحيث يتم تعريفها).
  • الرأس مكتفية ذاتيًا - عندما تحتاجه ، فأنت تستخدمه ، ولا يتعين عليك القلق بشأن "ما هي الرؤوس الأخرى التي يجب علي تضمينها أيضًا" لأن الرأس يضمن أنه يعمل من خلال تضمين أي شيء يحتاجه لجعله الشغل.
  • الرأس محمي ذاتيًا - لذلك لا يهم إذا تم تضمينه عدة مرات.

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • مجموعات التصميم من الوظائف للعمل على "الكائنات" (عادة الهياكل) - واستخدام هذه الوظائف بدلاً من التثبيت حول الأجزاء الداخلية للهيكل في الكود الذي يستخدمه. فكر في الأمر على أنه تغليف ذاتي.

نصائح أخرى

هناك كتاب جيد ومجاني وعلى الإنترنت بعنوان البرمجة الموجهة للكائنات مع ANSI-C, الذي يغطي موضوع كتابة الكود الموجهة للكائنات في C. بحث جوجل بالنسبة إلى "COBFICALED C" ، يعطي أيضًا عددًا من الأمثلة والموارد الجيدة الأخرى.

إذا كان مشروعك أمرًا محددًا ، misra-c هي مجموعة جيدة من القواعد. يهدف إلى الغالب بالنسبة لـ C المضمن ، ولكن يمكن أن يكون مفيدًا في مناطق أخرى أيضًا.

أنا أعتبر نفسي مبرمجة OO ، وأنا أقوم بالكثير من العمل مع مضمن C. أفضل نصيحة يمكنني تقديمها ، خاصة بالنسبة للمشاريع الكبيرة ، هي عدم المبالغة في ذلك. يمكن أن يكون إنشاء إطار OO الكامل علاوة على ANSI C مغريًا للغاية ، لكن الأمر يتطلب الكثير من الوقت والجهد للحصول عليه بشكل صحيح. كلما حصلت على مربيها ، زاد الوقت الذي تقضيه في تصحيح إطار عملك بدلاً من العمل على حقيقة مشروع. اقترب من المهمة برأس واضح ، وفهم جيد ، ياجني. حظا سعيدا!

نصيحاتي الثلاثة:

  • اكتب اختبارات الوحدة. سوف يساعدونك على الصفر في التصميم الذي يناسب مشكلتك أثناء تقدمك. أفضل بكثير من الاعتماد (فقط) على التفكير المسبق.
  • احصل على كاشف تسرب الذاكرة (هناك كل نوع من المكتبات هناك) مثبتة وتشغيلها من اليوم الأول. اطلب من هذه المكتبة طباعة جميع التسريبات بمجرد خروج البرنامج/الاختبارات. سيتيح لك ذلك التقاط تسرب بمجرد تقديمه ، مما يجعل إصلاحه أقل إيلامًا.
  • اكتب رمز OOP في C. ليس بهذه الصعوبة. على الرغم من أنه من الممكن محاكاة الطريقة التي تتجاوزها ، أقترح أن تبدأ بمضاهاة كائنات بسيطة. حتى هذه الآلية البسيطة يمكن أن تمنحك الأميال الكبرى.

هذا مثال:

typedef struct Vector {
  int size;
  int limit;
  int* ints; 
} Vector;

Vector* Vector_new() {
  Vector* res = (Vector*) malloc(sizeof(Vector));
  res->limit = 10;
  res->size = 0;
  res->ints = (int*) malloc(sizeof(int) * res.limit);

  return res;
}


void Vector_destroy(Vector* v) {
  free(v->ints);
  free(v);
}

void Vector_add(Vector* v, int n) {
  if(v->size == v->limit) {
    v->limit = v->limit * 2 + 10;
    v->ints = realloc(v->ints, v->limit);     
  }

  v->ints[v->size] = n;
  ++v->size;
}

int Vector_get(Vector* v, int index) {
  if(index >= 0 && index < v->size)
    return v->ints[index];

  assert false;
}

OOP هي منهجية وليس تقنية. لذا فإن نصيحتي الأولى هي التوقف عن التفكير في الأمر كبرمجة إجرائية.

إلى نقطة E.James ، لا ترغب في محاولة إعادة إنشاء لغة موجهة نحو الكائن أو التظاهر بأن لديك قدراتها. لا يزال بإمكانك القيام بكل الأشياء الصحيحة من خلال التمسك ببعض المبادئ البسيطة:

  1. اختبار القيادة كل شيء.
  2. العثور على ما يختلف وتغليفه.
  3. تصميم للواجهات.

يوفر معيار ترميز SEI CERT C مجموعة جيدة من القواعد والممارسات الجيدة العادية وكذلك الأشياء التي يجب أن تحاول تجنب استخدامها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top