تعلّم البرمجة بلغة كوتلن (11): المتغيرات والقيم var & val

تعلّم البرمجة بلغة كوتلن (11): المتغيرات والقيم var & val
أستمع الى المقال

شرحنا في الدرس السابق، كيف يمكننا أن نقول مرحبًا بالعالم !Hello World عبر شفرة كوتلن بسيطة، تطبع لنا الكلمتين على شاشة الحاسب، عبر ارسال النص مباشرة إلى دالة الطباعة. ولكن يمكننا استخدام المتغيرات أيضًا ونجعل مترجم كوتلن يكتشف قيمة المتغير، باستخدم الرمز ($) داخل علامتي التنصيص. في هذا الدرس، سنستعرض المتغيرات وأهميتها في البرمجة وكيفية التعامل معها في لغة كوتلن.

ما هي المتغيرات Variables:

المتغير هو مؤشر يؤشر لقيمة معينة مخزنة في ذاكرة الحاسب. هذه القيمة، يمكن أن تكون سلسلة من المحارف Strings، أو رقمًا Number، أو أي نوع بيانات آخر (سنتحدث عن أنواع البيانات، في الدرس القادم). كل متغير له اسم (أو مُعرِّف Identifier) لتمييزه عن المتغيرات الأخرى، التي نعلنها داخل شفرتنا البرمجية.  بعد الإعلان عن المتغير، يمكننا الوصول إلى قيمته باستخدام اسمه.

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

كلمتي var و val:

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

  • كلمة val (اختصار لكلمة Value والتي تعني قيمة): متغير غير قابل لتغيير قيمته immutable variable. هذا يعني أن هذا المتغير ثابت ولن نستطيع تغيير القيمة التي أسندناها له عند إعلانه أول مرة.
  • كلمة var (اختصار لكلمة Variable والتي تعني متغير): متغير قابل لتغيير قيمته mutable variable. وهذا يعني، أننا نستطيع تغيير قيمة هذا المتغير لاحقًا داخل الشفرة لعدد لا نهائي من المرات عند الحاجة.

أي من الكلمتين تعلنان عن متغير Variable في كوتلن.

الإعلان عن المتغيرات:

بعد كتابة إحدى هاتين الكلمتين المفتاحيتين، نكتب اسم المتغير ومن بعده عامل الاسناد ( = ) – خلافاً للرياضيات، هذه العلامة تعني اسناد قيمة في البرمجة. أما علامة اليساوي، فتكتب هكذا: ( == ) في البرمجة. بعد كتابة عامل الاسناد ( = )، نكتب القيمة التي سيمثلها المتغير، كالتالي:

var/val identifier = initialization

كلمة مفتاحية var أو val، ثم اسم المتغير أو مُعرِّف، ثم علامة الاسناد =، وأخيرًا التهيئة وهي قد تكون قيمة نصية أو رقم أو حرف… الخ.

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

والآن، إذا أردنا طباعة كلمة Kotlin بدلًا عن كلمة World في برنامجنا من الدرس السابق، يمكننا الإعلان عن متغير، وليكن اسمه language. ثم علينا وضع الكلمة بين علامتي تنصيص هكذا: “Kotlin”، قبل إسنادها إلى المتغير المسمى language، كالتالي:

نحن هنا استخدمنا كلمة val، لأننا نريد من المتغير language أن تكون قيمته ثابتة. بمعنى أنه لاحقًا داخل الشفرة إذا أردنا تغيير القيمة التي يحملها المتغير إلى أي شيء آخر، كالتالي:

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

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

استخدام المتغيرات:

لطباعة مرحبًا كوتلن Hello, Kotlin بدلًا عن Hello, World، سنذهب إلى الوظيفة ()main ونعدل عليها، كالتالي:

كما قلنا سابقًا، أن البرنامج يبدأ عمله من الوظيفة ()main. وكل سطر برمجي نضعه داخل هذه الوظيفة، سيتم تنفيذه أولًا ثم الذهاب إلى السطر الذي يليه. في داخل الوظيفة أعلاه، أعلنا عن متغير ذا قيمة ثابتة وهي “Kotlin”. ثم في سطر الطباعة، والتي تقوم بها الوظيفة ()println، قمنا بتمرير قيمة نصية للوظيفة ()println ووضعنا بدل الكلمة الثانية في الجملة اسم المتغير language وعلى يساره الرمز ($).

في السطر الأول، سيخزن البرنامج القيمة “Kotlin” في الذاكرة ويضع لها مؤشر ويسميه language. وفي السطر الثاني عند إرسال النص إلى وظيفة الطباعة ()println، سيذهب البرنامج أولًا إلى الذاكرة وإيجاد قيمة language ثم وضعها بدلًا عن language$ الموجودة بين علامتي التنصيص. لماذا سيفعل البرنامج هذا ولا يرسل الجملة “Hello, $language!” كاملة كما هي؟

ستعامل كوتلن كل ما يوضع بين علامتي تنصيص، كنوع نصي. ولكن، حينما نضع العلامة $ قبل كلمة ما في لغة كوتلن، فهنا سيفترض مترجم كوتلن Kotlin Compiler، أن هذا اسم متغير. بالتالي، سيذهب إلى المكان المخصص لبرنامجنا في ذاكرة الحاسب الذي يعمل عليه، ويبحث عن قيمة المتغير language، ويعوض مكان المتغير بقيمته. فإذا لم يجد متغير باسم language، سيطبع الكلمة كما هي. شرح أوضح عن هذا الجزء، في درس القوالب النصية في كوتلن.

ويمكننا أيضًا إرسال كلمة “Kotlin” فقط إلى وظيفة الطباعة ()println. ولكن في هذه الحالة يمكننا وضع اسم المتغير كما هو، كالتالي:

السطر أعلاه سيطبع كلمة Kotlin فقط. نلاحظ أننا لم نضع العلامة $ ومع ذلك تم طباعة الكلمة Kotlin وليس كلمة language. هذا لأننا وضعنا اسم المتغير بدون علامتي تنصيص. نحن نضع هذه العلامة قبل اسم المتغير، فقط إذا كان المتغير داخل علامتي تنصيص.

استخدام المتغير ذو القيمة المتغيرة var:

توفر لنا كوتلن كلمة var للإعلان عن متغير غير ثابت القيمة. يتيح لنا متغير var، بتغيير قيمته في أي مكان داخل شفرة البرنامج. بناءً على ذلك، إذا أردنا الإعلان عن متغير قيمته اسم يوم في الإسبوع، مثلًا يوم الجمعة Friday. ولاحقًا داخل شفرة البرنامج نريد إسناد يوم إسبوعي آخر كقيمة لهذا المتغير، فسنكتب الشفرة كالتالي:

سيتم طباعة كلمة Friday. ويمكننا بالطبع تغيير قيمة هذا المتغير إلى يوم آخر كالتالي:

سيتم تنفيذ البرنامج وسيتم طباعة Thursday بدون أية مشاكل كما يظهر في الصورة التالية:

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

في هذه الحالة إما أن نعيد تعريف المتغير day بتغيير كلمة val إلى كلمة var، أو نحذف السطر الخامس صاحب المشكلة. ونلاحظ أيضًا، أننا لم نكتب كلمة var أو val عند إسناد الكلمة الجديدة Thursday للمتغير day. وذلك لأننا نستعمل كلمتي var و val، فقط عند بداية الإعلان عن المتغير.

تخزين أنواع مختلفة من القيم في المتغيرات:

عند تخزين كلمة “Kotlin” في متغير ما، فهذا أن يعني أن هذا المتغير تم تخزين قيمة نصية به. هذه القيمة النصية، هي عبارة عن سلسلة من المحارف، مثل أن K حرف و O حرف، الخ. لأن كلمة Kotlin عبارة عن سلسلة من الحروف. هذه السلسلة تسمى في البرمجة String.

بالطبع يمكننا تخزين محارف أخرى داخل سلسلة String أو حتى أرقام، وستعتبر أيضًا نوع نصي String، طالما أنها داخل علامتي تنصيص ( ” ” ).

ولكن يمكننا تخزين أنواع أخرى في المتغيرات، مثل أن نخزن حرف واحد فقط، أو الأرقام. عند تخزين الرقم في المتغير، يجب أن لا نضعه داخل علامتي تنصيص، وإلا سيعتبر نص String. أما بالنسبة لتخزين حرف واحد فقط، فيجب أن يوضع بين علامتي تنصيص مفردة ( ‘ ‘ ).

إسناد قيمة رقمية Number للمتغير:

للتوضيح أكثر، يمكننا الإعلان عن متغير يحمل قيمة رقمية، كالتالي:

أعلنا عن متغير وأسندنا له القيمة 15، ولكن قبل طباعة القيمة، اسندنا له قيمة مختلفة وهي 10. سيتنفذ البرنامج ويطبع القيمة 10 التي تم إسنادها آخر مرة عادي بدون مشاكل، وتضيع القيمة الأولى 15 بسبب أن المتغير number تركها وأصبح يؤشر على قيمة أخرى، لأننا أعلناه كمتغير var.

ولكن إذا فعلنا التالي:

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

إسناد حرف واحد Char للمتغير:

يمكننا إسناد حرف للمتغير كالتالي:

لن يتم تنفيذ هذا البرنامج. لماذا؟

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

إذًا، لمَ لمْ يتم تنفيذ السطر الأول وطباعة قيمته ثم التوقف عند السطر الثالث؟. ﻷن هذه هي طريقة عمل المترجم Compiler. وهو عكس المفسر Interpreter، يعمل المترجم على تجميع وترجمة كامل الشفرة، فإذا وجد خطأ يوقف تنفيذ البرنامج، وحينما لا يجد خطأ، ينفذ البرنامج. أما المفسر، والذي لو كانت كوتلن تستخدمه، لطبع الحرف في السطر الأول أولًا، ثم لأوقف تنفيذ البرنامج في السطر الثالث الذي به المشكلة. تحدثنا تفصيليًا عن الفروقات بين الإثنين في درس سابق.

أهمية كتابة اسماء ومُعرِّفات المتغيرات في كوتلن:

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

هذا التحذير لم يأتي من فراغ، بل ﻷن الإهمال في تسمية هذه المتغيرات، قد يعني في يومٍ ما، عدم فهمك لشفرتك التي كتبتها بنفسك، دعك من أن يفهمها مبرمج آخر يريد التعديل عليها. لتجنب ذلك، تم وضع قواعد متفق عليها لتسمية المتغيرات في لغة كوتلن.

قواعد تسمية المتغيرات في كوتلن:

  • أسماء المتغيرات في كوتلن حساسة لحالة الأحرف الإنجليزية. فكما نعرف، أن الأحرف في اللغة الإنجليزية لديها حالتان: الأحرف الكبيرة uppercase والأحرف الصغيرة lowercase. فمثلًا في مثالنا أعلاه، المتغير language مكتوب بأحرف صغيرة، فإذا حاولنا طباعته كالتالي:

هنا سيحدث خطأ. لأنه لا يوجد متغير معرف مسبقًا يبدأ بحرف (L) كبير. كوتلن لم تتعرف على هذا المتغير لأننا عرّفناها سابقًا على المتغير language بحروف صغيرة.

  • يمكن أن يتضمن كل اسم متغير أحرفًا وأرقامًا وشرطات سفلية ( _ ) فقط.
  • لا يسمح أن يبدأ اسم المتغير برقم.
  • لا يسمح أن يكون الاسم كلمة مفتاحية محجوزة في لغة كوتلن (مثل، var، val، fun).
  • إذا كان المتغير يتكون من أكثر من كلمة، لا يُسمح بالمسافات البيضاء في اسم المتغير. إذا كان لابد من وضع مسافة بين الكلمتين، يمكننا عندها وضعهما داخل هاتين العلامتين (` `) كالتالي:

طرق متفق عليها في كتابة أسماء المتغيرات:

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

  • إذا كان اسم المتغير كلمة واحدة فقط، من المفضل كتابته بأحرف صغيرة (كمثال – number ، language).
  • قلنا في فقرة قواعد كتابة الأسماء، أنهإذا كان اسم المتغير يتكون من عدة كلمات، يمكننا وضعه بين هاتين العلامتين (“). ولكن الأفضل كتابة الاسم بطريقة lowCamelCase، بحيث تكون الكلمة الأولى صغيرة، بينما تبدأ الكلمات الأخرى بحرف كبير (كمثال – programmingLanguage).
  • عدم البدء بأسماء المتغيرات بشرطة سفلية ( _ ). بالرغم من أن قواعد كوتلن تسمح بذلك، ولكن يفضل تجنبه.
  • اختيار أسماء ذات معنى للمتغيرات، كمثال، سيكون اختيار اسم لغة برمجة programmingLanguage أكثر منطقية من كلمة لغة language فقط، لمتغير نخزن فيه كلمة كوتلن.

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

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

هل أعجبك المحتوى وتريد المزيد منه يصل إلى صندوق بريدك الإلكتروني بشكلٍ دوري؟
انضم إلى قائمة من يقدّرون محتوى إكسڤار واشترك بنشرتنا البريدية.