قبل قراءة هذه المشاركة، يرجى قراءة المشاركتين السابقتين لي في “Scala Basic” و “Scala Intermediate” أسئلة المقابلة وأجوبتها للحصول على بعض المعرفة الأساسية حول لغة Scala.
أسئلة المقابلة المتقدمة في Scala
في هذه المشاركة، سنناقش بعض أسئلة المقابلة المتقدمة في Scala المتعلقة بمفاهيم Scala المتقدمة وأيضًا بعض المفاهيم المتعلقة بمشروعات الواقع. ملاحظة: نظرًا لأن هذه القائمة أصبحت بالفعل كبيرة جدًا، سأقدم مشاركة أخرى مع الأسئلة والأجوبة المتبقية. يرجى الرجوع إلى تلك المشاركة على الرابط: “Scala Intermediate and Advanced Interview Questions and Answers” سنناقش أيضًا أسئلة وأجوبة العناصر المتزامنة والمتوازية في Scala/Java، والتي تكون مفيدة لمطوري Scala/Java ذوي الخبرة أو الكبار في المجال.
أسئلة المقابلة المتقدمة في Scala
في هذا القسم، سنقوم بإدراج جميع أسئلة المقابلة المتوسطة في سكالا، وفي القسم التالي سنناقشها بالتفصيل.
- ما هو أحدث إصدار من سكالا؟ ما هي التغييرات الرئيسية في سكالا 2.12؟
- ما هو الخيار في سكالا؟ ما هي Some و None؟ ما هو نمط التصميم Option/Some/None في سكالا؟
- ما هو Either في سكالا؟ ما هي Left و Right في سكالا؟ شرح نمط التصميم Either/Left/Right في سكالا؟
- ما هو المفهوم المعادل لـ Option في سكالا في جافا SE 8؟ ما هو استخدام Option في سكالا؟
- ما هي مزايا البرمجة الوظيفية (FP) أو مزايا الدوال النقية؟
- ما هي الأطر الشهيرة المبنية على سكالا لتطوير خدمات الويب القائمة على RESTful أو واجهة برمجة التطبيقات REST؟
- ما هو أفضل إطار عمل لإنشاء وثائق API REST لتطبيقات سكالا؟
- مثل Hibernate لتطبيقات الجافا، ما هي الأطر الشهيرة للتعامل مع ORM المتاحة للاستخدام في تطبيقات Play/سكالا؟
- ما هو أفضل أداة لتطوير تطبيقات Play/سكالا للحفاظ على البيانات في مخزن البيانات MongoDB NoSQL؟
- العملاء الشهيرين الذين يستخدمون Play وسكالا لتطوير تطبيقاتهم؟
- ما هو أفضل لغة للاستخدام مع إطار العمل Play: سكالا أم الجافا؟
- كيف يدعم سكالا كلاً من التطبيقات ذات القابلية العالية للتوسع والأداء العالي؟
- ما هي أدوات البناء المتاحة لتطوير تطبيقات Play وسكالا؟
- ما هو SBT؟ ما هي أفضل أداة بناء لتطوير تطبيقات Play وسكالا؟
- ما هي الأدوات المتاحة لاختبار الوحدات واختبار الوظائف و/أو إطار عمل BDD لتطبيقات Play و Scala؟
- ما هو أفضل أداة لتغطية الشفرة المتاحة لتطبيقات Play و Scala؟
- ما هي أفضل أداة لفحص أسلوب البرمجة في Scala المتاحة لتطبيقات Play و Scala؟
- ما هي بيئات التطوير المتكاملة التي تدعم تطوير تطبيقات Play و Scala وكيف؟
- ما هو إطار الاختبار الوحدات والوظائف الافتراضي لـ Play؟ ما هو أداة البناء الافتراضية لـ Play؟ ما هو محرك القوالب الافتراضي لـ Play؟ ما هو خادم الويب المدمج المتاح في إطار العمل Play؟
- لماذا Scala أفضل من Java؟ ما هي مزايا Scala على Java (Java 8)؟ بالمقارنة مع Java ما هي المزايا الرئيسية أو الفوائد لـ Scala؟
- ما هو الدالة المجهولة في Scala؟ ما هو الحرف الطليعي للدالة في Scala؟ ما هي مزايا الدالة المجهولة / الحرف الطليعي في Scala؟
- ما هي الدالة ذات الرتبة العالية (HOF)؟
- ما هي الفروق بين صنف الحالة والصنف العادي؟
- ما هي مزايا مجموعة Play/Scala لتطوير تطبيقات الويب؟
- ما هو استدعاء حسب الاسم؟ هل Scala و Java تدعمان استدعاء حسب الاسم؟ ما هو الفرق بين معاملات الدالة استدعاء حسب القيمة واستدعاء حسب الاسم؟
- ما هي بنى برمجة OOP في Java غير المدعومة في Scala؟ ما هي بنى برمجة OOP في Scala غير المدعومة في Java؟ ما هي بنى OOP الجديدة التي قدمتها Scala ولكنها غير مدعومة في Java؟
- ما هي إطارات MVC الشهيرة للغة Scala لتطوير تطبيقات الويب؟
- ما هي الاختلافات الرئيسية بين هيكل مشروع مافن المعتمد على جافا وهيكل مشروع مافن المعتمد على سكالا؟
- ما هو مستخرج في سكالا؟ ما هو الاختلاف بين المبني والمستخرج في سكالا؟ ما هو استخدام المستخرج في سكالا؟
- ما هو استخدام ‘؟؟؟’ في تطبيقات سكالا؟
- اشرح الاختلاف الرئيسي بين قائمة وتيار في واجهة برمجة تطبيقات مجموعة سكالا؟ كيف يمكننا إثبات هذا الاختلاف؟ متى يجب علينا اختيار التيار؟
- ما هو الاختلاف بين :: و #:: في سكالا؟ ما هو الاختلاف بين ::: و #::: في سكالا؟
- إذا كنت أرغب في أن أصبح مطور سكالا Fullstack، ما هي تقنية الشتات التي يجب أن أتعلمها؟
أسئلة وأجوبة متقدمة في مقابلات سكالا
في هذا القسم، سنقوم بمناقشة كل سؤال من القائمة أعلاه بالتفصيل مع أمثلة مناسبة (إذا لزم الأمر). إذا كنت ترغب في فهم هذه المفاهيم بشكل مفصل مع أمثلة، يرجى الاطلاع على مشاركاتي السابقة في قسم الدروس في سكالا.
ما هي أحدث نسخة من سكالا؟ ما هي التغييرات الرئيسية أو التحديثات في سكالا 2.12؟
أحدث نسخة مستقرة من سكالا هي 2.11.7. تدعم Java SE 7. التغيير الرئيسي أو التحديث في النسخة 2.12 من سكالا هو دعم Java SE 8 أو الإصدارات الأحدث فقط. سكالا 2.12 ليست متوافقة ثنائيًا مع سلسلة 2.11.x. لا تزال في مراحل بناء النموذج فقط.
ما هو الخيار في سكالا؟ ما هي Some و None؟ ما هو نمط التصميم Option/Some/None في سكالا؟
في سكالا ، يتم استخدام Option لتمثيل القيم الاختيارية التي قد تكون موجودة أو غير موجودة. Option هو فئة مجردة. يحتوي Option على فصيلتين فرعيتين: Some و None. يتم تعريف جميع العناصر الثلاثة (Option و Some و None) في حزمة “scala” مثل “scala.Option”. Option هو مجموعة محدودة في سكالا ، تحتوي على عنصر واحد أو لا شيء. إذا لم يحتوي Option على أي عناصر ، فهو يعتبر None. إذا كان Option يحتوي على عنصر واحد ، فهو يعتبر Some. يتم استخدام Some لتمثيل القيمة الموجودة. يتم استخدام None لتمثيل القيمة غير الموجودة. مثال:-
def get(val index: Int): Option[String]
لنفترض أن هذا الأسلوب هو من القائمة. يحتوي هذا الأسلوب على نوع إرجاع لـ Option[String]. إذا كانت القائمة تحتوي على عناصر ، يُرجع هذا الأسلوب عنصر “بعض السلسلة” المتاح في تلك الموضع الفهرسي. وإلا ، يُرجع “لا شيء” (أي لا توجد عناصر) Some هو فئة حالة و None هو كائن. حيث أن كلاهما فئة حالة / كائن ، يمكننا استخدامهما في نمط التطابق بنجاح. يُعرف الجمع بين كل هذه التعريفات بنمط التصميم Option/Some/None في سكالا.
ما هو Either في سكالا؟ ما هي Left و Right في سكالا؟ قم بشرح نمط التصميم Either/Left/Right في سكالا.
في سكالا ، Either هو فئة مجردة. يتم استخدامها لتمثيل قيمة واحدة من نوعين ممكنين. يأخذ اثنين من معاملات النوع: Either[A,B]. لديها بالضبط نوعين فرعيين: Left و Right. إذا كان Either[A,B] يمثل مثيل A فهذا يعني أنه Left. إذا كان يمثل مثيل B فهذا يعني أنه Right. هذا معروف بنمط التصميم Either/Left/Right في سكالا.
ما هو المكافئ لـ Option في Scala في Java SE 8؟ ما هو استخدام Option في Scala؟
تشبه Option في Scala Optional في Java SE 8. قد قامت Java SE 8 بتقديم فئة جديدة تسمى Optional لتمثيل وجود قيمة أو عدم وجودها. يتوفر Optional في حزمة java.util. يتم استخدام كلا Option في Scala و Optional في Java SE 8 لتمثيل القيم الاختيارية. يتم استخدام كلاهما لتجنب فحوصات القيمة الفارغة غير المرغوب فيها و NullPointerException.
ما هي مزايا البرمجة الوظيفية (FP) أو مزايا الدوال النقية؟
من بين المزايا للبرمجة الوظيفية (FP) أو الدوال النقية:
- أكثر تجزئة
- أسهل فهماً وتفسيراً
- أسهل اختباراً
- أقل عرضة للأخطاء
- أسهل إعادة الاستخدام
- أسهل توازناً وتعميماً
ما هي الأطر الشهيرة المبنية على سكالا لتطوير خدمات الويب القابلة للاستخدام أو واجهة برمجة التطبيقات القابلة للاستخدام؟
هناك العديد من الأطر الشهيرة المبنية على سكالا لتطوير خدمات الويب القابلة للاستخدام. أبرز الأطر هي:
- إطار Play
في إطار Play، نسمي عناوين واجهة برمجة التطبيقات القابلة للاستخدام بأسماء طرق. نضع جميع الطرق في مكان واحد في إطار Play. إنه إطار ويب لا حالة له يسهل تطوير واجهة برمجة التطبيقات القابلة للاستخدام.- إطار Scalatra
إنه إطار ويب بسيط وسهل المستخدم المبني على سكالا لتطوير واجهة برمجة التطبيقات القابلة للاستخدام.- إطار Spray
إنه مختصر جدًا ومبني فوق إطار Akka، لذلك فمن الأفضل تطوير واجهة برمجة التطبيقات القابلة للاستخدام باستخدام نموذج الممثل.- إطار Lift
يسمح بتوجيه باستخدام مفهوم القوالب المطابقة.
ما هو أفضل إطار لإنشاء وثائق واجهة برمجة التطبيقات القابلة للاستخدام لتطبيقات سكالا؟
سواجر هي أفضل أداة لهذا الغرض. إنها أداة بسيطة جدًا ومفتوحة المصدر لإنشاء وثائق واجهة برمجة التطبيقات القابلة للاستخدام بتنسيق JSON لتطبيقات سكالا.
- إذا استخدمنا Play with Scala لتطوير واجهة برمجة تطبيقات REST الخاصة بك، ثم استخدمنا وحدة play-swagger لوثائق واجهة برمجة التطبيقات REST.
- إذا استخدمنا Spray with Scala لتطوير واجهة برمجة تطبيقات REST الخاصة بك، ثم استخدمنا وحدة spray-swagger لوثائق واجهة برمجة التطبيقات REST.
مثل Hibernate لتطبيقات الجافا، ما هي الأطر الشهيرة لنمذجة الكائنات المتعلقة ORM المتاحة للاستخدام في تطبيقات Play/Scala؟
مثل JPA و Hibernate و Toplink وغيرها من الأطر الشهيرة لنمذجة الكائنات المتعلقة ORM في تطبيقات الجافا، هناك العديد من الأطر المتاحة للاستخدام في تطبيقات Play/Scala. أطر ORM الشهيرة لتطبيقات Play/Scala:
- Slick
- Anorm
- SORM(Scala ORM)
- Squeryl
ما هو أفضل أداة لتطوير تطبيقات Play/Scala لحفظ البيانات في متجر البيانات MongoDB NoSQL؟
ReactiveMongo هو أفضل برنامج تشغيل سكالا لتطوير تطبيقات Play / Scala لحفظ البيانات في مخزن بيانات MongoDB غير العلائقي. يدعم عمليات إدخال / إخراج غير القابلة للحجز بالكامل والمتزامنة تمامًا.
العملاء الشهيرين الذين يستخدمون Play و Scala لتطوير تطبيقاتهم؟
تستخدم الآلاف من العملاء Play و Scala في الإنتاج. فيما يلي قائمة العملاء الأكثر شهرة الذين يستخدمون Play و Scala بنشاط.
- لينكد إن
- ذا جارديان
- أوكادو
- لوسيدشارت
- GOV.UK
ما هو أفضل لغة للاستخدام مع إطار Play: سكالا أم جافا؟
Play 2 مكتوب بالكامل بلغة سكالا. إذا قمنا باستخدام جافا مع إطار Play ، فستواجهنا العديد من المشاكل لأن جافا لا تدعم ميزات FP الكاملة. سكالا هي الخيار الأفضل للاستخدام مع إطار Play لتطوير تطبيقات ذات قابلية توسع عالية وأداء أفضل بالتوازي ووقت استجابة منخفض ، لأن:
- Play 2 مكتوب بالكامل بلغة سكالا.
- إنه يدعم ميزات FP الكاملة.
- إنه أكثر لغة تعبيرية من جافا.
- إنه يدعم نموذج أكتور أكا بسهولة كبيرة.
- إنه يدعم بعض الميزات الجديدة في البرمجة الكائنية مثل الصفات.
- قوالب Play المدمجة تم تطويرها بلغة سكالا.
كيف يدعم سكالا التطبيقات ذات القدرة التوسعية العالية والأداء العالي؟
نظرًا لدعم سكالا للبرمجة متعددة الأنماط (البرمجة الكائنية والبرمجة الوظيفية) واستخدام نموذج تنافسية الممثلات، يمكننا تطوير تطبيقات ذات قدرة توسعية عالية وأداء عالي بسهولة.
ما هي أدوات البناء المتاحة لتطوير تطبيقات Play وسكالا؟
الأدوات الثلاثة التالية هي الأكثر شهرة لتطوير تطبيقات Play وسكالا:
- SBT
- Maven
- Gradle
ما هو SBT؟ ما هو أفضل أداة بناء لتطوير تطبيقات Play و Scala؟
SBT تعني Scala Build Tool. إنها أداة بناء بسيطة لتطوير التطبيقات المبنية على Scala. يستخدم معظم الناس أداة بناء SBT لتطبيقات Play و Scala. على سبيل المثال ، يستخدم برنامج IntelliJ IDEA Scala Plugin افتراضيًا أداة بناء SBT لهذا الغرض.
ما هي إطارات اختبار الوحدة واختبار الوظائف و / أو إطارات BDD المتاحة لتطبيقات Play و Scala؟
فيما يلي بعض إطارات اختبار الوحدة واختبار الوظائف و / أو إطارات BDD الأكثر شيوعًا المتاحة لتطبيقات Play / Scala:
- Spec2
- ScalaTest
- ScalaCheck
- Mokito
ما هو أفضل أداة لتغطية الشفرة المتاحة لتطبيقات Play و Scala؟
SCoverage هي أداة تغطية الشفرة لتطبيقات Play و Scala. SCoverage تعني أداة تغطية الشفرة في Scala. يحتوي على ثلاثة ملحقات منفصلة لدعم أدوات البناء التالية:
- SBT
- Maven
- Gradle
ما هي أفضل أداة لفحص أسلوب Scala المتاحة لتطبيقات Play و Scala؟
مثل Checkstyle لتطبيقات Java ، Scalastyle هي أفضل أداة لفحص أسلوب Scala المتاحة لتطبيقات Play و Scala. Scalastyle يراقب شفرة المصدر Scala الخاصة بنا ويشير إلى المشاكل المحتملة بها. يحتوي على ثلاثة ملحقات منفصلة لدعم أدوات البناء التالية:
- SBT
- Maven
- Gradle
يحتوي على ملحقين منفصلين لدعم المحررين المتكاملين للبيئة التطويرية التاليين:
- IntelliJ IDEA
- محرر البرمجة Eclipse
ما هي بيئات التطوير المتكاملة (IDEs) التي تدعم تطوير تطبيقات Play والتي تعتمد على لغة البرمجة سكالا وكيف يتم ذلك؟
تدعم البيئات التاليتان الشهيرتان تطوير تطبيقات Play والتي تعتمد على لغة البرمجة سكالا:
- IntelliJ IDEA
- Eclipse IDE
تدعم هذه البيئتان باستخدام ملحقات سكالا مثل بيئة تطوير سكالا لـEclipse لدعم تطوير تطبيقات Play والتي تعتمد على لغة البرمجة سكالا. تحتوي بيئة تطوير IntelliJ IDEA على ملحق مثل “ملحق سكالا لـ IntelliJ IDEA” لدعم تطبيقات تعتمد على “سكالا وإس بي تي (SBT) وإطار Play 2”. -ما هي إطارات الاختبار الوظيفي والوحدات التي تأتي بشكل افتراضي مع إطار Play؟ ما هو أداة البناء الافتراضية لإطار Play؟ ما هو محرك القوالب الافتراضي لإطار Play؟ ما هو خادم الويب المدمج المتاح في إطار Play؟
إطار Play يأتي بإطار الاختبار الوظيفي والوحدات الافتراضي وهو Spec2. من السهل جدًا اختبار تطبيقات Play/سكالا باستخدام إطار Spec2. القالب الافتراضي لإطار Play هو “Twirl”. تم تطويره باستخدام سكالا. باستخدام هذه القوالب ، يمكننا تطوير تطبيقات Play/سكالا بسهولة. خادم الويب المدمج الافتراضي المتاح لإطار Play هو خادم Netty.
لماذا سكالا أفضل من جافا؟ ما هي مزايا سكالا على جافا (جافا 8)؟ مقارنة بجافا، ما هي المزايا الرئيسية أو الفوائد لسكالا؟
لأن سكالا تدعم الميزات الإضافية التالية، فإنها أفضل من جافا 8:
- ميزات برمجة الدوال الوظيفية الكاملة
- لغة تعبيرية أكثر
- مطابقة الأنماط
- دعم أفضل لنموذج الممثلين في أكا
- حل تلقائي لمشكلة الماسة في الوراثة باستخدام الصفات
- برمجة الإدخال والإخراج غير المتزامنة وغير المانعة باستخدام إطار عمل أكا
- واجهة برمجة التدفق الاستجابي الكاملة
ما هي الدالة المجهولة في سكالا؟ ما هو الوظيفة الحرفية في سكالا؟ ما هي مزايا الدالة المجهولة/الوظيفة الحرفية في سكالا؟
الدالة المجهولة هي أيضًا دالة ولكنها لا تحتوي على أي اسم للدالة. وتُعرف أيضًا بأنها تعبير عن دالة. مزايا الدالة المجهولة / التعبير عن الدالة في سكالا:
- يمكننا تعيين تعبير عن الدالة لمتغير
- يمكننا تمرير تعبير عن الدالة إلى دالة / طريقة أخرى
- يمكننا إرجاع تعبير عن الدالة كقيمة لدالة / طريقة أخرى.
ما هي الدالة من الدرجة الأعلى (HOF)؟
الدالة من الدرجة الأعلى (HOF) هي أيضًا دالة ولكنها تقوم بأحد الأشياء التالية أو كلاهما:
- أخذ دوال أخرى كوسائط
- إرجاع دوال كنتائج
ما هي الفروق بين فئة الحالة والفئة العادية؟
فئة الحالة هي أيضًا فئة ، ومع ذلك عند مقارنتها بالفئة العادية ، فإنها توفر الميزات الإضافية أو الفوائد التالية:
- بشكل افتراضي ، يعتبر معلمات بناء فئة الحالة “val”. لا نحتاج إلى إعلان المعلمات بـ “val”.
- بشكل افتراضي ، تصبح معلمات بناء فئة الحالة حقولًا للفئة.
- تتم إضافة هذه الطرق تلقائياً: toString و equals و hashCode و copy و apply و unapply.
- يتم الحصول على كائن المرافق بشكل تلقائي.
- لا حاجة لاستخدام الكلمة الرئيسية ‘new’ لإنشاء نموذج من الحالة.
- سهولة الاستخدام في تطابق الأنماط.
يتم إضافة جميع هذه الميزات بواسطة مترجم سكالا أثناء الترجمة. وهو أمر غير ممكن مع الصف العادي.
ما هي مزايا مكدس بلاي/سكالا لتطوير تطبيقات الويب؟
التالية هي المزايا الرئيسية لمكدس بلاي/سكالا لتطوير تطبيقات الويب:
- المصدر المفتوح
Play هو إطار عمل برمجي مفتوح المصدر لتطوير تطبيقات الويب. – إنتاجية أفضل
تحسن ميزة إعادة تحميل السيارات في إطار اللعب منتجية المطور. لا حاجة لبناء ونشر واختبار تغييراتنا. فقط قم بإجراء التغييرات الخاصة بنا وقم بتحديث الصفحة لرؤية التغييرات الخاصة بنا. – سهولة تطوير واجهة برمجة تطبيقات الويب الراحة وعدم الحالة
اللعب هو نموذج غير متصل بالحالة يعتمد على بروتوكول HTTP لخدمة طلبات الويب ، لذلك فمن السهل جدًا تطوير واجهة برمجة تطبيقات REST أو خدمات الويب القائمة على REST. – التعامل مع الأخطاء بشكل أفضل
إذا قمنا بتطوير تطبيق الويب الخاص بنا باستخدام إطار اللعب ، فإنه يُعلِم جميع الأخطاء في المتصفح بتنسيق مفيد جدًا. يعرض رسالة الخطأ وموقع الملف ورقم السطر الذي حدث فيه الخطأ ، ويبرز مقتطف الشفرة لفهم الخطأ بسهولة. – أداء عالي وقابلية توسع أفضل مع الاستجابة
تم تطوير إطار اللعب باتباع نماذج التصميم الردّي وهو مبني على خادم نيتي للاستفادة من ميزة الإدخال / الإخراج غير المانع. بفضل هذه الميزة ، يمكننا تطوير تطبيقات قابلة للتوسعة وأداء عالي بسهولة جدًا. – سهولة التوسع
إطار اللعب هو إطار عمل مرن جدًا ويدعم تطوير المكونات الإضافية بسهولة لتوسيع ميزاته ووظائفه. – توازن عالي وتوازن أفضل
بما أن كلاً من سكالا واللعب يدعمان البرمجة الوظيفية ، فمن السهل جدًا تطوير تطبيقات ذات توازن عالٍ وتوازن أفضل بسبب دعم FP لعدم التغيير ، والوظائف النقية (الوظائف بدون آثار جانبية) ، والمطابقة بالأنماط ، ونموذج الممثل وما إلى ذلك. – إعادة الاستخدام الأفضل ، الاختبار السهل والتعددية أكثر
بما أن كلاً من سكالا واللعب يدعمان البرمجة الوظيفية ، يمكننا تطوير تطبيقات أكثر تعددية وإعادة استخدامًا. كما أنه من السهل جدًا اختبار التطبيقات أكثر تعددية.
ما هي بنى برمجة كائنية التوجه في جافا التي لا تدعمها سكالا؟ ما هي بنى برمجة كائنية التوجه في سكالا التي لا تدعمها جافا؟ ما هي بنى برمجة كائنية التوجه الجديدة التي قدمتها سكالا ولا تدعمها جافا؟
بنى برمجة كائنية التوجه في جافا والتي لا تدعمها سكالا:
- لا يوجد مفهوم الواجهة في سكالا
- لا يوجد مفهوم التعداد في سكالا
بنى برمجة كائنية التوجه في سكالا والتي لا تدعمها جافا: أو بنى برمجة كائنية التوجه الجديدة التي قدمتها سكالا ولا تدعمها جافا:
- صفات سكالا
- حل مشكلة الماسة في التوريث تلقائيًا.
ما هو الاستدعاء حسب الاسم؟ هل تدعم سكالا وجافا استدعاء حسب الاسم؟ ما هو الفرق بين معاملات الدالة بالاستدعاء حسب القيمة والاستدعاء حسب الاسم؟
الاستدعاء حسب الاسم يعني تقييم معاملات الوظيفة/الدالة فقط عند الحاجة إليها أو الوصول إليها. إذا لم نستخدمها، فإنها لا تقيم. يدعم سكالا كلاً من معاملات الدالة بالاستدعاء حسب القيمة ومعاملات الدالة بالاستدعاء حسب الاسم. ومع ذلك، يدعم جافا فقط استدعاء حسب القيمة وليس استدعاء حسب الاسم. الفرق بين معاملات الدالة بالاستدعاء حسب القيمة والاستدعاء حسب الاسم: يتم شرح الفرق الرئيسي بين هاتين الطريقتين أدناه:
- في الاستدعاء حسب الاسم، يتم تقييم معاملات الدالة فقط عند الحاجة إليها وليس عند استدعاء الدالة.
- في الاستدعاء حسب القيمة، يتم تقييم معاملات الدالة عند استدعاء الدالة.
- في الاستدعاء حسب القيمة، يتم تقييم المعاملات قبل تنفيذ الدالة ويتم تقييمها مرة واحدة فقط بغض النظر عن عدد مرات استخدامها في تلك الدالة.
- في الاستدعاء حسب الاسم، يتم تقييم المعاملات في كل مرة نستخدمها في الدالة ويتم تقييمها في كل مرة نستخدمها في تلك الدالة.
- فروق بناء الجمل في سكالا
def myFunction(a: Int, b: Int) { }
هنا كلا المعلمتين a و b هما معلمات بند طريقة الاستدعاء بالقيمة للدالة myFunction. طريقة الاستدعاء بالاسم:
def myFunction(a: Int, b: => Int) { }
هنا المعلمة a تستدعى بالقيمة والمعلمة b تستدعى بالاسم للدالة myFunction.
ما هي الأطر الشهيرة لنموذج MVC في لغة Scala لتطوير تطبيقات الويب؟
فيما يلي أطر MVC الأكثر شهرة المتاحة للغة Scala لتطوير تطبيقات الويب:
- Play Framework
- Scalatra Framework
- Spray Framework
- Lift Framework
ما هي الاختلافات الرئيسية بين هيكلية مشروع Maven المبنية على الجافا والمبنية على سكالا؟
معظم مشاريع الجافا تستخدم Maven كأداة البناء الخاصة بها. ومع ذلك، يستخدم معظم الأشخاص أداة البناء SBT لتطوير تطبيقاتهم المبنية على سكالا، ولكن يستخدم بعض الفرق أيضًا Maven كأداة بناء لتطوير تطبيقاتهم المبنية على سكالا. تكاد تكون هناك تشابه كبير في هيكل المجلدات بين مشاريع الجافا ومشاريع السكالا في Maven، باستثناء تغيير اسم المجلد وفقًا للرسومات التوضيحية التالية: أسماء المجلدات java و scala. هيكل مجلد مشروع Maven القائم على الجافا: هيكل مجلد مشروع Maven القائم على سكالا:
ما هو Extractor في سكالا؟ ما هو الفرق بين Constructor و Extractor في سكالا؟ ما هو استخدام Extractor في سكالا؟
ليس فقط في لغات البرمجة الموجهة نحو الكائنات مثل جافا وسكالا، يُستخدم المُنشئ Constructor لإنشاء (أو تجميع) كائن أو مثيل من الفئة باستخدام مُعاملاته (أو مكوناته). المُستخرج Extractor هو عكس المُنشئ. في سكالا، يُستخدم المُستخرج Extractor لتفكيك أو تفكيك كائن إلى مُعاملاته (أو مكوناته). في سكالا، طريقة التطبيق apply هي مُنشئ. داخليًا، يستخدم المُستخرج Extractor طريقة unapply لتفكيك الكائن إلى أجزائه (أو مُعاملاته). في سكالا، يُستخدم المُستخرج Extractor بشكل رئيسي في مفهوم التطابق على النمط. سنناقش مفهوم التطابق على النمط قريبًا.
ما هو الاستخدام الخاص بـ ‘???’ في تطبيقات سكالا؟
هذه الثلاث علامات استفهام ‘???’ ليست مُشغلًا أو طريقة في سكالا. يُستخدم للتعليم على أن الطريقة قيد التنفيذ، وهذا يعني أن المطور يجب أن يقدم تنفيذًا لهذه الطريقة. يتم تعريف هذه الطريقة في فئة scala.PreDef كما هو موضح أدناه:
def ??? : Nothing = throw new NotImplementedError
إذا قمنا بتشغيل تلك الطريقة دون توفير تنفيذ، فإنه يُثير خطأ ‘NotImplementedError’ كما هو موضح أدناه:
scala> def add(a:Int, b:Int) : Int = ???
add: (a: Int, b: Int)Int
scala> add(10,20)
scala.NotImplementedError: an implementation is missing
اشرح الفرق الرئيسي بين List و Stream في واجهة برمجة مجموعة Scala؟ كيف يمكننا إثبات هذا الفرق؟ متى نختار Stream؟
في لغة برمجة سكالا، كلا List و Stream ينتميان إلى واجهة برمجة المجموعات ويعملان بشكل مشابه تقريبًا. كلاهما مجموعات غير قابلة للتغيير. ومع ذلك، هناك فرق رئيسي بين List و Stream في واجهة برمجة المجموعات في سكالا: وهو أن عناصر List يتم تقييمها على الفور (Eagerly)، بينما يتم تقييم عناصر Stream بشكل كسول (Lazily)، وهذا يعني أنها لا تقيم إلا عند الوصول إليها.
scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)
هنا يمكننا أن نلاحظ أن جميع عناصر List يتم تقييمها في وقت إنشاء كائن List. ومع ذلك، إذا قمنا بنفس الشيء في Stream، لا يمكننا رؤية جميع العناصر. يمكننا رؤية العنصر الأول المقيم فقط وعناصر الباقي تقيم بشكل كسول كما هو مبين أدناه:
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)
عندما نريد مجموعة كسولة لتقييم العناصر فقط عند الوصول إليها، فمن الأفضل استخدام Stream.
ما هو الفرق بين :: و #:: في لغة سكالا؟ ما هو الفرق بين ::: و #::: في لغة سكالا؟
في واجهة برمجة مجموعات سكالا،
- :: و ::: هما طرق متاحة في فئة القائمة (List).
- #:: و #::: هما طرق متاحة في فئة التيار (Stream).
- في فئة القائمة (List)، تُستخدم طريقة :: لإضافة عنصر إلى بداية القائمة.
scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)
scala> list1 = 0 :: list1
list1: List[Int] = List(0, 1, 2, 3, 4)
- في فئة القائمة (List)، تُستخدم طريقة ::: لدمج عناصر قائمة معينة في بداية هذه القائمة.
scala> var list1 = List(3,4,5)
list1: List[Int] = List(3, 4, 5)
scala> val list2 = List(1,2) ::: list1
list2: List[Int] = List(1, 2, 0, 1, 2, 3, 4)
- في فئة التيار (Stream)، تُستخدم طريقة #:: لإضافة عنصر معين إلى بداية التيار. يتم تقييم عنصر الجديد المضاف فقط وتليه عناصر التيار التي يتم تقييمها بشكل كسلي.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> s1 = 0 #:: s1
s1: scala.collection.immutable.Stream[Int] = Stream(0, ?)
- في فئة التيار (Stream)، تُستخدم طريقة #::: لدمج تيار معين في بداية التيار. يتم تقييم عنصر الجديد المضاف فقط وتليه عناصر التيار التي يتم تقييمها بشكل كسلي.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> val s2 = Stream(-1,0) #::: s1
s2: scala.collection.immutable.Stream[Int] = Stream(-1, ?)
- تعمل طريقة :: كعامل cons لفئة القائمة (List) وتعمل طريقة #:: كعامل cons لفئة التيار (Stream). حيث يرمز ‘cons’ للبناء.
- ::: الطريقة تعمل كعامل اتصال للفئة List و #::: الطريقة تعمل كعامل اتصال للفئة Stream.
إذا كنت ترغب في أن تصبح مطور Fullstack Scala ، أي تكنولوجيا يجب أن أتعلم؟
إذا كنت ترغب في أن تصبح مطور Fullstack Scala ، يجب عليك أن تتعلم التكنولوجيا التالية:
- Scala 2.11.7
- Play 2.4.6 Framework
- Akka 2.3 Framework
- أداة بناء واحدة: SBT/Maven
- أطار JS واحد: CoffeeScript/JavaScript
- بيئة تطوير متكاملة واحدة: IntelliJ IDEA 15/ Eclipse IDE 4.x
- أطار TDD & BDD واحد: ScalaTest,Spec2,ScalaCheck,Mockito
- خدمات صغيرة باستخدام Play و Scala
- SCoverage
- Scalastyle
- نماذج التصميم البرمجي الوظيفي
- تعلم الآلة باستخدام Scala
{
“error”: “Upstream error…”
}
Source:
https://www.digitalocean.com/community/tutorials/scala-advanced-interview-questions