الفرق بين final و const في لغة دارت Dart 4 - Programmer Tech
Dart and flutter

الفرق بين final و const في لغة دارت Dart 4

الثوابت const و final في لغة Dart

الفرق بين final و const في لغة دارت dart

نستخدم final و const عندما يكون لدينا قيمة ثابته لا تتغير ابداً فهو لن يبقي متغير لكن سوف يبقي قيمة final أو const بمعنى أنه لدينا مسمى وظيفي لا يتغير ابداً فنعينها على أنها final او const.

لكن الفرق بينهم هو أن final لا يتم حجز مساحة له في الذاكرة إلا عندما يتم تشغيله في البرنامج بعكس const بأنه مجرد إعطاءه قيمة يتم حجز مساحة له في الذاكرة.

في لغة Dart، التي تُستخدم بشكل أساسي لتطوير تطبيقات مُتعددة المنصات مثل Flutter، تتوفر كلمتين مفتاحيتين هما final و const، وكلاهما يُستخدم لتعريف الثوابت.

في لغة Dart، هناك اختلاف بين الكلمتين “final” و “const” وكلاهما يستخدم لتعريف المتغيرات ذات القيم الثابتة، ولكن لديهما بعض الاختلافات الهامة.

كلمة “final” تُستخدم لتعريف متغير لا يمكن إعادة تعيين قيمته بعد تعيينها لأول مرة. وبمعنى آخر، بمجرد تعيين قيمة لمتغير من النوع final، لا يمكن تغيير قيمته فيما بعد. ومع ذلك، يمكن أن يكون للكائن الذي يتم تعيينه إلى المتغير final حالة قابلة للتغيير. على سبيل المثال:

final int x = 5;
// يمكن تعيين قيمة x مرة واحدة فقط
// x = 10; // سيؤدي إلى خطأ

final List<int> numbers = [1, 2, 3];
// يمكن تغيير حالة الكائن الذي يتم تعيينه إلى المتغير numbers
numbers.add(4); // صحيح

من ناحية أخرى، كلمة “const” تُستخدم لتعريف متغير لا يمكن تعديل قيمته وأيضًا لا يمكن تغيير حالة الكائن الذي يتم تعيينه إليه. وبالإضافة إلى ذلك، يجب أن تكون القيمة المعينة لمتغير const ثابتة أثناء وقت الترجمة، ولا يمكن أن تتغير في وقت التشغيل. على سبيل المثال:

const int y = 10;
// لا يمكن تعيين قيمة جديدة لـ y
// y = 20; // سيؤدي إلى خطأ

const List<int> numbers = [1, 2, 3];
// لا يمكن تغيير حالة الكائن الذي يتم تعيينه إلى المتغير numbers
// numbers.add(4); // سيؤدي إلى خطأ

إذا كنت تحتاج إلى استخدام المتغيرات ذات القيم الثابتة في برنامجك، فيفضل استخدام “final” إذا كنت بحاجة إلى قيمة ثابتة يمكن تغيير حالة الكائن المعين لها، واستخدام “const” إذا كنت تحتاج إلى قيمة ثابتة لا يمكن تغييرها بأي شكل من الأشكال.

المتغيرات final في لغة Dart

كلمة (final) هي كلمة محجوزة في Dart و تعني أنّ هذا الشيئ أو المتغير الذي يتم تعريفه على أنه final هو شيئ منتهي لا يمكننا تعديل قيمته. و الدالة المعرفة من نوع final لا يمكننا تطبيق مبدأ Override على هذه الدالة و لا يمكننا تعديل قيمة المتغير المعرَّف من نوع final.

في لغة Dart، يمكن استخدام الكلمة المفتاحية “final” لتعريف المتغيرات ذات القيم الثابتة. إليك بعض النقاط المهمة حول المتغيرات final في Dart:

  1. قيمة ثابتة: المتغير final يتم تعيين قيمته مرة واحدة فقط، ولا يمكن تغيير قيمته بعد ذلك. في الوقت الذي يتم فيه تعيين القيمة للمتغير final، يجب أن يتم تحديدها.
  2. التأخير في التعيين: يمكن تعيين قيمة المتغير final في وقت التعريف أو في البنية التحتية، أي في البنية التحتية السفلى أو في الكائن الفرعي. لذلك، يمكن تعيين قيمة المتغير final في وقت التشغيل.
  3. القيمة الأولية: إذا لم يتم تعيين قيمة للمتغير final عند تعريفه، فإنه يتم تعيين قيمة افتراضية له بناءً على نوع البيانات الذي يحمله المتغير. على سبيل المثال، إذا كان المتغير final من نوع int، فسيتم تعيين قيمة افتراضية له بصفر.
  4. البنية التحتية السفلى: يمكن تعيين قيمة المتغير final في البنية التحتية السفلى، مثل في المبنى التكراري للحلقات أو الشروط. وبمجرد تعيين القيمة، لا يمكن تغييرها.
  5. الإلزام بالتهيئة: يجب أن يتم تهيئة المتغير final قبل استخدامه. يعني ذلك أنه يجب تعيين قيمة له قبل أن يتم الوصول إليه في الكود.

مثال

void main() {
  final int x = 5;
  final double PI = 3.14;
  final String message = 'Hello';

  print(x); // الناتج: 5
  print(PI); // الناتج: 3.14
  print(message); // الناتج: Hello

  final List<int> numbers = [1, 2, 3];
  numbers.add(4); // صحيح
  print(numbers); // الناتج: [1, 2, 3, 4]
}

في المثال أعلاه، يتم تعريف المتغيرات x وPI وmessage كمتغيرات final وتعيين قيم لها. يتم تهيئة المتغيرات قبل استخدامها ولا يمكن تغيير قيمها بعد ذلك. المتغير numbers هو قائمة final ويمكن تغيير حالتها عن طريق إضافة عناصر جديدة إليها.

  • تُستخدم لتعريف متغير يمكن تعيين قيمة له مرة واحدة فقط، وبعد ذلك لا يمكن تغيير قيمته.
  • يُمكن تعيين القيمة لمتغير final أثناء الوقت التنفيذي (runtime)، مثل من خلال البنية التحكمية (if، for، إلخ) أو الدوال.
  • لا يتم حساب قيمة المتغير final في وقت الترجمة (compile-time)، بل في وقت التنفيذ.

هل يمكنني استخدام final في أي جزء من الكود؟

يمكنك استخدام المتغيرات final في أي جزء من الكود بشرط أن يتم تهيئتها قبل استخدامها. يمكنك تعريف المتغيرات final في داخل الدوال، الصناديق (classes)، الطبقات (abstract classes)، الواجهات (interfaces)، الملفات، وأي سياق آخر.

فيما يلي بعض الأمثلة لاستخدام المتغيرات final في أجزاء مختلفة من الكود:

1 – داخل الدوال:

void main() {
  final int x = 5;
  print(x); // الناتج: 5
}

2 – داخل الكلاسات (classes):

class MyClass {
  final String name;

  MyClass(this.name);

  void printName() {
    print(name);
  }
}

void main() {
  final myObject = MyClass('John');
  myObject.printName(); // الناتج: John
}

3 – داخل الطبقات (abstract classes):

abstract class MyAbstractClass {
  final double value;

  MyAbstractClass(this.value);

  void printValue();
}

class MyClass extends MyAbstractClass {
  MyClass(double value) : super(value);

  @override
  void printValue() {
    print(value);
  }
}

void main() {
  final myObject = MyClass(3.14);
  myObject.printValue(); // الناتج: 3.14
}

4 – داخل الملفات:

final String message = 'Hello';

void printMessage() {
  print(message);
}

void main() {
  printMessage(); // الناتج: Hello
}

يجب أن تتأكد من تهيئة المتغيرات final قبل استخدامها في الكود، سواء كانت معرفة في نفس النطاق أو في نطاقات مختلفة.

ما هي الفائدة من استخدام final في لغة Dart؟

استخدام المتغيرات final في لغة Dart يوفر العديد من الفوائد والمزايا. إليك بعض الفوائد الرئيسية لاستخدام المتغيرات final:

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

هذه بعض الفوائد الرئيسية لاستخدام المتغيرات final في لغة Dart. يمكنك استخدامها لتحقيق الثبات والأمان وتحسين الأداء في برامجك.

هل يمكنني تعريف final داخل الدوال أيضًا؟

نعم، يمكنك تعريف المتغيرات final داخل الدوال في لغة Dart. عند تعريف متغير final داخل دالة، فإنه يتم تعيين القيمة لها مرة واحدة فقط ولا يمكن تعديلها بعد ذلك.

فيما يلي مثال يوضح تعريف متغير final داخل دالة:

void myFunction() {
  final int x = 5;
  print(x); // الناتج: 5
}

في المثال أعلاه، تم تعريف المتغير x كـ final داخل الدالة myFunction() وتم تعيين القيمة 5 له. يمكنك استخدام المتغير x داخل الدالة، ولكن لا يمكن تغيير قيمتها.

يمكن استخدام المتغيرات final داخل الدوال لعدة أسباب. قد تحتاج إلى استخدام قيم ثابتة أو غير قابلة للتغيير في سياق محدد داخل الدالة. يمكن أن تكون هذه القيم مفيدة للحسابات المؤقتة أو لتوفير القيم الثابتة لعمليات الحساب أو لتخزين البيانات المؤقتة.

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

الثوابت Const في لغة Dart

الثوابت (Constants) هي عبارة عن قيمة ثابتة و لا يمكن تغييرها بعد تعريفها في البرنامج و لا تتغير قيمتها طوال فترة تنفيذ البرنامج, و الثابت هو أشبه بذاكرة القراءة فقط و هذه القيمة للقراءة فقط, تكون الثوابت من نوع “عدد، حرف، نص أي int ,float ,char”.

في لغة Dart، تُستخدم الكلمة الأساسية “const” لتعريف الثوابت (constants). الثوابت هي متغيرات ذات قيمة ثابتة لا يمكن تغييرها أثناء تنفيذ البرنامج.

إليك بعض النقاط الهامة حول الثوابت في لغة Dart:

1 – تعريف الثابت: يمكنك تعريف الثوابت باستخدام الكلمة الأساسية “const” وتعيين قيمتها مباشرة. قيمة الثابت يجب أن تكون معروفة في وقت الترجمة.

const int x = 5;
const double pi = 3.14159;
const String name = 'John';
```

2 – استخدام الثوابت: يمكنك استخدام الثوابت في العديد من السياقات، مثل الحسابات الثابتة، تعريف القيم الثابتة للمتغيرات والمعاملات، وما إلى ذلك.

const double radius = 2.5;
const double area = pi * radius * radius;
```

3 – القيود في استخدام الثوابت: يوجد بعض القيود في استخدام الثوابت في لغة Dart. على سبيل المثال، قيمة الثابت يجب أن تكون معروفة في وقت الترجمة ولا يمكن تعيين الثوابت في وقت التشغيل أو بناءً على قيم محسوبة في وقت التشغيل.

4 – الثوابت المدمجة: لغة Dart توفر العديد من الثوابت المدمجة مثل double.infinity و double.nan و String.empty وغيرها. يمكنك استخدام هذه الثوابت المدمجة في برامجك.

const double infinity = double.infinity;
const bool isActive = true;
```

5 – استخدام الثوابت في أماكن أخرى: إلى جانب تعريف الثوابت المستقلة، يمكنك أيضًا استخدام الثوابت في سياق آخر، مثل القيم الثابتة للمتغيرات الثابتة في الصناديق والطبقات والواجهات.

class MyClass {
  static const int count = 10;
  // ...
}
```

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

  • تُستخدم لتعريف ثابت بقيمة ثابتة في وقت الترجمة.
  • يجب أن تكون القيمة المُخصصة لمتغير const معروفة وثابتة أثناء ترجمة البرنامج.
  • يمكن استخدام الثوابت const لإنشاء قيم ثوابت جديدة، ويمكن أيضًا استخدامها لتحسين أداء التطبيق.
  • يمكن استخدام الثوابت const لإنشاء تركيبات معقدة من القيم، مثل القوائم والخرائط والكلاسات.

ما هي الحالة التي يمكن تغييرها في “final”؟

في لغة Dart، المتغيرات التي تم تعريفها باستخدام الكلمة الأساسية “final” لا يمكن تغيير قيمتها بعد تعيينها لأول مرة. ومع ذلك، هناك حالة واحدة يمكن فيها تغيير قيمة المتغير final، وهي عند تعيين قيمتها في وقت التشغيل باستخدام متغير آخر.

في الحالة التالية، يمكن تغيير قيمة المتغير final عند تعيينه بواسطة متغير آخر في وقت التشغيل:

void main() {
  final int x = 5;
  final int y = x + 2;
  print(y); // الناتج: 7
}

في المثال أعلاه، تم تعريف المتغير x كـ final وتعيين القيمة 5 له. ثم تم تعريف المتغير y كـ final وتعيين قيمة x + 2 له. هنا، قيمة x تعرف في وقت التشغيل ويتم استخدامها لحساب قيمة y. وبالتالي، يمكن تغيير قيمة y في وقت التشغيل عند تغيير قيمة x.

ومع ذلك، يجب أن يتم تعيين قيمة المتغير النهائي (final) قبل استخدامها لأول مرة، وبعد ذلك لا يمكن تغييرها.

هل يمكن استخدام “final” و “const” في نفس الوقت في نفس البرنامج؟

نعم، يمكن استخدام كلمتي “final” و “const” في نفس الوقت في نفس البرنامج في لغة Dart. يمكنك استخدامهما لتعريف المتغيرات ذات القيم الثابتة وفقًا لاحتياجاتك.

في الواقع، هناك بعض الاختلافات في السياقات التي يُفضل فيها استخدام “final” أو “const”. على سبيل المثال، تُفضل استخدام “final” للقيم التي يتم تعيينها في وقت التشغيل، بينما يُفضل استخدام “const” للقيم التي يتم تعيينها في وقت الترجمة.

مثال

void main() {
  final int x = 5;
  const double PI = 3.14;

  print(x); // الناتج: 5
  print(PI); // الناتج: 3.14
}

في المثال أعلاه، يتم استخدام “final” لتعريف المتغير x وتعيين قيمة له في وقت التشغيل. يتم استخدام “const” لتعريف المتغير PI وتعيين قيمة له في وقت الترجمة.

يجب ملاحظة أن استخدام “final” و “const” في نفس الوقت يعتمد على السياق ومتطلبات البرنامج. قد يكون من المناسب استخدام “final” وحده أو “const” وحده على حسب الحالة التي تحتاج إليها في برنامجك.

Ahmedkaissar

من مصر من محافظة الجيزة مبرمج ويب و خبير أمن معلومات محب للتقنية و الأمن المعلوماتي مدرب للغات "Python,html, css, php, js, laravel"
زر الذهاب إلى الأعلى