Menu
Coddy logo textTech

ניתן להקצאה ל-null לעומת לא ניתן להקצאה ל-null

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 24 מתוך 110.

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

String name = 'Alice';   // לא יכול להיות null - חייב תמיד להכיל ערך
String? nickname;        // יכול להיות null - יכול להכיל null או String

print(name);      // Alice
print(nickname);  // null

ההבדל המרכזי הוא שטיפוסים שאינם יכולים להיות null מבטיחים שערך קיים, ואילו טיפוסים שיכולים להיות null מאפשרים במפורש היעדר ערך. ההבחנה הזאת חלה על כל הטיפוסים:

int count = 10;       // חייב להיות לו ערך
int? optionalCount;   // יכול להיות null

List<String> items = [];      // חייב להיות רשימה (יכולה להיות ריקה)
List<String>? maybeItems;     // יכול להיות null (כלומר, אין רשימה כלל)

שימו לב שרשימה ריקה [] שונה מ־null. רשימה ריקה קיימת אך אינה מכילה דבר; null פירושו שאין רשימה כלל.

המהדר אוכף את הכללים האלה בקפדנות. אי אפשר להציב null במשתנה שאינו יכול להיות null, ואי אפשר להשתמש במשתנה שיכול להיות null במקום שבו מצופה משתנה שאינו יכול להיות null בלי לבדוק קודם אם הוא null:

String? maybeName = 'Bob';
// String definite = maybeName;  // שגיאה! אי אפשר להקצות ערך שיכול להיות null למשתנה שאינו יכול להיות null

בשיעור הבא תלמדו על האופרטורים ש-Dart מספקת כדי לעבוד בבטחה עם ערכים שיכולים להיות null.

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול רשימת צפייה בסרטים, שמדגימה את ההבדל בין מידע נדרש למידע אופציונלי באמצעות טיפוסים nullable ו-non-nullable.

תיצרו שני קבצים כדי לארגן את הקוד:

  • movie.dart: הגדירו מחלקה Movie שמייצגת סרט ברשימת הצפייה שלכם. לכל סרט חייבים להיות כותרת ושנת יציאה (אלה תמיד נדרשות), אבל ייתכן שפרטים נוספים לא יהיו זמינים עבור כל סרט. המחלקה שלכם צריכה לכלול:
    • String title שאינו nullable — לכל סרט חייבת להיות כותרת
    • int year שאינו nullable — לכל סרט חייבת להיות שנת יציאה
    • String? director שהוא nullable — ייתכן שזהות הבמאי אינה ידועה
    • double? rating שהוא nullable — לא כל הסרטים קיבלו דירוג עדיין
    • בנאי שמקבל את title ואת year כפרמטרים נדרשים
    • מתודה displayInfo() שמדפיסה את פרטי הסרט, ומציגה Unknown כששם הבמאי חסר ו-Not rated כשדירוג חסר
  • main.dart: ייבאו את מחלקת הסרט שלכם וצרו רשימת צפייה קטנה שמדגימה נתוני סרטים מלאים וחלקיים:
    • צרו סרט עם הכותרת 'Inception' והשנה 2010, ואז הגדירו את הבמאי שלו כ-'Christopher Nolan' ואת הדירוג כ-8.8
    • צרו סרט עם הכותרת 'The Matrix' והשנה 1999, ואז הגדירו רק את הדירוג שלו כ-8.7 (השאירו את הבמאי כ-null)
    • צרו סרט עם הכותרת 'Upcoming Film' והשנה 2025 (השאירו גם את הבמאי וגם את הדירוג כ-null)
    • קראו ל-displayInfo() עבור כל סרט, לפי הסדר שמופיע למעלה

המתודה displayInfo() צריכה להדפיס בפורמט המדויק הבא:

[title] ([year])
Director: [director or "Unknown"]
Rating: [rating or "Not rated"]

שימו לב שהשדות שאינם nullable (title ו-year) תמיד מובטחים להכיל ערכים, בעוד שהשדות ה-nullable (director? ו-rating?) יכולים להישאר ללא ערך. כך משתקפים תרחישים מהעולם האמיתי, שבהם נתונים מסוימים חיוניים ואחרים אופציונליים.

הפלט הצפוי:

Inception (2010)
Director: Christopher Nolan
Rating: 8.8
The Matrix (1999)
Director: Unknown
Rating: 8.7
Upcoming Film (2025)
Director: Unknown
Rating: Not rated

נסו בעצמכם

import 'movie.dart';

void main() {
  // TODO: צור סרט עם הכותרת 'Inception' והשנה 2010
  // לאחר מכן הגדר את הבמאי שלו ל-'Christopher Nolan' ואת הדירוג ל-8.8
  
  // TODO: צור סרט עם הכותרת 'The Matrix' והשנה 1999
  // לאחר מכן הגדר רק את הדירוג שלו ל-8.7 (השאר את הבמאי כ-null)
  
  // TODO: צור סרט עם הכותרת 'Upcoming Film' והשנה 2025
  // השאר גם את הבמאי וגם את הדירוג כ-null
  
  // TODO: קרא ל-displayInfo() עבור כל סרט לפי הסדר
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Dart אונליין