في هذه المقالة سنتعرف على مفهوم التجميع (Encapsulation) في لغة برمجة دارت (Dart)، وسنقدم أمثلة عملية لتوضيح كيفية استخدامه. يُعد التجميع من المفاهيم المهمة في البرمجة الشيئية OOP، وقبل أن نتعرف على التجميع في دارت، يجب أن يكون لديك فهم أساسي لمفهوم الكلاس (Class) والكائن (Object) في دارت.
مفهوم التجميع في دارت Encapsulation:
في دارت، يعني التجميع إخفاء البيانات داخل مكتبة (Library)، ومنع العوامل الخارجية من الوصول إليها. يساعدك التجميع في السيطرة على برنامجك ومنعه من أن يصبح معقدًا جدًا.
ما هي المكتبة Library في دارت؟
بشكل افتراضي، يُعتبر كل ملف بامتداد .dart مكتبة (Library). وتعتبر المكتبة مجموعة من الدوال والكلاسات Class. يمكن استيراد المكتبة في مكتبة أخرى باستخدام الكلمة المفتاحية import.
كيفية تحقيق التجميع في دارت؟
يمكن تحقيق التجميع في لغة دارت عن طريق:
- تعريف خاصية الكلاس كخاصية خاصة (Private) باستخدام علامة التسطير (_) قبل اسمها.
- توفير أساليب الحصول والتعيين العامة (Getter and Setter) للوصول إلى القيمة الخاصة وتحديثها.
أساليب الحصول والتعيين (Getter and Setter):
تُستخدم أساليب الحصول والتعيين (Getter and Setter) للوصول إلى القيمة الخاصة وتحديثها. تُستخدم أساليب الحصول (Getter) للوصول إلى قيمة الخاصية الخاصة، وتُستخدم أساليب التعيين (Setter) لتحديث قيمة الخاصية الخاصة Private.
مثال 1: التجميع في دارت Encapsulation:
في هذا المثال، سنقوم بإنشاء كلاس بعنوان “Employee”، يحتوي الكلاس على خاصيتين Private هما “_id” و”_name”. سننشئ أيضًا دالتين بأسماء “getId” و”getName” للوصول إلى الخاصيات الخاصة Private. وسننشئ أيضًا دالتين بأسماء “setId” و”setName” لتحديث الخاصيات الخاصة Private.
class Employee { // الخصائص الخاصة Private int? _id; String? _name; // دالة للوصول إلى الخاصية الخاصة "_id" int getId() { return _id!; } // دالة للوصول إلى الخاصية الخاصة "_name" String getName() { return _name!; } // دالة لتحديث الخاصية الخاصة "_id" void setId(int id) { _id = id; } // دالة لتحديث الخاصية الخاصة "_name" void setName(String name) { _name = name; } } void main() { // إنشاء كائن من الكلاس Employee Employee emp = Employee(); // تعيين قيم للكائن باستخدام دالة التعيين emp.setId(1); emp.setName("John"); // استرجاع قيم الكائن باستخدام دالة الحصول print("المعرّف: ${emp.getId()}"); print("الاسم: ${emp.getName()}"); }
نتيجة الكود:
المعرّف: 1 الاسم: John
الخصائص الخاصة (Private Properties):
الخاصية الخاصة Private هي خاصية يمكن الوصول إليها فقط من نفس المكتبة. في دارت، لا توجد كلمات مفتاحية مثل “private” لتعريف خاصية خاصة. يمكنك تعريفها عن طريق إضافة علامة التسطير (_) قبل اسم الخاصية.
مثال 2: الخصائص الخاصة في دارت:
في هذا المثال، سنقوم بإنشاء كلاس بعنوان “Employee”، يحتوي الكلاس على خاصية Private واحدة تسمى “_name”. سننشئ أيضًا دالة بأسم “getName” للوصول إلى الخاصية الخاصة.
class Employee { // الخاصية Private var _name; // دالة للوصول إلى الخاصية الخاصة "_name" String getName() { return _name; } // دالة التعيين لتحديث الخاصية الخاصة "_name" void setName(String name) { _name = name; } } void main() { var employee = Employee(); employee.setName("Jack"); print(employee.getName()); }
نتيجة الكود:
Jack
لماذا لا تكون الخصائص الخاصة فعلًا خاصة؟
في الدالة الرئيسية (main)، إذا كتبت الكود التالي، سيتم تجميعه وتشغيله بدون أي أخطاء. لنرى لماذا يحدث ذلك.
class Employee { // الخاصية الخاصة var _name; // دالة الحصول للوصول إلى الخاصية الخاصة "_name" String getName() { return _name; } // دالة التعيين لتحديث الخاصية الخاصة "_name" void setName(String name) { this._name = name; } } void main() { var employee = Employee(); employee._name = "John"; // هذا يعمل، ولكن لماذا؟ print(employee.getName()); }
نتيجة الكود:
John
سبب حدوث ذلك:
السبب الرئيسي وراء عدم فاعلية الخصائص الخاصة في دارت هو أن دارت ليست لغة تمامًا قائمة على الكائنات (Object-Oriented)، بل هي لغة برمجة شيئية-وظيفية (Object-Oriented and Functional). تتيح دارت للمطورين الوصول إلى الخصائص الخاصة من خارج الكلاس، وهذا يعني أنه ليس لديها فعليًا خصائص خاصة صارمة.
ما هو الحل:
حتى تحقق تجميعًا فعالًا في لغة دارت، يتعين عليك اتباع بعض الممارسات الجيدة. يمكنك استخدام علامة التسطير (_) قبل اسم الخاصية لإشارتها كخاصية خاصة، ولكن يجب أن تكون مستعدًا للتعامل معها بحذر.
عند استخدام الخصائص الخاصة، يجب أن تكون حذرًا وتتبع الأمانة البرمجية. لا تفتح الخصائص الخاصة للتعديل من الخارج مباشرة، واحرص على استخدام أساليب الحصول والتعيين (Getter and Setter) للتفاعل مع الخاصية الخاصة بطريقة آمنة.
مثال 3: الخصائص الخاصة وأساليب الحصول والتعيين في دارت:
في هذا المثال، سنستخدم علامة التسطير (_) لتعريف الخاصية الخاصة “_name”، ولكننا سنقوم بضبط قيمتها واسترجاعها باستخدام أساليب الحصول والتعيين.
class Employee { var _name; String get name { return _name; } set name(String name) { _name = name; } } void main() { var employee = Employee(); employee.name = "Sarah"; print(employee.name); }
نتيجة الكود:
Sarah
باستخدام هذا النهج، يتم تحقيق درجة من التجميع Encapsulation في دارت، حيث يتم إخفاء الخاصية الخاصة وتحديد طرق الوصول إليها وتعديلها بطريقة آمنة ومنضبطة.
في هذه المقالة، تعرفنا على مفهوم التجميع Encapsulation في لغة برمجة دارت (Dart) وكيفية تحقيقها. يعتبر التجميع طريقة هامة لتنظيم البرامج وجعلها أكثر فهمًا وصيانة. استخدمت دارت علامة التسطير (_) قبل اسم الخاصية لتعريفها كخاصية خاصة، واستخدمت أساليب الحصول والتعيين (Getter and Setter) للتفاعل بأمان مع الخاصية الخاصة. على الرغم من أن دارت ليست لغة مكتملة وقائمة على الكائنات بالكامل، يمكن استخدام بعض الأساليب والممارسات لتحقيق تجميع فعال في اللغة.