تريد أن تعرف كل شيء. لغة كوتلين

أصبحت لغة برمجة Kotlin، التي طورتها شركة JetBrains في سانت بطرسبرغ، لغة التطوير الرسمية لنظام Android. تم الإعلان عن ذلك رسميًا في مؤتمر Google I/O. يرأس فريق Kotlin خريج جامعة ITMO أندريه بريسلاف. لماذا تحظى Kotlin بشعبية كبيرة لدى عملاق تكنولوجيا المعلومات من بين العديد من اللغات "الشابة" الأخرى، وكيف ولماذا تظهر لغات برمجة جديدة بشكل عام، اقرأ في تعليقات الخبراء ومجموعة معلومات ITMO.NEWS.

كيف يتم تطوير لغات البرمجة

وفقا لتقديرات مختلفة، هناك بالفعل أكثر من ألفي لغة برمجة مختلفة في العالم. يتم إصدار تحديثات مستمرة للغات القديمة، كما تظهر لغات جديدة. عندما لا يتغير بناء جملة اللغة، بل يصبح أكثر تعقيدًا وتوسعًا، يحتاج المطور فقط إلى القليل من التدريب لمواصلة الكتابة بلغته المفضلة. في بعض الأحيان يتغير هيكل اللغة نفسها، ثم يتعين على المبرمج في بعض الأحيان إعادة التعلم والتكيف مع اللغة المحدثة. عادة، يحدث الانتقال إلى بنية جديدة تدريجيا وفي أجزاء، أي أن 10-20٪ فقط من كود البرنامج يبدأ في الكتابة باستخدام اللغة الجديدة.

« لم يكن المبرمجون راضين تمامًا عن لغات C++ وJava، لأنها لغات معقدة جدًا، والأولى أصعب من الثانية. ولذلك ظهرت لغة سكالا التي يحبها الكثير من المبرمجين ولكنها أيضًا معقدة للغاية. إن خبرة JetBrains الواسعة في إنشاء أدوات تطوير البرامج لمختلف لغات البرمجة سمحت لها بإنشاء لغة Kotlin في سبع سنوات، وهي متوافقة تمامًا مع Java، ولكنها أبسط وأكثر ملاءمة منها. يتم تطوير لغات البرمجة باستمرار؛ ولم يعد أحد يضع على عاتقه مهمة صنع لغة عالمية. وعلى الرغم من ذلك، فإن كل لغة تكون أكثر فعالية في منطقة معينة يتم استخدامها فيها في أغلب الأحيان. بل إن هناك اتجاهًا في إنشاء اللغات عندما يتم تطويرها لمجال موضوعي معين"، علق رئيس قسم تكنولوجيا البرمجة في جامعة ITMO.


واليوم، تقوم بعض الشركات بتجميع تقييمات اللغة الخاصة بها. على سبيل المثال، تقوم شركة TIOBE، المتخصصة في تقييم جودة البرمجيات، بحساب مؤشر شعبية بعض اللغات شهريًا منذ عام 2001. تحتوي القائمة التي تم إنشاؤها على 50 سطرًا، ومن أجل إدراج لغة برمجة في الفهرس، يجب على المطورين كتابة خطاب مناسب للشركة. يعتمد الحساب على بيانات من 25 محرك بحث على الإنترنت. حتى الآن، تتصدر Java الترتيب بفارق كبير، تليها لغة C. وفي الوقت نفسه، يؤكد القائمون على القائمة أنه خلال العام الماضي، أصبحت كلتا لغتي البرمجة أقل شعبية بنحو 6٪. وفي الوقت نفسه، يوضح TIOBE أن لغة C كانت اللغة رقم 1 حتى عام 2002، وكانت Java في المركز الرابع عشر في عام 1997، ولكن بعد خمس سنوات حلت محل لغة C في المركز الأول.

يمكنك إلقاء محاضرة ممتازة عن تاريخ تطور اللغات: يتحدث أمين البرامج الأكاديمية في ياندكس، ومدير مركز المسابقات الطلابية في كلية علوم الكمبيوتر في المدرسة العليا للاقتصاد، عن كيفية عمل لغات C ظهرت PHP وRuby وJava. ميخائيل جوستوكاشين. ويؤكد المحاضر على ضرورة اختيار لغة برمجة مختلفة لكل مهمة. على سبيل المثال، يقول إنه بالنسبة للصناعة العسكرية، من الأفضل الكتابة بلغة باسكال القديمة - وهي اللغة التي ولدت في عام 1970! لماذا؟ لأنه أكثر موثوقية. يمكن كتابة تطبيقات الأعمال بلغة Java لأن هذه اللغة موثوقة أيضًا، ولكنها أسهل في الاستخدام. ويؤكد الخبير أيضًا على أهمية الحفاظ على الاهتمام باللغة بين المبرمجين من خلال إنشاء مجتمع من المطورين الذين يكتبون بهذه اللغة. إذا تم إنشاء بنية تحتية حول لغة جديدة وتجمع الناس لاستخدامها، عندها فقط ستصبح اللغة شائعة. بالمناسبة، اعتمد مطورو Kotlin أيضًا هذه الإستراتيجية.

قليلا عن كوتلين

بدأ تطوير لغة برمجة Kotlin في شركة JetBrains في سانت بطرسبرغ في عام 2010. تم إصدار الإصدار الرسمي للمنتج في عام 2016. حصلت اللغة على هذا الاسم تكريما للجزيرة الواقعة في خليج فنلندا والتي تقع عليها كرونستادت. وفي صدفة مثيرة للاهتمام، فإن اسم لغة جافا الشهيرة هو أيضًا اسم جزيرة في إندونيسيا. ربما لم تكن المصادفة عرضية. كما هو مذكور في البيان الصحفي، يجب أن تعمل Kotlin أينما تعمل Java، وكان أحد الأهداف هو إنشاء منتج يمكن استخدامه في المشاريع المختلطة التي يتم إنشاؤها بعدة لغات.


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

« أدوات التطوير، بما في ذلك لغات البرمجة، تتطور باستمرار. تختلف اللغات عن الأدوات الأخرى من حيث صعوبة تطويرها تطوريًا. يجب أن يدعم الإصدار الجديد من اللغة جميع البرامج الموجودة. وهذا يحد من إمكانيات تطوير اللغات الموجودة ويخلق الحاجة إلى ظهور لغات جديدة. العامل الذي يحدد نجاح أي لغة برمجة جديدة هو في المقام الأول راحة المطورين. بالإضافة إلى كونها موجزة ومعبرة، فإن Kotlin متوافقة بشكل كبير مع كود Java: يمكنك استخدام جميع المكتبات الموجودة وحتى مزج التعليمات البرمجية بلغتين في مشروع واحد، لذلك لا توجد صعوبات خاصة في الانتقال"، علق مدير مشروع Kotlin في JetBrains، وهو خريج جامعة ITMO.

لماذا أحب جوجل Kotlin؟

على الموقع الرسمي، كتب مطورو Android أنهم لاحظوا "صعود" Kotlin في السنوات الأخيرة. لا يخجل موظفو Google من وصف اللغة بأنها مثيرة للإعجاب وموجزة وتمكينية وممتعة للعمل معها. لقد زادت الإنتاجية: رمز البرنامج فيه أقصر بنسبة 40٪ في المتوسط ​​من اللغات الأخرى، كما يسمح لك Kotlin أيضًا بتجنب بعض الأخطاء في الكود. كان أحد العوامل المحددة لشعبية Kotlin في Google هو توافقها مع Java، والتي تُستخدم بالفعل في تطوير تطبيقات Android.

الآن، عندما يبدأ المبرمجون في إنشاء تطبيق جديد في بيئة تطوير Android Studio الرسمية، يمكنهم على الفور تمكين المكون الإضافي "دعم Kotlin". يمكنك أيضًا تحويل أسطر التعليمات البرمجية التي تم إنشاؤها بالفعل بلغات أخرى إلى لغة Kotlin، وإدراج كتل في لغات أخرى في أسطر من التعليمات البرمجية في Kotlin. في المستقبل، سيتم تطوير المزيد من المكتبات والأدوات للغة، وسيتم تطوير المزيد من المواد التدريبية، وسيكون من الأسهل إيجاد حلول للمشاكل المحتملة.

« أدى عدم وجود ضمانات لدعم اللغة من Google إلى تثبيط العديد من المطورين عن التحول إلى Kotlin. حتى لو كنت تحب اللغة حقًا،يفكر المبرمج دائمًا في خطر توقف هذه اللغة عن العمل في مرحلة ما. الآن هناك ضمان بأن Kotlin لن تتوقف عن العمل، ونتوقع أن يزداد عدد مستخدمي اللغة بشكل حاد. سيكون من الطبيعي أن نفترض أن العديد من الشركات ستتحول في النهاية إلى استخدام Kotlin بشكل كامل، على الرغم من أنه لا يوجد شيء يجبرها على القيام بذلك من الناحية الفنية، فهي ببساطة مسألة تفضيل."- أكد أندريه بريسلاف.

وأضاف أن Kotlin يتم تطويره بنشاط كبير. يعمل فريق التطوير حاليًا على نظام البناء، وسرعة التجميع، وتحسين أداء IDE، وإضافة ميزات جديدة إلى مجموعة الأدوات، بما في ذلك تلك المتعلقة بالتكامل في Android Studio. يجري العمل أيضًا على مشاريع متعددة المنصات (القدرة على تجميع نفس الكود لعدة منصات)، وهناك عدد من التحسينات اللغوية في مرحلة التصميم.


وأكدت Google أيضًا أنها مستوحاة من مفهوم لغة Kotlin، والتي بموجبها كانت دائمًا وستظل مجانية للمطورين، أي مشروع مفتوح المصدر. وهذا يعني أن اللغة ليست مرتبطة بأي شركة معينة، ويتم توزيع كود المصدر بموجب ترخيص مجاني. يمكنك تنزيل المنتج. لدعم تطوير Kotlin، ستقوم Google وJetBrains بإنشاء شراكة غير ربحية. أيضًا، كجزء من "مهمة" Android، من المهم جدًا أن يقوم مؤلفو Kotlin بإنشاء مجتمع من الأشخاص حول منتجهم والذين يشاركون بشكل احترافي في تطوير هذه اللغة ويحبون مشاركة تجربتهم. على سبيل المثال، في شهر نوفمبر، سيتم عقد مؤتمر Kotlin في الولايات المتحدة، ويمكن للمطورين أيضًا تلقي الأخبار والنصائح اليومية حول منتج البرنامج والالتقاء محليًا.

بالمناسبة، تم تطوير مشروع Android Studio نفسه على أساس بيئة تطوير البرامج IntelliJ IDEA، والتي تم إنشاؤها أيضا بواسطة JetBrains. لكن على الرغم من التعاون الوثيق، تؤكد شركة سانت بطرسبرغ أنه لا يوجد أي حديث عن بيع JetBrains لشركة تكنولوجيا المعلومات الأمريكية العملاقة. وفي الوقت نفسه، لن يتم تصميم Koltin لنظام Android فقط. هدف الشركة هو جعل لغة البرمجة مناسبة لمنصات التطوير المختلفة.

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

07.11.2011 أندريه بريسلاف

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

يعود تاريخ تطور اللغات "البديلة" على منصة جافا إلى أكثر من عقد من الزمن، لكن مثل هذه اللغات لم تنتشر على نطاق واسع إلا في الآونة الأخيرة نسبيًا. ارتفعت شعبية JRuby وGroovy وClojure مع اللغات المكتوبة ديناميكيًا، بينما تشمل اللغات المكتوبة بشكل ثابت Scala وFantom وGosu. لغة Java نفسها أيضًا لا تقف مكتوفة الأيدي، ولكن تطورها معقد بسبب الحاجة إلى الحفاظ على التوافق مع الإصدارات السابقة، والمصير الصعب لشركة Sun Microsystems، التي استوعبتها شركة Oracle Corporation.

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

بدأ تطوير مشروع Kotlin في صيف 2010، وفي يوليو 2011، تم الإعلان عن المشروع رسميًا ونشر وصف للغة على الموقع الإلكتروني. ومن المقرر إصدار نسخة تجريبية عامة من المترجم في أوائل عام 2012.

عند إنشاء اللغة، استرشدنا بعدد من المتطلبات التي تبدو الأكثر أهمية لمثل هذا المشروع.

متوافق مع جافا.منصة Java تأتي أولاً النظام البيئي: بالإضافة إلى منتجات Oracle "الرسمية"، فهي تتضمن العديد من المشاريع مفتوحة المصدر: مكتبات وأطر ملفات تعريف مختلفة، والتي يتم على أساسها إنشاء عدد كبير من التطبيقات. لذلك، بالنسبة للغة التي تم تجميعها لهذا النظام الأساسي، يعد التوافق مع التعليمات البرمجية الموجودة المكتوبة بلغة Java أمرًا مهمًا للغاية. في الوقت نفسه، من الضروري أن تتمكن المشاريع الحالية من التحول إلى اللغة الجديدة تدريجيًا، أي أنه ليس فقط كود Kotlin يجب أن يستدعي كود Java بسهولة، ولكن أيضًا العكس.

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

سرعة التجميع.تجعل عمليات التحقق الثابتة عملية البرمجة أسهل، ولكنها تبطئ عملية التجميع، وهناك توازن يجب تحقيقه. تُظهر تجربة إنشاء اللغات باستخدام نظام كتابة قوي (Scala هو المثال الأكثر وضوحًا) أنه ليس من السهل العثور على هذا التوازن: غالبًا ما يصبح التجميع طويلًا بشكل غير مقبول. بشكل عام، قد تبدو خاصية اللغة مثل وقت تجميع المشروع ذات أهمية ثانوية، ولكن في ظروف التطوير الصناعي، عندما تكون أحجام التعليمات البرمجية المترجمة كبيرة جدًا، يتبين أن هذا العامل مهم جدًا - بعد كل شيء، في حين أن بعد تجميع التعليمات البرمجية، لا يستطيع المبرمج في كثير من الأحيان مواصلة العمل. على وجه الخصوص، يعد التجميع السريع إحدى المزايا المهمة لـ Java مقارنة بـ C++، ويجب أن تحتفظ Kotlin بهذه الميزة.

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

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

دعم فعال.يستخدم المبرمجون الحديثون بنشاط الأدوات الآلية المختلفة، والمكان المركزي الذي يشغله بيئات التطوير المتكاملة(بيئة التطوير المتكاملة، IDE). تُظهر عقود من الخبرة في JetBrains أن بعض خصائص اللغة قد تجعل من الصعب دعم الأدوات. عند تطوير Kotlin، نأخذ هذه الحقيقة بعين الاعتبار وننشئ بيئة تطوير متكاملة (IDE). معًامع المترجم.

العناصر الأساسية للغة

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

يتم دمج الإعلانات في Kotlin في مساحات الأسماء(مساحة الاسم)، ويمكن الإعلان عن الوظيفة مباشرة داخل مساحة الاسم:

مساحة الاسممثال ( هزارالحد الأقصى (أ: إنت، ب: إنت) : إنت ( لو( عائد يعودب ) )

يسبق إعلان الوظيفة كلمة أساسية هزارويتم تحديد أنواع المعلمات بعد النقطتين التاليتين لاسم المعلمة. تتم الإشارة إلى نوع الإرجاع للدالة بالمثل. يتبع بناء الجملة هذا تقليد لغات "العالم الوظيفي" مثل ML وScala. إنه يجعل من السهل حذف التعليقات التوضيحية للكتابة إذا كان النوع ممكنًا تم سحبهبواسطة المترجم من السياق تلقائيا.

المتغيراتفي Kotlin، كما هو الحال في Scala، يتم الإعلان عنها باستخدام الكلمات الأساسية فال(المتغيرات غير القابلة للتغيير) و فار(قابل للتغيير):

فارمجموع الخطيئة: مزدوج = 0.0 ل(س في س س) { فالص = الخطيئة(س) الخطيئة += ذ )

في هذا المثال، تم حذف نوع المتغير غير القابل للتغيير y لأن المترجم يمكنه استنتاجه تلقائيًا من قيمة الجانب الأيمن من تعريف المتغير. يتم تحديد نوع المتغير القابل للتغيير sinSum بشكل صريح فقط لتوضيح بناء الجملة المناسب؛ لدى المترجم معلومات كافية لاستنتاج النوع في هذه الحالة أيضًا.

الطبقات.أداة التحليل الرئيسية في Kotlin، كما هو الحال في اللغات الشيئية الأخرى، هي الفئات. عند الإعلان عن فئة، تتم الإشارة إلى قائمة معلمات المُنشئ مباشرةً في الرأس:

فصل IntPair(x: Int, y: Int) (...)

يتم إنشاء مثيلات الفئة عن طريق استدعاء المنشئ مباشرة؛ الكلمة الرئيسية جديدفي كوتلين لا يوجد:

فال xy = IntPair(x, y)

يحتوي رأس الفصل أيضًا على قائمة المعلمات النموذجية(عام) بين قوسين و قائمة الأنواع الفائقةأي الأنواع التي ترث منها هذه الفئة مفصولة بنقطتين:

فصل MyList (الطول: Int): قائمة، قابلة للتسلسل (...)

سمات.يمكن أن يرث الفصل من فئة واحدة أو من عدة فئات سمات(سمة - حرفيا "ميزة مميزة"، ميزة). تشبه السمات الفئات من حيث أنها تحدد أيضًا الأنواع، ويمكن أن تحتوي أيضًا على وظائف الأعضاء، وترث من السمات الأخرى. والفرق الرئيسي هو أن السمات ليس لها مُنشئات، ونتيجة لذلك، لا يمكن أن يكون لها ولاية(مجالات). يمكننا القول أن السمات هي واجهات مألوفة في لغة Java؛ فقط الوظائف فيها يمكن أن يكون لها تطبيق. القيود المفروضة على السمات تتجنب الصعوبات المرتبطة بالميراث المتعدد الطبقات.

وظائف خارجية.هناك آلية أخرى لأنواع "التوسيع" في Kotlin وهي الوظائف الخارجية (وظيفة الامتداد). يمكن الإعلان عن مثل هذه الوظائف خارج الفصل الدراسي ولا يزال يتم استدعاؤها كما لو تم الإعلان عنها داخل الفصل. فيما يلي مثال لإعلان دالة خارجية للنوع Int:

هزار Int.abs() : كثافة العمليات ( لو(هذاالعودة -هذا آخر إرجاع هذا }

تتم الإشارة إلى النوع الذي تمتد إليه وظيفة معينة قبل اسمها ويتم فصله بنقطة. يتوافق هذا مع إعلان المعلمة "الضمنية"، والتي تتم الإشارة إليها داخل الوظيفة بواسطة الكلمة الأساسية هذا. على سبيل المثال، في مثالنا، تعمل الدالة abs() على توسيع النوع Int والمعلمة الضمنية هذاهو عدد صحيح. يمكن استدعاء مثل هذه الوظيفة باستخدام عملية "النقطة"، تمامًا مثل وظائف أعضاء الفئة:

فالس = (-1). القيمة المطلقة ()

يسمح لك بناء الجملة هذا بتنفيذ الحد الأدنى من الوظائف الضرورية فقط في الفئات دون الإضرار بسهولة قراءة البرنامج.

ربط الوظائف الخارجية بشكل ثابتأي أنها ليست افتراضية.

جمل التحكم. متى

تدعم Kotlin بنيات التحكم التقليدية للغات الحتمية لو, لو بينماوالتي لن نتناولها بالتفصيل وكذلك التصميم متى- عملية التفرع والتي يمكن اعتبارها نسخة موسعة من المشغل التقليدي يُحوّل:

متى(خ) ( 1 => طباعة("واحد") 2, 3 => طباعة("اثنان أو ثلاثة") آخر=> طباعة ("رقم غير معروف"))

على يسار العلامة "=>" يوجد تعبير أو قائمة تعبيرات مفصولة بفواصل تسمى حالة. لو دعوىتصميمات متى(في مثالنا المتغير x) يساوي واحدًا على الأقل من هذه التعبيرات، ويتم تنفيذ نص هذا الشرط، أي التعبير أو الكتلة المشار إليها على يمين علامة "=>". ويتم فحص الشروط بشكل تسلسلي، من الأعلى إلى الأسفل. إذا لم يتم استيفاء أي من الشروط، فسيتم تنفيذ الكود المحدد بعد الكلمة آخر. على عكس يُحوّل، استخدام متىالشروط ليست تسميات، لذلك ليست هناك حاجة لإنهاء نص الشرط بالكلمة استراحة.

بالإضافة إلى مقارنة بسيطة للمساواة، متىيسمح لك بالتحقق مما إذا كانت الوسيطة تنتمي إلى مجموعة باستخدام العملية في:

متى(خ) ( فيمجموعة => طباعة ("في المجموعة") في 1..10 => طباعة("1..10") آخر=> طباعة ("الفرع الافتراضي"))

بعد الكلمة المفتاحية فيتم تحديد تعبير من أي نوع يدعم الطريقة التي تحتوي على (). على وجه التحديد، يمكن تحديد مجموعة (كما في الشرط الأول في هذا المثال) أو فاصلة(كما في الثانية). يمكن تشكيل الفجوات إما بأعداد صحيحة أو كسور، مع تضمين القيم المتطرفة (في هذا المثال 1 و10).

يتم تمييز نوع آخر من الشروط بالكلمة الأساسية ويسمح لك بالتحقق من نوع الوسيطة. على سبيل المثال، يمكنك التحقق من الأنواع العديدة التي تنتمي إليها القيمة x كما يلي:

متى(خ) ( يكونسلسلة => برينتلن ("سلسلة") يكونإنت => برينتلن ("إنت") يكونالمصفوفة => println("مصفوفة مزدوجة"))

نوع النظام

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

هزار isEmpty(s: String?): منطقية (...)

علامة الاستفهام بعد اسم النوع (سلسلة) تعني أن المرجع يشير إلى كائن من فئة السلسلة أو الأمور باطل . يجب أن تكون نتيجة الدالة isEmpty بدورها قيمة منطقية ولا يمكن أن تحتوي على قيمة باطل، لأن النوع المقابل لم يتم توضيحه بعلامة استفهام.

يعود s.length() == 0 // خطأ: مرجع مرجعي فارغ

تحتاج إلى التحقق بشكل صريح مما إذا كان s يشير إلى كائن موجود:

أنا F (ق!= باطل) { يعود s.length() == 0 // s يشير بالضبط إلى كائن موجود) آخر{ العودة صحيحا} يعود(ق == باطل) || s.length() == 0//المشغل||يوفر التحقق

غالبًا ما تكون هناك سلاسل طويلة من المكالمات، يمكن لكل منها الرد باطل. والنتيجة هي عدة شروط متداخلة تتحقق من ما تم إرجاعه من كل مكالمة في السلسلة. لتجنب فوضى التعليمات البرمجية، تدعم Kotlin عامل التشغيل مكالمة آمنة، يُشار إليه بـ "؟":

أ؟.getB()?.getC()?.getD()

إذا لم يكن متساويا باطل، فإن التعبير a?.getB() يُرجع a.getB()، وإلا - باطل.

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

فالس: الكائن = ... لو(x عبارة عن سلسلة) ( print(x.length())) )

يختبر هذا المثال المرجع x لمعرفة ما إذا كان عبارة عن سلسلة، وإذا نجح الاختبار، فسيتم طباعة طول السلسلة. عندما يتم استدعاء length()، يقوم المترجم تلقائيًا بإدراج مجموعة من x إلى السلسلة لأنها آمنة في تلك المرحلة من البرنامج.

يعمل صب النوع التلقائي لجميع الشروط: لو, متى, بينما، ||، && الخ.

وظائف النظام الأعلى

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

كونها لغة موجهة للكائنات، تدعم Kotlin مع ذلك وظائف ذات ترتيب أعلى. هذا يعني في المقام الأول أن الوظيفة في Kotlin يمكن أن تكون كذلك معنى، وجود النوع المقابل:

فالفاعل: هزار(س: كثافة العمليات): منطقية =...

في هذا المثال، المتغير المسند لديه النوع الوظيفي « هزار(x: Int): Boolean"، مما يعني أن القيمة التي تخزنها هي دالة تأخذ معلمة عددية وترجع قيمة منطقية. على وجه التحديد، يمكننا أن نطلق على هذه الوظيفة:

فالنعم أو لا = المسند (1)

يمكن استخدام هذه الدالة، على سبيل المثال، عند تصفية مجموعة من الأعداد الصحيحة:

هزارالمجموعة .intFilter(المسند: هزار(x: Int): منطقية): المجموعة (...)

وبالنسبة للمجموعات العشوائية، يمكنك تعميمها باستخدام معلمات عامة:

هزارمجموعة .filter(المسند: هزار(x: T) : منطقية) : المجموعة ( فالالنتيجة = قائمة المصفوفة () ل(x في هذا) إذا (المسند (خ)) النتيجة. أضف (خ) يعودنتيجة)

(هذا مجرد تطبيق ساذج للدالة filter(). والتنفيذ الأكثر واقعية سيتطلب تقييمًا كسولًا، لكن هذا خارج نطاق هذه المقالة.)

الشيء الأكثر إثارة للاهتمام هو كيفية تعيين قيمة الوسيطة ذات النوع الوظيفي. ولهذا سبق ذكره حرفيات الوظيفة:

Ints.filter((x => x % 2 == 0))

في هذا المثال، تعد وسيطة مرشح الوظيفة الخارجية () دالة حرفية، أي إعلان قصير للدالة. يجب أن تكون محاطة بأقواس متعرجة، وقبل الرمز "=>" هناك إعلانات للمعلمات، وبعد ذلك يوجد نص الدالة، ولا يلزم بيان الإرجاع، حيث يتم أخذ النتيجة بعين الاعتبار التعبير الأخيرفي جسد الحرف . لذلك سيتم تحديد ints من المجموعة أرقام زوجية فقط، لأن إرجاعنا الحرفي صحيح فقط إذا كان باقي x مقسومًا على 2 يساوي صفرًا.

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

لسهولة استخدام الدالة الحرفية في Kotlin، تم اعتماد القواعد النحوية التالية. أولاً، إذا كانت الدالة الحرفية تحتوي على معلمة واحدة بالضبط، فلا داعي للإعلان عن تلك المعلمة، وسيتم تسميتها تلقائيًا (ويُستنتج نوعها من السياق):

Ints.filter((it % 2 == 0)) // استدعاء مشابه للمثال السابق

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

Ints.filter (it % 2 == 0) // استدعاء مشابه للمثالين السابقين

يسمح لك بناء الجملة هذا بكتابة تحويلات المجموعة بأسلوب يذكرنا بـ LINQ:

Ints.select(it * it). حيث (it % 2 == 0) // من بين مربعات عناصر المجموعة // حدد العناصر الزوجية

(هنا تقوم وظيفة Where() بنفس وظيفة وظيفة التصفية().)

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

هزارمتزامن (ل: القفل، الجسم: هزار() : ت) : ت ( l.lock() يحاول{ يعودجسم()) أخيراً( l.unlock() ) )

من أجل استدعاء جزء من التعليمات البرمجية المتزامنة باستخدام هذه الوظيفة، فقط اكتب:

متزامن (myLock) (// الكود المطلوب تنفيذه)

يوضح هذا المثال كيف يمكنك في Kotlin استخدام اللغة للتعبير عن بنية مضمنة في Java.

اللغات الخاصة بالمجال

ذكرنا في المقدمة المكتبات التي يشبه العمل معها استخدام اللغات الخاصة بالمجال، أي اللغات "الصغيرة"، كما لو كانت مدمجة في Kotlin. على سبيل المثال سيكون مكتبة لوصف وحداتأي وحدات التجميع المستخدمة في لغتنا. تم وصف الوحدة البرنامج النصي للتجميع- برنامج Kotlin الذي يستدعي وظائف المكتبة القياسية؛ يتم تنفيذ هذا البرنامج النصي في وقت الترجمة. دعونا نلقي نظرة على مثال لبرنامج نصي للبناء:

فال homeDir = "..." الوحدة النمطية("org.jetbrains.test") (// يعتمد إعلان الوحدة النمطية(MavenRepo(" [البريد الإلكتروني محمي]")) // التبعية importNamespace("java.lang") // الاستيراد الافتراضي importNamespace("org.junit") // الاستيراد الافتراضي sourceRoot("$homeDir/src") // المسار إلى الملفات المصدر testSourceRoot(" $homeDir / الاختبارات") // المسار إلى الاختبارات )

على الرغم من أن هذا برنامج Kotlin عادي، إلا أنه يبدو وكأنه برنامج بلغة متخصصة مصممة للوصف التعريفي للوحدات النمطية. يحظى هذا الأسلوب في وصف هياكل البيانات بشعبية كبيرة في لغة Groovy واللغات الديناميكية الأخرى، لأنه يتجنب الواصفات المرهقة وصعبة القراءة المكتوبة بلغة XML. في Groovy، يُعرف هذا الأسلوب باسم Builders. ومن الأمثلة الصارخة على استخدامه مكتبة Gradle.

بالمقارنة مع Groovy واللغات الديناميكية الأخرى، فإن الاختلاف المهم بين DSL الداخلية لـ Kotlin هو أنه، مع الحفاظ على نفس الإيجاز في بناء الجملة، فإن نظام الكتابة ضمانات ثابتةصحة البرنامج .

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

// وحدة مجردة فئة مجردةالوحدة النمطية (الاسم: سلسلة) ( فالالتبعيات: List = ArrayList() ) // وحدة تتكون من فئات مكتوبة بلغة Kotlin فصل KotlinModule (الاسم: سلسلة) : الوحدة (الاسم) ( هزارالتبعية (الوحدة النمطية: الوحدة النمطية) ( التبعية. إضافة (الوحدة النمطية)) ) // الوحدة المستندة إلى مستودع Maven فصل MavenRepo(الاسم: سلسلة): الوحدة النمطية(الاسم) (...)

دعونا نحدد وظيفة الوحدة النمطية () التي تنشئ وحدة نمطية جديدة:

هزارالوحدة النمطية (الاسم: سلسلة، الحرف الأول: هزار KotlinModule.() : الوحدة): KotlinModule ( فالالنتيجة = KotlinModule(الاسم) result.init() يعودنتيجة)

هذه الوظيفة هي وظيفة ذات ترتيب أعلى، لأن المعلمة init هي في حد ذاتها وظيفة، و خارجيالوظيفة: تتم الإشارة إلى ذلك من خلال نوع KotlinModule المحدد قبل قائمة المعلمات (الفارغة) في نوع الوظيفة. هذا يعني أنه يمكن استدعاء الدالة ()module على النحو التالي:

الوحدة النمطية ("org.jetbrains.test") (// نص الدالة init)

وهذا مشابه لسيناريو المثال الذي رأيناه بالفعل. لاحظ أن هناك معلمة ضمنية متاحة ضمن دالة حرفية هذااكتب KotlinModule (نظرًا لأن هذا الحرفي من النوع "وظيفة خارجية") ويمكننا استخدامه:

الوحدة النمطية ("org.jetbrains.test") ( هذا.التبعية (مافينريبو(" [البريد الإلكتروني محمي]")) هذا.dependency(anotherModule) // ... )

يبقى أن نلاحظ ذلك هذا، كالعادة، يمكن حذفها، وسنحصل على نفس بناء الجملة تمامًا كما في مثال البرنامج النصي الوارد في بداية هذا القسم:

الوحدة النمطية("org.jetbrains.test") (التبعية(MavenRepo(" [البريد الإلكتروني محمي]")) التبعية (وحدة أخرى) // ... )

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

Html ( head ( title (+"تشفير XML مع Kotlin") ) الجسم ( h1 (+"تشفير XML مع Kotlin") p ( +"هذا بعض النص. لمزيد من المعلومات، راجع" a(href = "http:// jetbrains.com/kotlin") (+"صفحة Kotlin الرئيسية") ) )

لقد نظرنا إلى بعض الميزات الأكثر إثارة للاهتمام في لغة Kotlin، لكننا أهملنا ميزات اللغة مثل الأنواع العامة، والوظائف المضمنة، وتمثيل الأنواع في وقت التشغيل (النوع المُعاد)، ودعم التفويض، وتجاوز عامل التشغيل، وما إلى ذلك. وكذلك سير العمل في المشروع، يمكن قراءته على صفحة المشروع.

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

الأدب

  1. بلوخ ج. جافا الفعالة. الطبعة الثانية. - برنتيس هول، 2008.
  2. Gamma E.، Helm R.، Johnson R.، Vlissides J. تقنيات التصميم الموجهة للكائنات. أنماط التصميم. - سانت بطرسبورغ: بيتر، 2007.
  3. Troelsen E. C# 2008 لغة البرمجة والمنصة. صافي 3.5. - م: ويليامز، 2010.

إلا في حالات التجميع المنفصل غير المتناسق. - ملحوظة مؤلف.

تسمح لك العملية أيضًا بذلك نمط مطابقة(مطابقة النمط) - تقريبًا. مؤلف.

أندريه بريسلاف ([البريد الإلكتروني محمي]) - المطور الرائد للغة Kotlin، شركة JetBrains.



في عام 2010، شرعت مجموعة من المطورين من الفرع الروسي لشركة JetBrains في تطوير لغة أكثر ملاءمة وأمانًا للكتابة من Java، ولكنها ليست معقدة مثل Scala. تم إعطاء اسم هذه اللغة تكريما لجزيرة كوتلين، الواقعة في خليج فنلندا (عن طريق القياس مع جافا، والتي سميت أيضا باسم الجزيرة).

إذا نظرت إلى أي نظرة عامة حديثة على لغات البرمجة الواعدة، بما في ذلك، فستجد بالتأكيد Kotlin هناك. ما هو جوهر هذه اللغة، ولماذا يحبها الجميع كثيرًا، وما هي الآفاق التي تتمتع بها - المزيد عن ذلك لاحقًا.

بناء الجملة

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

في الوقت نفسه، يجب أن أقول إن Kotlin، من حيث التسجيل، عاد قليلا إلى أسلوب باسكال - وهنا يسود الوضوح على وضوح الهياكل. يمكنك قراءة المزيد عن هذا في هذه المقالة القصيرة. فهو يغطي فقط المبادئ الأساسية لبناء لغات Java وKotlin، لذلك سيكون مفهومًا للجميع تمامًا.

ومع ذلك، سنظل نترك جزءًا صغيرًا من التعليمات البرمجية:

المرح الرئيسي (الوسائط: Array ) {
نطاق فال = "العالم"
println("مرحبًا، النطاق $!")
}

إدخال بسيط للغاية يجب أن يكون مفهوماً لأي شخص درس البرمجة في المدرسة أو الجامعة لمدة عام على الأقل.

من المهم الإشارة إلى أن Kotlin متوافق تمامًا مع Java. ولهذا السبب تم اعتباره في البداية بمثابة سكر نحوي بسيط، يستخدم في المهام المعقدة حيث يريد المرء ببساطة توفير الوقت والجهد.

مزايا

بشكل عام، جميع المزايا مقارنة بـ Java قد تم ذكرها بالفعل، لذلك سنجمعها في مكان واحد فقط:

    حجم الكود. يؤدي عدم استخدام أجزاء قديمة غير ضرورية من التعليمات البرمجية إلى تسريع عملية التطوير وزيادة إمكانية القراءة؛

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

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

عيوب

باعتبارها لغة تم تطويرها استنادًا إلى Java، فإن Kotlin لديها عيبان واضحان بالمقارنة: السرعة والتفصيل. في الحالة الأولى، كل شيء واضح: العمل على JVM من الصعب التغلب على Java من حيث الأداء. المشكلة الثانية بعيدة المنال بعض الشيء بالنسبة لمثل هذه اللغة الشابة، لأنها متداولة رسميًا منذ ما يزيد قليلاً عن عام. نعم، هناك عدد أقل بكثير من الأدوات والمكتبات الموجودة في Java. ولكن، أولاً، هذا ليس بالغ الأهمية بعد، وثانيًا، في عالم Java، لم تُترجم الكمية دائمًا إلى جودة.

تتعامل Kotlin حاليًا مع مهامها الرئيسية، ويساعد التوافق الكامل مع Java على إغلاق أعيننا عن هذه الفجوات.

الآفاق

على الرغم من أن تطوير Kotlin بدأ في عام 2010، تم إصدار النسخة الرسمية الأولى فقط في فبراير 2016. ومنذ ذلك الحين، كان الطلب على اللغة ينمو بسرعة، وفي تصنيف TIOBE، اقتحمت TOP-50 في غضون عام ، وفي الشهر الماضي في مؤتمر Google I /O أعلن عن الدعم الرسمي لـ Kotlin في نظام تطوير تطبيقات Android.

بالنظر إلى الشعبية الكبيرة لـ IntelliJ IDEA بين المطورين والتركيز الاستراتيجي للشركة على Kotlin، يمكننا أن نقول بثقة أنه خلال 3-4 سنوات سنراها بين المنافسين الكاملين لـ Java وSwift في مجال تطوير الأجهزة المحمولة. بالإضافة إلى ذلك، إذا لم يشعر مبدعو اللغة بخيبة أمل في منتجهم، فمن المؤكد أن Kotlin ستستمر في استكشاف آفاق أخرى بجدية: الويب، والذكاء الاصطناعي، وإنترنت الأشياء، والبيانات الضخمة، وتطبيقات سطح المكتب.

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

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

حول المشروع

منذ وقت ليس ببعيد، أعلنت شركة JetBrains، وهي شركة متخصصة في إنشاء بيئات التطوير، عن منتجها الجديد - لغة البرمجة Kotlin. ضربت الشركة موجة من الانتقادات: اقترح النقاد أن تعود الشركة إلى رشدها وتكمل البرنامج المساعد لـ Scala، بدلاً من تطوير لغتها الخاصة. يفتقر مطورو Scala حقًا إلى بيئة تطوير جيدة، لكن مشاكل مطوري المكونات الإضافية مفهومة: Scala، الذي ولد بفضل باحثين من سويسرا، قام بدمج العديد من المفاهيم والأساليب العلمية المبتكرة، مما جعل إنشاء أداة تطوير جيدة مهمة صعبة للغاية . في الوقت الحالي، يعد قطاع اللغات الحديثة المكتوبة بشكل ثابت لـ JVM صغيرًا، لذا فإن قرار إنشاء لغتك الخاصة جنبًا إلى جنب مع بيئة التطوير الخاصة بها يبدو بعيد النظر للغاية. حتى لو لم تتجذر هذه اللغة في المجتمع على الإطلاق، فإن JetBrains تصنعها في المقام الأول لتلبية احتياجاته. يمكن لأي مبرمج Java فهم هذه الاحتياجات: تتطور Java كلغة ببطء شديد، ولا تظهر ميزات جديدة في اللغة (كنا ننتظر وظائف من الدرجة الأولى منذ عدة سنوات بالفعل)، والتوافق مع الإصدارات القديمة من اللغة يجعلها من المستحيل ظهور العديد من الأشياء المفيدة في المستقبل القريب (على سبيل المثال، تحديد معلمات النوع اللائق). بالنسبة لشركة تعمل على تطوير البرمجيات، فإن لغة البرمجة هي أداة العمل الرئيسية، وبالتالي فإن كفاءة اللغة وبساطتها هي مؤشرات لا تعتمد عليها سهولة تطوير الأدوات لها فحسب، بل تعتمد أيضًا على تكاليف برمجة المبرمج، أي مدى سهولة ذلك. يجب الحفاظ على هذا الرمز وفهمه.

عن اللغة

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

Fun foo(text:String) ( println(text.toLowerCase()) // NPE? No! ) val str:String? = فارغة // سلسلة؟ - نوع لاغٍ foo(str) //<- компилятор не пропустит такой вызов -- // тип str должен быть String, чтобы // передать его в foo

على الرغم من حقيقة أن هذا النهج يمكن أن ينقذ المبرمج من عدد من المشكلات المرتبطة بـ NPE، إلا أنه يبدو غير ضروري لمبرمج Java في البداية - سيتعين عليك إجراء عمليات فحص أو تحويلات غير ضرورية. ولكن بعد فترة من البرمجة في kotlin، والعودة إلى Java، تشعر أنك تفتقر إلى هذه المعلومات حول النوع، وتفكر في استخدام التعليقات التوضيحية Nullable/NotNull. تتعلق بهذا مشكلات التوافق مع الإصدارات السابقة مع Java - هذه المعلومات ليست موجودة في كود Java bytecode، ولكن على حد علمي، لا تزال هذه المشكلة في طور الحل، وفي الوقت الحالي جميع الأنواع القادمة من Java قابلة للإلغاء.

بالمناسبة، حول التوافق مع الإصدارات السابقة: يتم تجميع Kotlin في كود JVM bytecode (يبذل منشئو اللغة الكثير من الجهد للحفاظ على التوافق)، مما يسمح باستخدامها في نفس المشروع مع Java، والقدرة على استخدام Java بشكل متبادل وفئات Kotlin تمثل العتبة اللازمة لإدخال Kotlin في مشروع جافا كبير موجود ومحدود للغاية. في هذا الصدد، تعد القدرة على استخدام تطورات Java المتعددة عن طريق إنشاء مشروع بالكامل في kotlin أمرًا مهمًا. على سبيل المثال، كان من السهل جدًا بالنسبة لي إنشاء مشروع صغير يعتمد على Spring-webmvc.

دعونا نلقي نظرة على جزء وحدة التحكم:

Path(array("/notes/")) فئة وحدة التحكم NotesController (خاص autowired val NotesService: NotesService? = null path(array("all")) fun all() = render("notes/notes") ( addObject(" ملاحظات"، NoteService!!.all)) //... )

خصوصيات استخدام التعليقات التوضيحية في Kotlin مرئية: في بعض الأماكن لا تبدو أنيقة كما في Java (وهذا ينطبق على حالات خاصة، على سبيل المثال، مجموعة من عنصر واحد)، ولكن يمكن استخدام التعليقات التوضيحية ككلمات رئيسية "محلية الصنع" مثل كجهاز تلقائي أو وحدة تحكم (إذا حددت نوع الاسم المستعار عند الاستيراد)، ومن حيث الإمكانيات، تكون التعليقات التوضيحية أقرب إلى الفئات الحقيقية.

تجدر الإشارة إلى أن Spring لم يتمكن من تغليف فئات Kotlin لإدارة المعاملات - وآمل أن يكون هذا ممكنًا في المستقبل.

اللغة لديها دعم لوظائف من الدرجة الأولى. هذا يعني أن الوظيفة هي نوع مدمج في اللغة وله بناء جملة خاص. يمكن إنشاء الوظائف محليًا، وتمريرها كمعلمات إلى وظائف أخرى، وتخزين المراجع الخاصة بها:

Fun doSomething(thing:()->Unit) ( // أعلن عن معلمة من النوع دالة // ()-> الوحدة لا تقبل أي شيء و // لا تُرجع أي شيء مهم() // استدعاء ) doSomething() ( // وهنا ننشئ سريعًا دالة من النوع // ()->وحدة ونمررها إلى الدالة doShomething // إذا كانت الدالة هي المعلمة الأخيرة، فيمكنك // نقلها خارج أقواس الاستدعاء println("Hello World" ")))

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

هزار قائمة .filter(condition:(T)->Boolean):List (نتيجة فال = قائمة () for(item in this) ( if(condition(item)) result.add(item)) ) return result ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

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

ولتوضيح موضوع الفصول والإيجاز دعونا نلقي نظرة على الكود التالي:

// يصبح إنشاء فئات الفول // مقتضبًا، ويمكن الإعلان عن الحقول // مباشرة في فئة إعلان المُنشئ TimeLord(val name:String) // قد لا يحتوي الفصل على نص على الإطلاق فئة TARDIS(val Owner:TimeLord) fun main (الوسائط: صفيف ) ( val doctor = TimeLord("Doctor") val tardis = TARDIS(doctor) println(tardis.owner.name))

في بضعة أسطر، تمكنا من الإعلان عن فئتين، وإنشاء كائنين، وطباعة اسم مالك TARDIS! يمكنك ملاحظة أنه تم الإعلان عن الفئة باستخدام معلمات مُنشئها الوحيد الممكن، والذي يعد أيضًا إعلانًا لخصائصها. قصيرة للغاية، ولكنها غنية بالمعلومات. بالتأكيد سيكون هناك من يدين استحالة الإعلان عن أكثر من مُنشئ واحد، لكن يبدو لي أن هذا له براغماتية خاصة به - بعد كل شيء، تسمح لك العديد من المُنشئات في Java بإعلان المعلمات الافتراضية، والتي يدعمها Kotlin في اللغة المستوى، أو تحويل نوع إلى آخر، والذي ستعمل به هذه الفئة، ويمكن بالفعل ترك هذا بأمان لطريقة المصنع. انتبه إلى إعلان "المتغيرات" والحقول. يجبرنا Kotlin على الاختيار: val أو var . حيث يعلن val عن مرجع نهائي غير قابل للتغيير، ويعلن var عن متغير، مما يساعد على تجنب الاستخدام الواسع النطاق للمراجع القابلة للتغيير.

مثال

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

هذا ما أود أن يبدو عليه الاستخدام:

المرح الرئيسي (الوسائط: Array ) ( // إنشاء شجرة صغيرة val Tree= Tree("root") ( العقدة("1-1") ( العقدة("2-1") العقدة("2-2") ) العقدة("1-2" " ) (node("2-3") ) ) // اجتيازها وطباعة القيم إلى شجرة وحدة التحكم.traverse ( println(it)) ) )

الآن دعونا نحاول تنفيذ هذا. لنقم بإنشاء فئة عقدة شجرة:

/** * @param بيانات عقدة القيمة */ class Node (قيمة val:T) (// عقدة الأطفال Private val children:List > = arrayList() /** * الطريقة التي تنشئ وتضيف طفلًا إلى العقدة * @param قيمة قيمة العقدة الجديدة * وظيفة @param init لتهيئة العقدة الجديدة، اختيارية * المعلمة */ fun العقدة(القيمة: T، الحرف الأول: العقدة .()->الوحدة = ()):عقدة (عقدة فال = Node (قيمة) العقدة.init() children.add(node) عقدة الإرجاع ) /** * تعبر الطريقة بشكل متكرر جميع العقد الفرعية بدءًا من العقدة * نفسها، ويتم إخطار كل عقدة بالمعالج * @param معالج وظيفة المعالج لـ قيمة كل عقدة */ fun traverse(handler:(T)->Unit) ( Handler(value) children.forEach ( Child -> Child.traverse(handler) ) ) )

الآن دعونا نضيف وظيفة لإنشاء الجزء العلوي من الشجرة:

/** * إنشاء عقدة شجرة بقيمة قيمة وتهيئة * أبنائها باستخدام طريقة init. */ هزار الشجرة (القيمة: T، الحرف الأول: Node .()->الوحدة): العقدة (عقدة val = Node(value) // استدعاء أسلوب init الذي تم تمريره في المعلمة // على عقدة كائن كائن العقدة.init())

في مكانين من الكود، تم استخدام بناء مثل Node.()->Unit، معناه أنه من المتوقع وجود نوع دالة كمدخل، والذي سيتم تنفيذه كطريقة لكائن من النوع Node. من نص هذه الوظيفة، يمكنك الوصول إلى طرق أخرى لهذا الكائن، مثل طريقة Node.node()، والتي تتيح لك القيام بتهيئة الشجرة بشكل مشابه لتلك الموضحة في المثال.

بدلا من الاستنتاج

نظرًا لتوافقها الجيد مع Java والقدرة على استبدال التعليمات البرمجية القديمة تدريجيًا، يمكن أن تصبح Kotlin في المستقبل بديلاً جيدًا لـ Java في المشاريع الكبيرة وأداة ملائمة لإنشاء مشاريع صغيرة مع إمكانية تطويرها. إن بساطة اللغة ومرونتها تمنح المطور المزيد من الفرص لكتابة تعليمات برمجية سريعة ولكن عالية الجودة.

إذا كنت مهتمًا باللغة، فيمكن العثور على جميع المعلومات المتعلقة باللغة على الموقع الرسمي للمشروع، ويمكن العثور على مصادرها على github، ويمكن نشر أي أخطاء يتم العثور عليها في Issue Tracker. لا تزال هناك العديد من المشاكل، لكن مطوري اللغة يحاربونها بنشاط. يعمل الفريق الآن على الإصدار غير المستقر للغاية من المعلم 3، وبعد الاستقرار، على حد علمي، من المخطط استخدام اللغة داخل شركة JetBrains، وبعد ذلك تم التخطيط للإصدار الأول بالفعل.

العلامات:

  • كوتلين
  • java
  • jetbrains
اضف اشارة

في عام 2017، كان هناك ضجيج جديد حول YP (لغة ​​برمجة) Kotlin، وعلى هذه الخلفية، أريد أيضًا أن أخبركم عن الابتكارات الأخرى في تطوير برامج الهواتف الذكية القائمة على نظام التشغيل Android. ولكن هذه مدونتي الشخصية، وليس بعض الموارد الأكاديمية، وبالتالي، أولا، سأسمح لنفسي ببعض الانحرافات الغنائية إلى الجانب، وتحول نظرتي إلى الماضي.

رحلة تاريخية

كان معرفتي الأولى ببرمجة الهواتف الذكية التي تعمل بنظام التشغيل Android في بداية عام 2012، أي قبل 6 سنوات بالضبط. في تلك الأوقات البعيدة، لم تكن Google قد أنشأت بعد بيئة التطوير المتكاملة (IDE) الرائعة الخاصة بها (بيئة التطوير المتكاملة، بيئة التطوير المتكاملة) Android Studio وأنا في Eclipse IDE مع تثبيت البرنامج الإضافي ADT (أدوات تطوير Android، أدوات مطور Android). كان سبب معرفتنا هو شراء أول هاتف ذكي لي، HTC Desire HD، قبل أقل من عام، في أوائل صيف عام 2011.

تعتبر Java لغة البرمجة الأصلية لنظام Android. لقد كانت لغة جديدة بالنسبة لي، لذلك واجهت تحديًا ثلاثيًا: بيئة تطوير متكاملة جديدة ولغة جديدة ونظام تشغيل جديد (نظام التشغيل)، وكل هذا في نفس الوقت. ومع ذلك، تعلمت بطريقة ما كيفية كتابة برامج لنظام Android، بل وكتبت منتجًا تجاريًا واحدًا، والذي تلقيت مقابله بكل سرور حافزًا قدره 1000 يورو.

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

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

في 2014ظهرت أول نسخة مستقرة من IDE من Google نفسها (على الرغم من أنها مبنية على IntelliJ IDEA IDE، المكتوبة في الشركة التشيكية القانونية JetBrains، التي أسسها ثلاثة مبرمجين روس في براغ).

بشكل عام، بدأ الأمر كله مع شركة ستارسوفت الروسية، التي بدأت نشاطها مباشرة بعد انقلاب أغسطس 1991 على أساس مختبر البرمجيات في الأكاديمية الإنسانية المستقلة في سانت بطرسبرغ، وكانت تتألف آنذاك من ثلاثة أشخاص. في عام 1993، بدأ العمل في مشروع "معاً". (أداة تصميم البرمجيات)والتي اقترح فكرتها ألماني جاء من ألمانيا. وفي عام 1995، تم تغيير اسم الشركة إلى STAR SPb وتم تسجيلها رسميًا كمكتب تمثيلي روسي لمجموعة STAR Group. في عام 1999، انفصلت الشركة "الروسية الألمانية" TogetherSoft، المكونة من متخصصين عملوا على منتج Together، عن STAR SPb. من بين المؤسسين المشاركين، كما هو الحال دائمًا، كان الأمريكيون الذين قرروا ضرورة نقل المبرمجين الجيدين بشكل عاجل من سانت بطرسبرغ إلى أوروبا، وفي نفس عام 1999، الفريق الأعلى من TogetherSoft (حوالي 50 شخصا)ذهب إلى براغ. وكان من بينهم المؤسسون الثلاثة المستقبليون لشركة JetBrains. وهكذا، في عام 2000، أسسوا شركة JetBrains، وسجلوا في نفس المكان الذي كانوا يعيشون فيه في ذلك الوقت، في براغ.

المنتج الرئيسي لشركة JetBrains هو IntelliJ IDEA، وهو IDE للعديد من لغات البرمجة. أخذته Google كأساس لـ IDE Android Studio. بالمناسبة، المؤسس المشارك لشركة Google هو أيضًا من روسيا. إذا حفرت قليلاً، فإن الجذور الروسية تبرز في كل مكان... ولد في موسكو وعاش هناك حتى بلغ الخامسة من عمره، ثم هاجرت عائلته إلى أمريكا عام 1979، كما كانت العادة آنذاك بين اليهود. وبسبب معاداة السامية، على وجه الخصوص، وجود حصص لليهود لدخول الجامعات. في البداية، يعزل اليهود كشعب أنفسهم، ويؤكدون بكل الطرق الممكنة على اختيارهم لله ولا يخفون عقليتهم غير المقبولة دائمًا في المناطق ذات الدين المهيمن المختلف والعقلية المختلفة، ثم يتفاجأون بالنتيجة . ومع ذلك، هذا موضوع آخر. على الرغم من موقفه المتشكك تجاه وطنه السابق، بعبارة ملطفة (ماذا يمكن أن تتوقعه أيضًا من شخص نشأ على يد المهاجرين السوفييت)، وأنا أشارك وجهات نظره تماما، ولا سيما على شبكة الإنترنت. والعديد من التصريحات الانتقادية حول روسيا عادلة تمامًا، رغم أنها غير سارة عندما تسمعها من شفاه أجنبي. ولكنني تشتت انتباهي مرة أخرى..

لذلك، عندما ظهر Android Studio، تحولت إليه على الفور باعتباره بيئة تطوير متكاملة واعدة للتطوير لنظام Android. يجب أن أقول أنه في البداية كانت إيجابياته وسلبياته مقارنة بـ Eclipse ملحوظة. ومع ذلك، كان هناك العديد من المزايا، وأصبحت مدمنًا عليها بشدة.

باعتباري أحد الهواة، فأنا لا أبرمج بشكل منتظم، وقد فاتني تمامًا عام 2017 الماضي فيما يتعلق بنظام Android. والآن قررت تحديث IDE ومعرفة الأشياء الجديدة التي ظهرت هناك خلال الفترة الفاصلة. واتضح أن هناك الكثير من الأشياء المهمة! سأقوم أدناه بإدراج بعض الابتكارات البارزة بشكل خاص والتي أقيّمها بشكل إيجابي للغاية.

لغة برمجة جديدة كوتلن

حتى وقت قريب، كان Android Studio يدعم البرمجة بلغة Java فقط (جافا، كانت تُسمى في السابق جافا. تمت تسمية اللغة على اسم علامة تجارية للقهوة، والتي بدورها سُميت على اسم جزيرة في إندونيسيا)وفي C++ للكود الأصلي. لغة جافا ليست قديمة جدًا، ولكن نظرًا للتركيز الصغير نسبيًا على استخدامها (منصة متعددة)كبار السن جدًا. تم تطويره من قبل شركة Sun Microsystems الشهيرة في عام 1995. كانت اللغة في الأصل تسمى أوك ("البلوط")، وتم تطويره لبرمجة الأجهزة الإلكترونية الاستهلاكية. تمت إعادة تسميتها بعد ذلك باسم Java واستخدامها لكتابة تطبيقات العميل وبرامج الخادم. وفي وقت لاحق، ظهرت استخدامات أخرى.

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

ومؤخرًا، في نهاية عام 2017، تم إصدار Android Studio 3.0، والذي بدأ، إلى جانب لغات Java وC++، في دعم لغة Kotlin (كوتلين)، والتي تم تصميمها، مثل Java، لإنشاء نفس الكود الثانوي لنفس الجهاز الظاهري، ولكنها تحتوي على بناء جملة مختلف يسمح لك بكتابة كود مصدر أكثر إحكاما. وفي الوقت نفسه، يمكن دمج الملفات المصدرية باللغتين دون قيود في مشروع واحد، مما يجعل من الممكن نقل المشروع بأكمله تدريجيًا إلى Kotlin.

اللغة جديدة تمامًا. بدأ تطويره في عام 2010، وتم تقديمه للجمهور في عام 2011، وأصبحت البرمجة عليه لنظام Android ممكنة في عام 2012، وتم إصدار الإصدار الرسمي مؤخرًا، في عام 2016. بالمناسبة، وفقا للتقاليد (مثل جافا)تم تسمية اللغة على اسم الجزيرة. وهذه المرة هي جزيرة كوتلين الروسية في خليج فنلندا، والتي تقع عليها مدينة كرونشتادت. وتم تطوير اللغة من قبل مبرمجين من سانت بطرسبرغ، كلهم ​​في نفس شركة JetBrains! أوه، كيف، لغة برمجة روسية حقيقية! [يجب على الوطنيين أن يلوحوا بالأعلام، وكاتب هذا المنشور يسير بالفعل في دوائر حول الغرفة، ويلوح للموظفين بشكل خطير...]

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

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

المكونات المعمارية لنظام Android من Google

كما تبين أنه من السهل جدًا إنشاء واستخدام قاعدة بيانات SQLite باستخدام مكتبة الغرفة، وهي عبارة عن غلاف لفئة SQLiteOpenHelper المعروفة. لاستخدام Room، يكفي وصف فئتين صغيرتين تصفان الجدول وقاعدة البيانات وواجهة صغيرة واحدة تصف وظائف التفاعل مع قاعدة البيانات هذه. في Kotlin ليست هناك حاجة لوضع كل هذا في ملفات مختلفة. واستنادًا إلى هذه المعلومات الضئيلة، سيقوم Room بإعادة إنتاج جميع الإجراءات التي كان يجب كتابتها سابقًا في ملفات ضخمة، تلقائيًا وداخليًا. معجزات!

في التطبيقات الحقيقية، تحتاج إلى تتبع التغييرات في البيانات في قاعدة البيانات وتحديث المعلومات تلقائيًا في المكونات المرئية. لذلك، غالبًا ما يتم استخدام مكون الغرفة ليس بمفرده، ولكن مع مكون LiveData من مكتبة android.arch.lifecycle. هذا المكون سهل الاستخدام أيضًا. يتم نقل البيانات المطلوب تتبعها من قاعدة البيانات إلى المتغير ليس بشكل مباشر، ولكن في شكل فئة LiveData، التي تستقبل هذه البيانات كمعلمة داخل Room. بعد ذلك، في الكود الرئيسي، في سطر واحد من Kotlin، يتم ضبط مراقبتها ووظيفة تحديث المكون المرئي، والتي يتم تشغيلها عند تغيير البيانات. كل شيء ابتدائي!

عنصر آخر مفيد من مكتبة android.arch.lifecycle الذي يحل مشكلة حفظ بيانات النشاط عند تدوير الشاشة هو ViewModel. في السابق، كان من الضروري كتابة جميع أنواع العكازات الذكية حتى لا تضيع البيانات ولا تنقطع الحسابات. يوجد الآن مكون رسمي لهذا! إذا قمنا سابقًا بفصل الواجهة عن الكود (الترميز والنشاط)، فهذا هو الوقت المناسب لفصل التعليمات البرمجية التي يجب تشغيلها فقط خلال دورة حياة النشاط (على سبيل المثال، ضمان عمل واجهة المستخدم)، من التعليمات البرمجية التي يجب تشغيلها خارج دورة حياة نشاط معينة (على سبيل المثال، تلقي البيانات ومعالجتها وإرسالها). في هذه الحالة، يمكننا تلقائيًا قراءة نتيجة الجزء الثاني من الكود في النشاط الذي تم إعادة إنشائه بعد تدوير الشاشة.

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

يتم دمج المكونات الثلاثة تحت الاسم الرسمي Android Architecture Components. صحيح أنه يتضمن أيضًا مكون LifeCycle، الموجود أيضًا في مكتبة android.arch.lifecycle، ولكن يتم استخدامه جنبًا إلى جنب مع LiveData، ولن أسلط الضوء عليه على الإطلاق. يعد تقديم مثل هذه المكونات عالية المستوى بمثابة خطوة مرحب بها في الاتجاه الصحيح بالنسبة لشركة Google. لقد كنت أشكو منذ فترة طويلة من عدد الفصول المختلفة التي يتعين عليك توسيعها بنفسك وربطها جميعًا ببعضها البعض لعمل أي شيء أكثر من مجرد أمثلة بدائية من الكتب المدرسية للمبتدئين. وأخيرا، بدأت المكونات الصحيحة في الظهور بين المكتبات. آمل أن يستمر هذا الاتجاه.

محرر الواجهة المرئية

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

لحسن الحظ، في Android Studio، بدءًا من الإصدار 2.2، بدلاً من إنشاء واجهة gimor من خلال تخطيطات الترتيب الخطي للعناصر (التخطيط الخطي)يقترح استخدام التخطيط القسري الجديد (تخطيط القيد). بالإضافة إلى ذلك، تم أخيرًا الانتهاء من المحرر المرئي. كل هذا معًا كان له تأثير إيجابي للغاية. الآن ليس من الصعب للغاية وضع العناصر بشكل صحيح، وهي تتصرف بشكل متوقع تماما. الآن لا يمكنك حتى لمس علامات XML، ولكن تنفيذ جميع الإجراءات في المحرر المرئي.