שאלות ותשובות מתקדמות בסקאלה

לפני שתקראו את הפוסט הזה, אנא עברו דרך שני הפוסטים הקודמים שלי ב-"Scala Basic" ו-"Scala Intermediate" שאלות ראיון ותשובות כדי להשיג מסווג קצת את הידע הבסיסי על שפת Scala.

שאלות ראיון מתקדמות ב-Scala

בפוסט הזה, אנחנו הולכים לדבר על כמה שאלות ראיון מתקדמות ב-Scala שקשורות למושגים מתקדמים ב-Scala וגם על כמה מושגים קשורים לפרויקטים בזמן אמת. הערה: מאחר שרשימה זו כבר הפכה לגדולה מאוד, אני הולך לפרסם פוסט נוסף עם שאלות ותשובות נותרות. אנא התייחסו לפוסט זה בכתובת: "שאלות ותשובות לראיונות מתקדמים ובינוניים ב-Scala" נדבר גם על שאלות ותשובות על קונקורנציה ופרלליזם ב-Scala/Java, שימושיות למפתח Scala/Java סניור או מנוסה.

שאלות ראיון מתקדמות ב-Scala

במקטע זה, אנו הולכים לרשום את כל שאלות הראיון האמצעיות של Scala, ובמקטע הבא נדבר עליהן בפרט.

  1. מהו הגרסה האחרונה הנוכחית של Scala? מהו השינוי המרכזי או העדכון המרכזי ב-Scala 2.12?
  2. מהו Option ב-Scala? מהם Some ו-None? מהו דפוס העיצוב Option/Some/None ב-Scala?
  3. מהו Either ב-Scala? מהם Left ו-Right ב-Scala? הסבר על דפוס העיצוב Either/Left/Right ב-Scala?
  4. מהו המבנה השקול של Option ב-Java SE 8? מהו השימוש ב-Option ב-Scala?
  5. מהם היתרונות של תכנות פונקציונל (FP) או יתרונות של פונקציות טהורות?
  6. מהם הפריימוורקים הפופולריים המבוססים על Scala לפיתוח שירותי רשת RESTful או API REST?
  7. מהו הפריימוורק הטוב ביותר ליצירת תיעוד REST API עבור יישומים המבוססים על Scala?
  8. כמו Hibernate ליישומים המבוססים על Java, מהם הפריימוורקים ORM הפופולריים הזמינים לשימוש ביישומים המבוססים על Play/Scala?
  9. מהו הכלי הטוב ביותר לפיתוח יישומים ב-Play/Scala לשמירת נתונים במאגר נתונים NoSQL של MongoDB?
  10. לקוחות פופולריים שמשתמשים ב-Play וב-Scala לפיתוח היישומים שלהם?
  11. מהו השפה הטובה ביותר לשימוש עם הסביבה Play: Scala או Java?
  12. איך Scala תומכת גם ביישומים בעלי יכולת התקדמות גבוהה וביצועים גבוהים?
  13. מהם כלי הבנייה הזמינים לפיתוח יישומים המבוססים על Play ו-Scala?
  14. מהו SBT? מהו הכלי לבניית יישומים ב-Play וב-Scala?
  15. מהם הכלים לבדיקות יחידה, בדיקות פונקציונליות ו/או מסגרת BDD הזמינים עבור יישומי Play ו-Scala?
  16. מהו הכלי לכיסוי קוד הטוב ביותר הזמין עבור יישומי Play ו-Scala?
  17. מהו כלי בדיקת הסגנון לסקאלה הטוב ביותר הזמין עבור יישומי Play ו-Scala?
  18. אילו סביבות פיתוח תומכות בפיתוח יישומים המבוססים על Play ו-Scala קיימות וכיצד?
  19. מהו הכלי הברירת מחדל לבדיקות יחידה ופונקציונליות עבור Play? מהו הכלי לבניית קוד ברירת מחדל עבור Play? מהו מנוע התבניות ברירת המחדל עבור Play? מהו שרת האינטרנט המובנה הזמין בפריימוורק של Play?
  20. למה סקאלה טובה יותר מ-Java? מהם יתרונותיה של סקאלה על פני Java (Java 8)? בהשוואה ל-Java, מהם היתרונות העיקריים או התועלות של סקאלה?
  21. מהו פונקציה אנונימית בסקאלה? מהו פונקציית ליטרל בסקאלה? מהם היתרונות של פונקציה אנונימית/פונקציית ליטרל בסקאלה?
  22. מהו פונקציה מסדר גבוה (HOF)?
  23. מהן ההבדלים בין מחלקת Case לבין מחלקה רגילה?
  24. מהן היתרונות של מערכת ה-Play/Scala לפיתוח יישומי אינטרנט?
  25. מהו הקריאה לפי שם? האם סקאלה ו-Java תומכות בקריאה לפי שם? מה ההבדל בין פרמטרי פונקציה שמועברים לפי ערך ובין פרמטרי פונקציה שמועברים לפי שם?
  26. מהן המבנים ה-OOP של Java שאינם נתמכים על ידי סקאלה? מהם המבנים ה-OOP של סקאלה שאינם נתמכים על ידי Java? מהם המבנים ה-OOP החדשים שהוצגו על ידי סקאלה, אך לא נתמכים על ידי Java?
  27. מהן המסגרות MVC הפופולריות עבור שפת התכנות Scala לפיתוח אפליקציות אינטרנט?
  28. מהן ההבדלים העיקריים בין מבנה הפרויקט במבוסס ג'אווה לבין מבוסס סקאלה של Maven?
  29. מהו Extractor ב־Scala? מה ההבדל בין בנאי לבין Extractor ב־Scala? מה השימוש של Extractor ב־Scala?
  30. מהו השימוש של '???' ביישומי Scala?
  31. הסבר על ההבדל העיקרי בין List ל־Stream ב־API של Scala Collection? איך אנו מוכיחים את ההבדל הזה? מתי אנו בוחרים ב־Stream?
  32. מה ההבדל בין :: ו־#:: ב־Scala? מה ההבדל בין ::: ו־#::: ב־Scala?
  33. אם אני רוצה להפוך למפתח Scala מלא, איזו ערימת טכנולוגיות אני צריך ללמוד?

שאלות ותשובות מתקדמות ב־Scala

במקטע זה, ניקח כל שאלה מהרשימה למעלה ונדון בה בפרט עם דוגמאות מתאימות (אם נדרש). אם ברצונך להבין את המושגים הללו בעומק עם דוגמאות, אנא עיין בפוסטים הקודמים שלי בסקציה השלישית של המדריכים של Scala.

מהו הגרסה העדכנית ביותר של Scala כרגע? מהו השינוי המרכזי או העדכון המרכזי בגרסה 2.12 של Scala?

הגרסה היציבה הנוכחית של Scala היא 2.11.7. היא תומכת ב-Java SE 7. השינוי המרכזי או העדכון בגרסה 2.12 של Scala הוא שהיא תומכת רק ב-Java SE 8 או גרסאות מאוחרות יותר. Scala 2.12 אינה גרסה בינארית תואמת עם סדרת 2.11.x. היא עדיין בבניית Mile Stone בלבד.

מהו Option ב-Scala? מהם Some ו-None? מהו דפוס העיצוב Option/Some/None ב-Scala?

ב-Scala, Option משמש לייצוג ערכים אופציונליים שיכולים להיות או לא להיות קיימים. Option הוא מחלקה אבסטרקטית. ל-Option יש שני מחלקים נגזרים: Some ו-None. כל שלושתם (Option, Some ו-None) מוגדרים בחבילת "scala" כמו "scala.Option". Option היא אוסף מוגבל ב-Scala, המכיל או אפס או רק איבר אחד. אם Option מכילה אפס איברים, זהו None. אם Option מכילה איבר אחד, זהו Some. Some משמשת לייצוג ערך קיים. None משמשת לייצוג ערך שאינו קיים. דוגמה:-

def get(val index: Int): Option[String]

נניח שהשיטה הזו היא מסוג List. לשיטה זו יש סוג החזרה של Option[String]. אם יש אלמנטים ב־List, אז שיטת הקבלה הזו מחזירה "Some[String]" הזמין במיקום האינדקס הזה. במקרה אחר, היא מחזירה "None" (כלומר אין אלמנטים). Some הוא מחלקת case ו־None הוא אובייקט. מאחר ושניהם הם case class/object, אנו יכולים להשתמש בהם בתיאום דפוסים (Pattern Matching) בצורה יעילה. השילוב של כל ההגדרות הללו ידוע כתבנית העיצוב Option/Some/None ב־Scala.

מהו Either ב־Scala? מהם Left ו־Right ב־Scala? הסבר על תבנית העיצוב Either/Left/Right ב־Scala?

ב־Scala, Either הוא מחלקה אבסטרקטית. היא משמשת לייצוג ערך אחד מתוך שני סוגים אפשריים. היא מקבלת שני פרמטרי סוג: Either[A, B]. לדיווח הזה יש בדיוק שני תתי־סוגים: Left ו־Right. אם Either[A, B] מייצגת מופע של A, זה אומר שזו Left. אם היא מייצגת מופע של B, זה אומר שזו Right. זה נקרא תבנית העיצוב Either/Left/Right ב־Scala.

מהו הבניה המקבילה של Option של Scala ב-Java SE 8? מהו השימוש של Option ב-Scala?

Option של Scala דומה ל-Optional של Java SE 8. ב-Java SE 8 הוזן מחלקה יוליטי חדשה בשם Optional לייצוג של ערך שקיים או לא קיים. Optional זמין בחבילת java.util. השניים, כמו כן, משמשים לייצוג של ערכים אופציונליים ומשמשים למניעת בדיקות null ו-NullPointerException לא רצויות.

מהם יתרונות התכנות פונקציונלית (FP) או יתרונות של פונקציות טהורות?

הנה יתרונות התכנות הפונקציונלית (FP) או יתרונות של פונקציות טהורות:

  • פחות הקפצות
  • קל יותר להבין או לפנות
  • קל יותר לבדיקות
  • פחות קרירות לבאגים
  • קל יותר לשימוש מחדש
  • קל יותר לפרלליזם ולהכללה

ישנם פרמטרים רבים המבוססים על Scala לפיתוח שירותי רשת RESTful. הפרמטרים הפופולריים ביותר הם:

  • פרמטר המשחק
    ב-Play, אנו קוראים ל-URLs של REST API כנתיבים. אנו מקבץ את כל הנתיבים במקום אחד בפרמטר Play. זהו פרמטר סטייטלס לפיתוח REST API בקלות.- פרמטר Scalatra
    זהו פרמטר פשוט וקל ביותר, המבוסס על Scala, לפיתוח REST API- פרמטר ההתזת
    זהו פרמטר תמציתי מאוד ונבנה מעל לפרמטר Akka, כך שזה טוב יותר לפתח REST API באמצעות מודל השחזור.- פרמטר המעלה
    הוא מאפשר ניתוב באמצעות מושג ההתאמה לתבנית.

מהו הפרמטר הטוב ביותר ליצירת תיעוד REST API עבור יישומים המבוססים על Scala?

Swagger הוא הכלי הטוב ביותר למטרה זו. זהו כלי פשוט ופתוח ליצירת תיעוד ל-REST APIs עם JSON עבור יישומים המבוססים על Scala.

  • אם אנו משתמשים ב-Play עם Scala לפיתוח של REST API, אז נשתמש במודול play-swagger לתיעוד של REST API.
  • אם אנו משתמשים ב-Spray עם Scala לפיתוח של REST API, אז נשתמש במודול spray-swagger לתיעוד של REST API.

כמו JPA, Hibernate ו-Toplink וכו', ישנם רבים מסגרות ORM לשימוש ביישומים ב-Play/Scala. מסגרות ORM פופולריות ליישומים ב-Play/Scala הם:

  • Slick
  • Anorm
  • SORM (Scala ORM)
  • Squeryl

מהו הכלי הטוב ביותר לפיתוח יישומים ב-Play/Scala לשמירת נתונים במאגר נתונים NoSQL של MongoDB?

ReactiveMongo הוא הדרייבר הטוב ביותר של Scala לפיתוח אפליקציות Play/Scala לשמירת נתונים במאגר הנתונים NoSQL של MongoDB. הוא תומך בפעולות קלט/פלט לא חסומות ואסינכרוניות לחלוטין.

אלפי לקוחות משתמשים ב-Play ו-Scala בפרודקשן. הרשימה הבאה היא הלקוחות הפופולריים יותר שמשתמשים ב-Play ו-Scala באופן פעיל.

  • LinkedIn
  • The Guardian
  • Ocado
  • LuchidChart
  • GOV.UK

מהו השפה הטובה ביותר לשימוש עם מסגרת Play: Scala או Java?

Play 2 כתובה לחלוטין ב-Scala. אם אנו משתמשים ב-Java עם מסגרת Play, עלינו להתמודד עם מספר בעיות מכיוון ש-Java אינה תומכת בכל תכונות ה-FP באופן מלא. Scala היא האופציה הטובה ביותר לשימוש עם מסגרת Play לפיתוח אפליקציות ביצועים גבוהים יותר, עם מקביליות/אסינכרוניות ועיכוב נמוך, מכיוון:

  • Play 2 כתובה לחלוטין ב-Scala.
  • הוא תומך בתכונות FP מלאות.
  • זה יותר שפת ביטויים מאשר Java.
  • הוא תומך במודל השחקן Akka בצורה קלה מאוד
  • הוא תומך בכמה תכונות OOP חדשות כמו Traits.
  • התבניות המובנות של Play פותחו ב-Scala

איך Scala תומך באפליקציות גבוהות ביצועים וגמישות?

מאחר ו-Scala תומך בתכנות מרובה-פרדיגמות (גם OOP וגם FP) ומשתמש במודל ה-Concurrency של Actor, אנו יכולים לפתח אפליקציות ביצועים גבוהים וגמישות בקלות רבה.

אילו כלים לבניית מיזוג קיימים לפיתוח אפליקציות ב-Play וב-Scala?

השלושה הבאים הם הכלים הנפוצים ביותר לבניית אפליקציות ב-Play וב-Scala:

  • SBT
  • Maven
  • Gradle

מהו SBT? מהו הכלי לבניית הקוד הטוב ביותר לפיתוח של אפליקציות Play ו-Scala?

SBT מתייצב כקיצור ל-Scala Build Tool. זהו כלי פשוט לבניית אפליקציות ב-Scala. רוב האנשים משתמשים בכלי הבנייה SBT כדי לפתח אפליקציות ב-Play וב-Scala. לדוגמה, תוסף IntelliJ IDEA Scala ברירת המחדל משתמש ב-SBT ככלי בנייה למטרה זו.

מהם הכלים הזמינים לבדיקות יחידה, בדיקות פונקציונליות ו/או Frameworks של BDD עבור אפליקציות Play ו-Scala?

הכלים הפופולריים הבאים הם הכלים הזמינים ביותר לבדיקות יחידה, בדיקות פונקציונליות ו/או Frameworks של BDD עבור אפליקציות Play/Scala:

  • Spec2
  • ScalaTest
  • ScalaCheck
  • Mokito

מהו הכלי לכיסוי קוד הטוב ביותר הזמין ליישומים המבוססים על Play ו-Scala?

SCoverage הוא כלי לכיסוי קוד עבור יישומים המבוססים על Play ו-Scala. SCoverage מתייחס לכלי כיסוי קוד Scala. יש לו שלושה תוספים נפרדים התומכים בכלי בנייה הבאים:

  • SBT
  • Maven
  • Gradle

מהו כלי בדיקת הסגנון הכי טוב ליישומים המבוססים על Play ו-Scala?

כמו Checkstyle ליישומים המבוססים על Java, Scalastyle הוא כלי בדיקת סגנון Scala הטוב ביותר ליישומים המבוססים על Play ו-Scala. Scalastyle מתקשר עם קוד המקור שלנו ב-Scala ומציין בעיות אפשריות בו. יש לו שלושה תוספים נפרדים התומכים בכלי בנייה הבאים:

  • SBT
  • Maven
  • Gradle

יש לו שני תוספים נפרדים התומכים בשני ה-IDE הבאים:

  • IntelliJ IDEA

אילו סביבות פיתוח נתמכות על ידי IDEs בפיתוח של יישומים המבוססים על Play ו-Scala ואיך?

שתי ה-IDEs הפופולריות הבאות תומכות בפיתוח של יישומים המבוססים על Play ו-Scala:

  • IntelliJ IDEA
  • Eclipse IDE

הן תומכות באמצעות תוספות Scala כמו ש-IDE Eclipse כולל תוסף Scala IDE לתמיכה בפיתוח של יישומים המבוססים על Play ו-Scala. ב- IntelliJ IDEA יש תוסף כמו "תוסף Scala ל- IntelliJ IDEA" לתמיכה ביישומים המבוססים על "Scala, SBT ו-Play 2 Framework".- מהו ה-Unit וה-Functional Testing Framework ברירת המחדל של Play? מהו הכלי לבניית קוד המוגדר כברירת מחדל של Play? מהו הסטנדרט נוצר ברירת מחדל של Play? מהו שרת האינטרנט המובנה הזמין ב-Play Framework?
ה-Unit וה-Functional Testing Framework ברירת המחדל של Play Framework הוא Spec2. זה קל מאוד לבצע בדיקות עבור יישומים שמבוססים על Play/Scala באמצעות הפריימוורק Spec2. הסטנדרט הנוצר ברירת מחדל של Play Framework הוא "Twirl". הוא פותח ב-Scala. על ידי שימוש בתבניות אלה, אנו יכולים לפתח יישומים המבוססים על Play/Scala בקלות רבה. השרת האינטרנט המובנה או הסטנדרטי הזמין עבור Play Framework הוא שרת Netty.

למה Scala טובה יותר מ- Java? מהם היתרונות של Scala על Java (Java 8)? להשוות ל-Java, מהם היתרונות המרכזיים של Scala?

כי Scala תומכת בתכונות הבאות, היא טובה יותר מ-Java 8:

  • תכונות מלאות של פונקציות פונקציונליות
  • שפת ביטוי מתקדמת יותר
  • התאמה לתבניות
  • תמיכה משופרת ב- Akka Actor Model
  • פתרון אוטומטי לבעיה של היררכיה ירושה עם Traits
  • תכנות IO אסינכרוני ובלתי חוסם באמצעות מסגרת Akka
  • API לזרימה ריאקטיבית מלאה

מהו פונקציה אנונימית ב-Scala? מהו ליטרל של פונקציה ב-Scala? מהם היתרונות של פונקציה אנונימית/ליטרל של פונקציה ב-Scala?

פונקציה אנונימית היא גם פונקציה, אך אין לה שם פונקציה. היא נקראת גם "ליטרל פונקציה". היתרונות של פונקציה אנונימית / ליטרל פונקציה ב־Scala:

  • ניתן להקצות ליטרל פונקציה למשתנה
  • ניתן להעביר ליטרל פונקציה לפונקציה/שיטה אחרת
  • ניתן להחזיר ליטרל פונקציה כערך תוצאה של פונקציה/שיטה אחרת.

מהו פונקציה מעלה-סדר (HOF)?

פונקציה מעלה-סדר (HOF) היא גם פונקציה, אך היא מבצעת אחת, שתיים או שניהם מהדברים הבאים:

  • מקבלת פונקציות אחרות כארגומנטים
  • מחזירה פונקציות כתוצאותיהן

מה ההבדלים בין מחלקת Case למחלקה רגילה?

מחלקת Case היא גם מחלקה, אך כאשר אנו משווים אותה עם מחלקה רגילה, היא מספקת את התכונות או היתרונות הבאים:

  • באופן ברירת מחדל, פרמטרי הבנאי של מחלקת Case הם 'val'. אנו לא צריכים להכריז פרמטרים עם 'val'.
  • באופן ברירת מחדל, פרמטרי הבנאי של מחלקת Case הופכים לשדות מחלקה.
  • שיטות אלו מתווספות אוטומטית: toString, equals, hashCode, copy. apply ו-unapply.
  • ה-Companion object ניצור באופן אוטומטי.
  • אין צורך להשתמש במילת המפתח 'new' כדי ליצור אובייקט של Case Class.
  • קל לשימוש בפסוק בהתאמה.

כל התכונות הללו מתווספות על ידי מהדר Scala בזמן הקומפילציה. זה לא אפשרי עם מחלקה רגילה.

מהם היתרונות של מערכת ה-Play/Scala לפיתוח אפליקציות אינטרנט?

הנה יתרונות עיקריים של מערכת ה-Play/Scala לפיתוח אפליקציות אינטרנט:

  • פליי הוא מסגרת תוכנה חופשית ופתוחה לפיתוח אפליקציות אינטרנט. המסגרת מספקת עיצוב וכלים לפיתוח מהיר ויעיל של אפליקציות ווב.

    התכונה של "טעינה אוטומטית מחדש" בפליי משפרת את פרודוקטיביות המפתחים. אין צורך לבנות, להשקיע ולבדוק את השינויים. מספיק לבצע את השינויים ולרענן את העמוד כדי לראות את השינויים.

    פליי מבוסס על מודל HTTP המבוסס על מצב בלתי-מקושר, מה שהופך אותו לקל לפיתוח של API או שירותי רשת REST.

    בעת פיתוח אפליקציות ווב באמצעות פליי, המסגרת מספקת התראות על כל השגיאות בדפדפן בתבנית שימושית מאוד. היא מציגה הודעת שגיאה, מיקום הקובץ, מספר השורה בו התרחשה השגיאה, ומדגימה את קטע הקוד כדי להבין את השגיאה בקלות.

    פליי פותח באמצעות עיקרונות עיצוב ריאקטיביים ומבוסס על שרת Netty כדי לנצל את יכולות ה-IO הבלתי חוסמות. בזכות התכונה הזו, אפשר לפתח אפליקציות ביצועים גבוהים וקלות יותר לגדילה בקלות.

    פליי הוא מסגרת גמישה מאוד שתומכת בפיתוח תוספים והרחבת יכולותיה בקלות.

    מאחר ושפת התכנות סקאלה תומכת בתכנות פונקציונלי, וגם פליי תומך בו, פיתוח אפליקציות עם קונקורנסיה גבוהה ופרלליזם טוב יותר הופך לפשוט ביותר. זאת משום שהתכנות הפונקציונלי תומך בלא-משתנים, פונקציות נקיות (פונקציות ללא אפקטים צידיים), התאמת דפוסים, דוגמאות אקטורים וכדומה.

    מאחר ושפת התכנות סקאלה תומכת בתכנות פונקציונלי, וגם פליי תומך בו, אפשר לפתח אפליקציות מודולריות וניתנות לשימוש מחדש יותר. גם ניתן לבדוק בקלות יותר אפליקציות מודולריות יותר.

אילו בניות OOP של Java אינן נתמכות על ידי Scala? אילו בניות OOP של Scala אינן נתמכות על ידי Java? אילו בניות OOP חדשות הוזנו על ידי Scala, אך אינן נתמכות על ידי Java?

בניות OOP של Java שאינן נתמכות על ידי Scala:

  • אין כל מושג של ממשק ב־Scala
  • אין כל מושג של Enum ב־Scala

בניות OOP של Scala שאינן נתמכות על ידי Java או הבניות החדשות שהוזנו על ידי Scala, אך אינן נתמכות על ידי Java:

  • Scala Traits
  • פתרון אוטומטי לבעיה של ירושה יהלומית.

מהו הקריאה לפי שם? האם Scala ו-Java תומכות בקריאה לפי שם? מה ההבחנה בין פרמטרי פונקציה של קריאה לפי ערך וקריאה לפי שם?

קריאה לפי שם אומרת לבדוק פרמטרים של מתודה/פונקציה רק כאשר אנו זקוקים אליהם או גורם לגישה אליהם. אם אנו לא משתמשים בהם, אז הם אינם נבדקים. Scala תומכת גם בפרמטרים של קריאה לפי ערך וקריאה לפי שם. אולם, Java תומכת רק בקריאה לפי ערך ולא בקריאה לפי שם. ההבחנה בין קריאה לפי ערך לבין קריאה לפי שם היא: ההבחנה המרכזית ביניהם נתונה למטה:

  • בקריאה לפי שם, פרמטרי הפונקציה מוערכים רק כאשר הם נדרשים ולא כאשר הפונקציה נקראת.
  • בקריאה לפי ערך, פרמטרי הפונקציה מוערכים כאשר הפונקציה נקראת.
  • בקריאה לפי ערך, הפרמטרים מוערכים לפני ביצוע הפונקציה והם מוערכים רק פעם אחת בלתי תלוי כמה פעמים הם נעשו שימוש בפונקציה זו.
  • בקריאה לפי שם, הפרמטרים מוערכים כל פעם שנגשים אליהם והם נערכים בכל פעם שאנו משתמשים בהם בפונקציה זו.
  • הבדלי תחבורה בסינטקס של Scala
def myFunction(a: Int, b: Int) { }

הנה שניים, a ו-b, הם פרמטרים שמועברים לפונקציה שלי כפרמטרים של קריאה לפי ערך. קריאה לפי שם:

def myFunction(a: Int, b: => Int) { }

כאן a הוא פרמטר של קריאה לפי ערך ו-b הוא פרמטר של קריאה לפי שם לפונקציה שלי.

הנה כמה מהפריימוורקים הפופולריים ביותר לשפת סקאלה לפיתוח אפליקציות אינטרנט:

  • Play Framework
  • Scalatra Framework
  • Spray Framework
  • Lift Framework

מהם ההבחנות המרכזיות בין מבנה הפרויקטים ב-Maven בשפת ג'אווה לבין מבנה הפרויקטים בשפת סקאלה?

אומרים שרוב פרויקטי Java משתמשים ב-Maven ככלי הבנייה שלהם. עם זאת, רוב האנשים משתמשים ב-SBT ככלי הבנייה לפיתוח של היישומים שלהם ב-Scala, אך ישנם גם קבוצות שמשתמשות ב-Maven ככלי הבנייה לפיתוח של היישומים שלהם ב-Scala. מבנה התיקיות של Maven עבור פרויקטים בשפת Java ובשפת Scala דומה בצורה כמעט זהה, עם שינוי קטן בשם התיקייה כפי שמוצג בתרמילין הבאים:

מבנה תיקייה של פרויקט Maven בשפת Java:

מבנה תיקייה של פרויקט Maven בשפת Scala:

מהו Extractor בשפת Scala? מה ההבחנה בין Constructor ו-Extractor בשפת Scala? מהו השימוש של Extractor בשפת Scala?

למה להשתמש ב-'???' ביישומים בבסיס סקאלה?

שלושת סימני השאלה '???' אינם אופרטור או שיטה בסקאלה. הם משמשים לסימון של שיטה הנמצאת בתהליך יישום, וזאת אומרת שהמפתח יחייב לספק יישום עבורה. השיטה הזו מוגדרת במחלקת 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 Collection API? איך אנו מוכחים את ההבדל הזה? מתי אנו בוחרים ב-Stream?

ב-Scala, גם List וגם Stream הם חלק מ-Collection API ופועלים בדרך כמעט דומה. שניהם הם אוספים לא משנים. עם זאת, יש הבחנה עיקרית אחת בין List ל-Stream ב-Scala Collection API: רכיבי List משוערכים בצורה עקבית, בעוד שרכיבי Stream משוערכים בצורה תרגולית, כלומר, רק כאשר אנו גושבים עליהם.

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.

מה ההבדל בין :: ובין #:: ב־Scala? מה ההבדל בין ::: ובין #::: ב־Scala?

בְּממשק הֶאֱגוֹזִי של Scala Collection,

  • :: וְ־::: הם שיטות הנגישות במחלקת 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.

אם אני רוצה להפוך למפתח Scala מלא, לאיזה טכנולוגיות אני אמור ללמוד?

אם ברצונך להפוך למפתח Scala מלא, יש לך ללמוד את הסטאק הטכנולוגי הבא:

  • Scala 2.11.7
  • פריימוורק Play 2.4.6
  • פריימוורק Akka 2.3
  • כלי בנייה אחד: SBT/Maven
  • ספריית JS אחת: CoffeeScript/JavaScript
  • סביבת פיתוח אחת: IntelliJ IDEA 15/ Eclipse IDE 4.x
  • סביבת פיתוח אחת: IntelliJ IDEA 15/ Eclipse IDE 4.x
  • סביבת פיתוח אחת: IntelliJ IDEA 15/ Eclipse IDE 4.x
  • שירותי מיקרו עם Play ו-Scala
  • SCoverage
  • Scalastyle
  • דפוסי עיצוב תכנות פונקציונלייםלמידת מכונה עם Scala

הערה: – בִּשְׂפַת תכנות סקאלה, אקסטרקטור ממשיך את תבנית העיצוב של אקסטרקטור. אם ברצונך ללמוד אותו מעמיקות, אנא עבור על המדריך שלי בסקאלה (רוב הפוסטים עוקבים אחרי תבנית זו: סקאלה xxxx בעומק, כאשר xxxx הוא מושג כמו אקסטרקטור). וזהו, זה הכל בנושא "שאלות ותשובות מתקדמות בראיון סקאלה". אנו נדון במספר שאלות ותשובות נוספות בראיונות הסקאלה שלי בפוסטים הבאים. אנא השאירו לי תגובה אם אהבתם את הפוסט שלי או יש לכם שאלות/הצעות.

Source:
https://www.digitalocean.com/community/tutorials/scala-advanced-interview-questions