By using this site, you agree to the Privacy Policy and Terms of Use.
موافق
عرب فلاترعرب فلاتر
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
قراءة: الدرس 36: شرح مفهوم التغليف في لغة دارت (Encapsulation in Dart)
شارك
تسجيل الدخول
إشعار أظهر المزيد
Aa
عرب فلاترعرب فلاتر
Aa
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
Search

أقسام الموقع

استكشف جميع أقسام الموقع
قسم Dart في موقع عرب فلاتر

Dart

59 مقالات
قسم Widgets في موقع عرب فلاتر

Widgets

104 مقالات
قسم Packages في موقع عرب فلاتر

Packages

19 مقالات
قسم Tutorials في موقع عرب فلاتر

Tutorials

22 مقالات

أخر المواضيع

استكشف أخر المواضيع المنشورة
شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
Tutorials

شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا

5
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
Tutorials

حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر

10
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
Tutorials

أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات

17
لديك حساب موجود؟ تسجيل الدخول
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
© جميع الحقوق محفوظة موقع عرب فلاتر 2023
عرب فلاتر > Dart > الدرس 36: شرح مفهوم التغليف في لغة دارت (Encapsulation in Dart)
Dart

الدرس 36: شرح مفهوم التغليف في لغة دارت (Encapsulation in Dart)

عبدالله يوسف
أخر تحديث 2025/01/27
بواسطة عبدالله يوسف اضف تعليق 9 دقيقة للقراءة 2760 مشاهدات 5
شارك
شرح مفهوم التغليف في لغة دارت (Encapsulation in Dart)
شرح مفهوم التغليف في لغة دارت (Encapsulation in Dart)
شارك

خدماتنا البرمجية – عرب فلاتر🚀

خدماتنا البرمجية – عرب فلاتر

في هذه المقالة سنتعرف على مفهوم التغليف (Encapsulation) في لغة برمجة دارت (Dart)، وسنقدم أمثلة عملية لتوضيح كيفية استخدامه. يُعد التغليف من المفاهيم المهمة في البرمجة الشيئية OOP، وقبل أن نتعرف على التغليف في دارت، يجب أن يكون لديك فهم أساسي لمفهوم الكلاس (Class) والكائن (Object) في دارت.

المحتويات
مفهوم التغليف في دارت Encapsulation:ما هي المكتبة Library في دارت؟كيفية تحقيق التغليف في دارت؟أساليب الحصول والتعيين (Getter and Setter):مثال 1: التغليف في دارت Encapsulation:الخصائص الخاصة (Private Properties):مثال 2: الخصائص الخاصة في دارت:لماذا لا تكون الخصائص الخاصة فعلًا خاصة؟سبب حدوث ذلك:ما هو الحل:مثال 3: الخصائص الخاصة وأساليب الحصول والتعيين في دارت:الطريقة الصحيحه لتحقيق مفهوم التغليف في دارتمثال عملي لتحقيق مفهوم التغليف في دارت:

مفهوم التغليف في دارت Encapsulation:

في دارت، التغليف يعني إخفاء البيانات داخل مكتبة (Library)، ومنع العوامل الخارجية من الوصول إليها. يساعدك التغليف في السيطرة على برنامجك ومنعه من أن يصبح معقدًا جدًا.

“اقرأ أيضاً: شرح حلقة التكرار Do While في لغة دارت (Dart)“


ما هي المكتبة Library في دارت؟

بشكل افتراضي، يُعتبر كل ملف بامتداد .dart مكتبة (Library). وتعتبر المكتبة مجموعة من الدوال والكلاسات Class. يمكن استيراد المكتبة في مكتبة أخرى يعني في ملف أخر باستخدام الكلمة المفتاحية import.

“اقرأ أيضاً: شرح استخدام assert في لغة دارت (Assert In Dart)“


كيفية تحقيق التغليف في دارت؟

يمكن تحقيق التغليف في لغة دارت عن طريق:

  1. تعريف خاصية الكلاس كخاصية خاصة (Private) باستخدام علامة التسطير (_) قبل اسمها.
  2. توفير أساليب الحصول والتعيين العامة (Getter and Setter) للوصول إلى القيمة الخاصة وتحديثها.

“اقرأ أيضاً: شرح استخدام حزمة Device Preview في Flutter“


أساليب الحصول والتعيين (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 في دارت، حيث يتم إخفاء الخاصية الخاصة وتحديد طرق الوصول إليها وتعديلها بطريقة آمنة ومنضبطة.

“اقرأ أيضاً: شرح استخدام ويدجت Transform في فلاتر“


الطريقة الصحيحه لتحقيق مفهوم التغليف في دارت

لتحقيق مفهوم التغليف بصورة مثالية في دارت، يتم وضع الكلاس في ملف منفصل عن الملف الذي يتم استدعاؤه فيه. هذه الطريقة تساعد في:

  • تنظيم الكود: تسهيل قراءة الكود وصيانته من خلال فصل المسؤوليات المختلفة.
  • إخفاء البيانات: استخدام الخصائص الخاصة (Private Properties) لضمان عدم الوصول المباشر لها من الملفات الخارجية.
  • إعادة استخدام الكود: يمكن استيراد الكلاس في أي ملف آخر بسهولة عند الحاجة.

مثال عملي لتحقيق مفهوم التغليف في دارت:

ملف الكلاس: bank_account.dart

// تعريف كلاس BankAccount
class BankAccount {
  // خصائص خاصة (Private) باستخدام _
  String _accountHolderName;
  double _balance;

  // المُنشئ (Constructor)
  BankAccount(this._accountHolderName, this._balance);

  // Getter للحصول على اسم صاحب الحساب
  String get accountHolderName => _accountHolderName;

  // Getter للحصول على الرصيد
  double get balance => _balance;

  // Setter لتغيير اسم صاحب الحساب
  set accountHolderName(String name) {
    if (name.isNotEmpty) {
      _accountHolderName = name;
    } else {
      print('الاسم لا يمكن أن يكون فارغًا.');
    }
  }

  // دالة لإيداع الأموال
  void deposit(double amount) {
    if (amount > 0) {
      _balance += amount;
      print('تم إيداع $amount. الرصيد الحالي: $_balance');
    } else {
      print('المبلغ المودع يجب أن يكون أكبر من صفر.');
    }
  }

  // دالة لسحب الأموال
  void withdraw(double amount) {
    if (amount > 0 && amount <= _balance) {
      _balance -= amount;
      print('تم سحب $amount. الرصيد الحالي: $_balance');
    } else {
      print('عملية السحب غير ممكنة. تأكد من توفر الرصيد الكافي.');
    }
  }
}

ملف التنفيذ الرئيسي: main.dart

// استيراد كلاس BankAccount
import 'bank_account.dart';

void main() {
  // إنشاء حساب بنكي جديد
  BankAccount account = BankAccount('أحمد محمد', 500.0);

  // عرض الرصيد الأولي
  print('اسم صاحب الحساب: ${account.accountHolderName}');
  print('الرصيد الأولي: ${account.balance}');

  // إجراء عملية إيداع
  account.deposit(200.0);

  // إجراء عملية سحب
  account.withdraw(100.0);

  // محاولة تغيير اسم صاحب الحساب
  account.accountHolderName = 'محمد أحمد';
  print('اسم صاحب الحساب الجديد: ${account.accountHolderName}');

  // محاولة سحب مبلغ أكبر من الرصيد
  account.withdraw(1000.0);
}

نتيجة الكود:

اسم صاحب الحساب: أحمد محمد
الرصيد الأولي: 500.0
تم إيداع 200.0. الرصيد الحالي: 700.0
تم سحب 100.0. الرصيد الحالي: 600.0
اسم صاحب الحساب الجديد: محمد أحمد
عملية السحب غير ممكنة. تأكد من توفر الرصيد الكافي.

بهذه الطريقة يتم ضمان أن الكود في الملف الآخر لا يمكنه الوصول إلى الخصائص الخاصة مباشرة، مما يعزز من مفهوم التغليف ويمنع التلاعب غير المصرح به.

“اقرأ أيضاً: طريقة انشاء المجلدات باستخدام كود Dart تلقائيًا“


في هذه المقالة، تعرفنا على مفهوم التغليف Encapsulation في لغة برمجة دارت (Dart) وكيفية تحقيقها. يعتبر التغليف طريقة هامة لتنظيم البرامج وجعلها أكثر فهمًا وصيانة. استخدمت دارت علامة التسطير (_) قبل اسم الخاصية لتعريفها كخاصية خاصة، واستخدمت أساليب الحصول والتعيين (Getter and Setter) للتفاعل بأمان مع الخاصية الخاصة. على الرغم من أن دارت ليست لغة مكتملة وقائمة على الكائنات بالكامل، يمكن استخدام بعض الأساليب والممارسات لتحقيق تغليف فعال في اللغة.

Arab Flutter Community 🚀

انضم إلى مجتمع Arab Flutter
شارك هذا المقال
فيسبوك تويتر Whatsapp Whatsapp لينكد ان تلغرام نسخ الرابط
المقال السابق شرح مفهوم الـ Constant Constructor في لغة دارت الدرس 35: شرح مفهوم الـ Constant Constructor في لغة دارت
المقال التالي شرح مفهوم الـ Getter في لغة دارت (Getter in Dart) الدرس 37: شرح مفهوم الـ Getter في لغة دارت (Getter in Dart)
Avatar of عبدالله يوسف
بواسطة عبدالله يوسف Founder and CEO at ArabFlutter
تابع:
أنا عبدالله يوسف، مهندس مصري ومؤسس موقع عرب فلاتر، ملهم بشغف التكنولوجيا والإبداع. كمصمم مواقع ومبرمج تطبيقات موبايل باستخدام Flutter، أستمتع بخلق عوالم رقمية فريدة ومبتكرة. تتجلى مواهبي في تصميم وتطوير واجهات مستخدم تفاعلية، حيث يمزج الجانب الجمالي بالدقة الهندسية. ما يميزني هو إلمامي الواسع بتقنيات البرمجة والتصميم، ومقدرتي على تطوير تطبيقات متنوعة عبر منصات مختلفة. أعتبر نفسي مبدعًا وملتزمًا، حيث أسعى دائمًا لتحقيق تحسين مستمر في مهاراتي وتقنياتي. أستمتع بتحديات العمل الجماعي وأؤمن بأهمية الابتكار والتطور. بفضل إبداعي والتزامي، أسعى لتقديم حلول فعّالة تلبي توقعات العملاء وتفوق عن المألوف.
اترك تعليقا اترك تعليقا

اترك تعليقاً إلغاء الرد

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

شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
شرح الـ Event Loop في Flutter وجعل التطبيق لا يتوقف أبدًا
Tutorials
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
حل مشكلة التوافق بين Java و Kotlin و Gradle في فلاتر
Tutorials
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
أفضل الـ Packages في Flutter لتسريع تطوير التطبيقات
Tutorials
طريقة انشاء المجلدات باستخدام Dart
طريقة انشاء المجلدات باستخدام كود Dart تلقائيًا
Tutorials

مقالات ذات الصلة

اطلع على المزيد من المقالات المتعلقة بهذا الموضوع!
شرح العوازل في لغة دارت (Isolates in Dart)
Dart

شرح العوازل في لغة دارت (Isolates in Dart)

8
شرح الـ Stream في لغة دارت (Stream in Dart)
Dart

الدرس 57: شرح الـ Stream في لغة دارت (Stream in Dart)

8
شرح عبارات async & await في لغة دارت (Dart)
Dart

الدرس 56: شرح عبارات async & await في لغة دارت (Dart)

6
شرح مفهوم الـ Future في لغة دارت (Future In Dart)
Dart

الدرس 55: شرح مفهوم الـ Future في لغة دارت (Future In Dart)

6
شرح مفهوم الـ Asynchronous في لغة دارت (Dart)
Dart

الدرس 54: شرح مفهوم الـ Asynchronous في لغة دارت (Dart)

5
10 تمارين محلولة على Null Safety في لغة دارت Dart
Dart

الدرس 53: 10 تمارين محلولة على Null Safety في لغة دارت Dart

5
أظهر المزيد
شعار موقع عرب فلاتر شعار موقع عرب فلاتر

About US

Quick Links

  • خدماتنا
  • من نحن
  • اتصل بنا
  • اتفاقية استخدام
  • سياسة الخصوصية
© جميع الحقوق محفوظة موقع عرب فلاتر 2023
  • Dart
  • Widgets
  • Packages
  • Tutorials
  • Flutter Roadmap
  • تثبيت Dart
  • تثبيت Flutter
adbanner
تم اكتشاف مانع إعلانات
مرحبًا، يرجى إيقاف مانع الإعلانات. الإعلانات تُساهم في دعم موقعنا وتغطية جزء من تكاليف الاستضافة وتطوير المحتوى. شكرًا لتفهمك ودعمك.
Okay, I'll Whitelist
Welcome Back!

Sign in to your account

هل نسيت كلمة المرور؟