البرمجة

الواجهات والمجموعات في C#

الواجهات (Interfaces) والمجموعات (Collections) في لغة #C: دراسة معمقة

تُعد لغة #C من اللغات القوية والحديثة التي طورتها شركة مايكروسوفت لتوفير بيئة برمجية غنية لإنشاء تطبيقات مكتبية، ويب، وسحابية. ومن أبرز الميزات المتقدمة التي توفرها #C هي آليات التعامل مع الواجهات (Interfaces) و المجموعات (Collections). هذان المفهومان يمثلان ركائز أساسية في تصميم البرمجيات الحديثة القائمة على المبادئ الكائنية (Object-Oriented Principles)، وخاصة مبدأ التجريد (Abstraction) والاعتماد على التعاقدات (Contracts) بدلاً من التوريث المباشر.

يتناول هذا المقال دراسة موسعة ومعمقة حول مفهومي الواجهات والمجموعات في #C، ويستعرض آليات الاستخدام الأمثل لهما، مع توضيح العلاقة الوثيقة بينهما، مرورًا بأمثلة عملية ومفاهيم التصميم البرمجي المرتبطة بهما.


مفهوم الواجهات (Interfaces) في لغة #C

تعريف الواجهة

الواجهة في #C هي نوع مرجعي (Reference Type) يُستخدم لتعريف مجموعة من التعاقدات (Contracts) التي يجب أن تلتزم بها الكائنات (Objects) التي تقوم بتطبيقها. أي أنها تحتوي على توقيعات (Signatures) للوظائف (Methods) والخصائص (Properties) دون تنفيذ فعلي، وتقوم الكائنات التي تطبق هذه الواجهة بتوفير تنفيذ خاص بها لتلك التوقيعات.

csharp
public interface IAnimal { void Eat(); void Sleep(); }

في المثال أعلاه، تُعرّف الواجهة IAnimal دالتين Eat و Sleep بدون تنفيذ، مما يجبر أي صنف يقوم بتطبيق هذه الواجهة على توفير تعريف لهاتين الدالتين.


أهمية الواجهات

الواجهات تقدم مرونة كبيرة في تصميم البرامج، فهي تدعم:

  • مبدأ التجريد: فصل ماذا يجب أن يُفعل عن كيفية تنفيذه.

  • القابلية للتوسع: تمكين الأنظمة من التوسع بسهولة بإضافة أنواع جديدة دون تغيير الأنواع الموجودة.

  • البرمجة المعتمدة على التعاقد: تمكين المطور من الاعتماد على ما يُتوقع من الكائنات، وليس كيف تم بناؤها.

  • التعددية الشكلية (Polymorphism): استخدام كائنات متعددة تشترك في واجهة واحدة عبر مرجعية واحدة.


تطبيق الواجهة

csharp
public class Dog : IAnimal { public void Eat() { Console.WriteLine("Dog eats bones."); } public void Sleep() { Console.WriteLine("Dog sleeps in the kennel."); } }

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


المجموعات (Collections) في لغة #C

نظرة عامة

توفر #C مكتبة قوية للمجموعات ضمن مساحة الأسماء System.Collections و System.Collections.Generic و System.Collections.Concurrent، وتشمل مجموعة من البنى البياناتية التي تسمح بتخزين الكائنات وإدارتها بكفاءة، مثل القوائم، القواميس، المكدسات، والطوابير.


تصنيفات المجموعات

1. المجموعات غير العامة (Non-Generic Collections)

تقع في مساحة الأسماء System.Collections، وهي مجموعات قديمة تسمح بتخزين كائنات من نوع Object، مما قد يؤدي إلى مشاكل الأداء (مثل الصندوقية Boxing وفك الصندوقية Unboxing).

أمثلة:

  • ArrayList

  • Hashtable

  • Queue

  • Stack

2. المجموعات العامة (Generic Collections)

أضيفت في #C 2.0 وتوفر نوعية قوية تسمح بتحديد نوع البيانات داخل المجموعة، مما يحسن الأداء ويزيد من الأمان النوعي (Type Safety).

أمثلة:

  • List

  • Dictionary

  • Queue

  • Stack

3. المجموعات المتزامنة (Concurrent Collections)

مصممة للعمل في بيئة متعددة الخيوط (Multithreaded)، وتوفر آليات حماية تلقائية من التداخلات المتزامنة.

أمثلة:

  • ConcurrentDictionary

  • ConcurrentQueue

  • BlockingCollection


جدول مقارنة بين أنواع المجموعات

النوع الأمان النوعي الأداء دعم التزامن التعريف الزمني
ArrayList لا ضعيف لا قديم
List نعم عالي لا حديث
ConcurrentQueue نعم متوسط نعم حديث
Dictionary نعم عالي لا حديث
ConcurrentDictionary نعم عالي نعم حديث

العلاقة بين الواجهات والمجموعات في #C

من أبرز معالم تصميم مكتبة المجموعات في #C هو استخدامها المكثف للواجهات، مما يسمح بتطبيق مبدأ البرمجة بالواجهات (Programming to Interface) بدلاً من البرمجة بالتطبيقات الفعلية (Implementation).

مثال:

csharp
void PrintAll(IEnumerable<string> collection) { foreach (var item in collection) { Console.WriteLine(item); } }

في هذا المثال، نقوم بالتعامل مع الواجهة IEnumerable مما يتيح تمرير أي مجموعة تحقق هذه الواجهة مثل List, HashSet, Queue وغيرها.


أهم الواجهات المستخدمة في المجموعات

IEnumerable و IEnumerator

  • توفر IEnumerable آلية لتكرار العناصر باستخدام foreach.

  • تقوم IEnumerator بتوفير آلية التنقل بين العناصر داخل المجموعة.

ICollection

تمتد من IEnumerable وتضيف خصائص مثل Count و Add() و Remove().

IList

تمتد من ICollection وتوفر دعماً للفهرسة (Indexing) مثل myList[0].

IDictionary

تمثل مجموعة من الأزواج المفتاحية والقيم Key/Value.


تطبيق عملي: إنشاء مجموعة مخصصة تطبق الواجهة IEnumerable

csharp
public class NumberCollection : IEnumerable<int> { private int[] numbers = { 1, 2, 3, 4, 5 }; public IEnumerator<int> GetEnumerator() { for (int i = 0; i < numbers.Length; i++) { yield return numbers[i]; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }

هذا المثال يعرض كيف يمكن لمطور إنشاء مجموعة مخصصة من الأعداد وتوفير آلية التكرار باستخدام الواجهات المعيارية.


أفضل الممارسات عند استخدام الواجهات والمجموعات

  • يفضل دائمًا البرمجة باستخدام الواجهات مثل IEnumerable, IList بدلاً من الأصناف الملموسة.

  • استخدام المجموعات العامة Generic للحصول على أداء وأمان أعلى.

  • الاستفادة من الواجهات لتحقيق مبادئ التصميم النظيف مثل الاعتماد على التجريد (Depend on Abstractions).

  • استخدام المجموعات المتزامنة في البيئات متعددة الخيوط لتجنب مشاكل التزامن.

  • تجنب استخدام المجموعات القديمة مثل ArrayList و Hashtable إلا لأسباب متعلقة بالتوافق.


مستقبل الواجهات والمجموعات في #C

مع تطور منصة .NET وتحديثات #C، تستمر مايكروسوفت في تحسين أداء ومرونة المجموعات من خلال تقديم أنواع جديدة مثل ImmutableArray, Span, و ReadOnlySpan، والتي توفر خصائص قوية مثل القراءة فقط، والكفاءة العالية في الذاكرة.

بالإضافة إلى ذلك، توفر الواجهات ميزات حديثة مثل دعم الواجهات ذات التنفيذ الافتراضي (Default Interface Implementation) ابتداءً من #C 8.0، والتي تسمح بتوفير تنفيذ افتراضي داخل الواجهة نفسها دون كسر التوافق مع التطبيقات القديمة.


الخلاصة

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

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


المراجع:

  1. Microsoft Docs – Interfaces (C# Programming Guide)

  2. Microsoft Docs – Collections in .NET