مفاهيم التصميم البرمجي

مفاهيم التصميم البرمجي (Software Design Concepts) هي الأساسيات أو الأعمدة الأساسية لبناء أي تطبيق، والتي يستخدمها مطورو البرمجيات لبناء أنظمة بشكل جيد (Well-Structured)، وقابلة للتعديل والتطوير (Maintainable)، وذات كفاءة عالية (Efficient)، كما تساعد هذه المفاهيم في ترجمة متطلبات العملاء إلى مخططات واضحة يمكن فهمها من قبل المطورين، وتحويلها إلى أكواد وبرامج مختلفة.

الهدف من التصميم البرمجي Software Design Goal

يعد الهدف الرئيسي من مفاهيم التصميم البرمجي، واستخدامها هو فهم متطلبات المستخدم (User Requirements)، وترجمة هذه المتطلبات إلى شئ واقعي يمكن للمستخدم الاستفادة منه، ويوجد العديد من الأدوات التي تساهم في التصميم البرمجي، وتنفيذ المفاهيم الرئيسية والمتقدمة، مثل: UML، كما يساعد التصميم البرمجي في تنفيذ برامج قابلة للتعديل والتطوير بشكل مستمر في حالة تغير متطلبات المستخدم باستمرار.

معرفة احتياجات المستخدم

يتمحور هذا الهدف حول جمع المعلومات، والمتطلبات من الملاك وأصحاب المصلحة، مثل: المستخدمون (Users)، ومحللي الأعمال (Business Analysts)، والمطورون الآخرون (Developers)، وهذه المتطلبات تنقسم إلى، متطلبات وظيفية (Functional) وهذه تجيب عن سؤال ماذا يقدم هذا البرنامج؟، ومتطلبات غير وظيفية (Non-Functional) وتحتوي على متطلبات الأداء، والأمان، إلخ.

معمارية وهيكلية النظام (System Architecture)

يساعد هذا المنظور العلوي في تعريف العناصر الأساسية للبرنامج، وكيف تتفاعل هذه العناصر مع المستخدم، فيمكن تمثيلها بالسيارة، فالسيارة كي تعمل تحتاج إلى محرك، وهيكل معدني، وإطارات، فكذلك البرنامج يحتاج إلى قاعدة بيانات، وواجهة مستخدم، وعناصر معالجة في الواجهة الخلفية، وهذا لكي يعمل البرنامج بشكل صحيح.

تصميم الوحدات (Modular Design)

يقوم تصميم البرمجيات على بعض المبادئ التي يتم اتباعها لإنشاء برمجيات هادفة للمستخدم، ومن أهم هذه المبادئ هو تقسيم البرنامج إلى مجموعة من الوحدات (Modules)، كل وحدة تكون مستقلة بذاتها، ولكن يتم جمعها في النهاية بشكل موحد، وتساعد هذه الطريقة في تصميم برمجيات على مستوى عالى من الأداء وقابلية التعديل، كما تساهم في توزيع العمل بين الفرق المختلفة في المشروع.

الأهداف الأساسية

  • قابل للتعديل (Maintainable): أثناء تصميم البرمجيات لابد أن يكون المبرمج على علم بأساسيات كتابة كود نظيف (Clean Code)، حيث يساعد ذلك في التعديل على الكود في المستقبل، كما يساعد المطورون الجدد على فهم المشروع وقراءة الكود من خلال: التعليقات (Comments)، والتوثيق (Documentation)، وتسمية المتغيرات والدوال بأسماء يمكن فهمها.
  • كفء (Efficient): لابد أن يقوم البرنامج بالعمل بكفاءة عالية، وهذا يتطلب فهم عمل البرامج من خلال الذاكرة العشوائية (Memory)، ووحدة المعالجة المركزية (CPU)، ويقوم المطور باختيار الخوارزميات وهياكل البيانات التي تساهم في توزيع جيد للمهام حول هذه المكونات الرئيسية.
  • قابل للتطوير (Scalable): من المهم ان يكون البرنامج قابل للتطوير لاستيعاب الزيادة في أعداد المستخدمين في المستقبل، أو التغييرات في متطلبات المستخدم.
  • قابل للاختبار (Testable): كما يجب على المطورون كتابة كود قابل للاختبار من خلال وحدات الاختبار (Unit Testing) بمختلف أنواعها.

عملية التصميم البرمجي Software Design Process

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

التصميم النظري (Conceptual Design)

يركز على المنظور العلوي ويقوم بتعريف الهيكلية الكاملة للبرنامج، ويقوم المصممون في هذه المرحلة برسم مخطط عالي الجودة يساهم في تحديد العناصر الأساسية وكيفية جمعها لتحقيق نتيجة محددة.

  • تعريف بنية النظام (System Architecture): هنا يتم تعريف اللبنات الأساسية للبرنامج، مثل قاعدة البيانات، وواجهة المستخدم، ووحدات المعالجة، كما يمكن تصورها من خلال مثال السيارة الذي شرحناه في الجزء السابق.
  • مخططات حالة الاستخدام (Use Case Diagrams): تساعد هذه المخططات في عرض طريقة تفاعل المستخدم مع البرنامج، من خلال عرض الإجراءات الأساسية التي سوف يقوم بها المستخدم داخل البرنامج، مثل: تسجيل الدخول، إضافة عنصر، إلخ.
  • اختيار التقنية المناسبة (Choosing Technologies): لإنشاء برنامج معين لابد من اختيار لغات البرمجة (Programming languages) التي سيتم استخدامها لبناء هذا البرنامج، ولكل لغة برمجة الاستخدام الخاص بها، كما لابد من تحديد إطار العمل المستخدم (Framework)، وقاعدة البيانات (Database)، والأدوات الأخرى التي سوف يتم دمجها مع البرنامج لتحقيق نتيجة جيدة.

التصميم التفصيلي (Detailed Design)

هنا يقسم التصميم النظري إلى تفاصيل محددة، حيث يعمل المصممون على تحديد كيفية عمل البرنامج باستخدام تفاصيل تقنية، يمكن فهمها من قبل المطورين.

  • نمذجة البيانات (Data Modeling): تصميم هياكل البيانات المستخدمة للبرنامج من خلال أسلوب نمذجة البيانات الذي يساهم في حفظ بيانات البرنامج بكفاءة عالية، بحيث يمكن استرجاع وتعديل البيانات بشكل سهل، وهذا يشمل تصميم قاعدة البيانات واختيار العناصر الداخلية.
  • اختيار الخوارزميات (Algorithms Selection): اختيار الخوارزميات الأكثر كفاءة في لتنفيذ مهام معينة من خلال البرنامج، مثل اختيار خوارزمية مناسبة للتصنيف (Sorting) لترتيب البيانات بشكل يناسب عمليات الاستدعاء والتعديل والحذف.
  • تصميم واجهة المستخدم (User Interface Design): تشمل تصميم النموذج وطرق تفاعل المستخدم حيث يتم تصميم واجهة يمكن للمستخدم التفاعل مع عمليات البرنامج من خلالها، ولابد من تصميم هذه الواجهة بناء على معايير تصميم واجهات المستخدم وتجربة المستخدم المتفق عليها.

التوثيق Documentation

  • ملفات التصميم (Design Documents): تحتوي هذه الملفات على تفاصيل التصميم البرمجي للبرنامج، وما يشمله من اختيارات محددة، والمواصفات، ونماذج البيانات، والخورازميات وهياكل البيانات المختارة، ووحدات المعالجة الرئيسية.
  • لغة التصميم الموحدة (Unified Modeling Language “UML”): هي لغة تتكون من رسوم بيانية ومخططات، تم تطويرها بهدف مساعدة مطوري ومصممي البرمجيات في تحديد، وعرض، وهيكلة، وتوثيق عمليات بناء أنظمة البرمجيات ونتائجها، وأيضا لكي تساعد في حل متطلبات العملاء بشكل واضح وسهل.

الكود النظيف Clean Code

يشير مفهوم الكود النظيف أن أكواد البرامج تكون سهلة الفهم، والقراءة، والتعديل من قبل أي مطور سواء قام بكتابة كود هذا البرنامج أو لم يساهم فيه من الأصل، ومن أشهر الكتب في هذا الجزء كتاب Clean Code للكاتب روبرت مارتن، وفي هذا الجزء سوف نتعلم بعضا من مبادئ كتابة كود نظيف، وما الفائدة من كتابة الأكود بهذا الشكل، وأمثلة على أكواد نظيفة.

مبادئ الكود النظيف (Clean Code Principles)

  • قابل للقراءة (Readability): لابد من إعطاء الأولوية لقابلية القراءة عن كتابة الكود، لمساعدة غيرك في فهم وقراءة الكود بشكل سهل، ولتحقيق ذلك لابد من استخدام أسماء ذات معنى، وتنسيق سليم للكود مثل المسافات والترتيب الجيد، واستخدام التعليقات لكي توضح المغزى من استخدام هذه الأجزاء من الكود.
  • التركيز (Focus): أن يكون غرض الكود الرئيسي واضح وقابل للفهم من سياق الكود، وتحديد مسئولية الوحدات والدوال بشكل جيد.
  • البساطة (Simplicity): كتابة كود بسيط يساهم في زيادة قابلية الكود للفهم والاستيعاب من قبل الآخرين.
  • الكفاءة (Efficiency): على الرغم من أن قابلية القراءة هي أهم شئ، ولكن لابد أن يكون الكود ذا كفاءة عالية واستخدام خوارزميات، مثل: Big O Notation لمعرفة مدى كفاءة الكود.

أمثلة أكواد نظيفة Examples

# Unclear variable name, cryptic function purpose
def do_something(data):
  # Complex logic with minimal comments
  for item in data:
    if item > 10:
      # Nested logic with magic numbers
      item = item * 2 + 5
  return data

# Descriptive variable name, clear function purpose
def calculate_double_plus_five_for_large_numbers(numbers):
  # Well-commented and easy-to-understand logic
  large_numbers = [num for num in numbers if num > 10]  for number in large_numbers:
    number *= 2
    number += 5
  return large_numbers

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى