Menu
Coddy logo textTech

מבוא לבטיחות מפני ערכי null

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

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

ללא בטיחות null, כל משתנה עלול להיות null, מה שעלול לגרום לקריסות בזמן ריצה כשמנסים להשתמש בו:

// בגרסאות ישנות של Dart (ללא בטיחות מפני null)
String name;  // יכול להיות null!
print(name.length);  // התוכנית תקרוס אם name הוא null

כאשר בטיחות מול ערכי null מופעלת (Dart 2.12+), המהדר מבדיל בין משתנים שיכולים להכיל null לבין אלה שלא. כברירת מחדל, משתנים הם לא ניתנים לאיפוס - הם חייבים תמיד להכיל ערך תקין:

String name = 'Alice';  // חייב להיות לו ערך
print(name.length);     // בטוח - name לעולם אינו null

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

challenge icon

אתגר

קל

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

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

  • contact.dart: הגדר מחלקה בשם Contact שמייצגת את פרטי הקשר של אדם. מכיוון שאנחנו עובדים עם בטיחות מפני null, לכל שדה חייב להיות ערך תקין — אסור שחסר מידע! המחלקה שלך צריכה לכלול:
    • String firstName עבור השם הפרטי של איש הקשר
    • String lastName עבור שם המשפחה של איש הקשר
    • String email עבור כתובת האימייל של איש הקשר
    • int phoneDigits עבור מספר הספרות במספר הטלפון שלו
    • בנאי שמקבל את כל ארבעת הערכים
    • getter בשם fullName שמחזיר את השם הפרטי ואת שם המשפחה יחד, עם רווח ביניהם
    • מתודה בשם displayCard() שמדפיסה את פרטי איש הקשר
  • main.dart: ייבא את מחלקת איש הקשר שלך וצור שני אנשי קשר כדי להדגים שלכל השדות מובטח שיהיו ערכים:
    • צור איש קשר עם השם הפרטי 'Emma', שם המשפחה 'Wilson', האימייל 'emma@mail.com', ומספר ספרות הטלפון 10
    • צור איש קשר עם השם הפרטי 'James', שם המשפחה 'Brown', האימייל 'james@work.com', ומספר ספרות הטלפון 11
    • קרא למתודה displayCard() בכל אחד מאנשי הקשר, לפי הסדר שמופיע למעלה

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

--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]

שים לב שכל משתנה חייב להיות מאותחל בערך ממשי — כך פועלת בטיחות מפני null! המהדר מבטיח שכאשר ניגשים אל fullName, email או כל שדה אחר, הוא תמיד יכיל נתונים תקינים.

פלט צפוי:

--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11

נסו בעצמכם

import 'contact.dart';

void main() {
  // TODO: צרו את איש הקשר הראשון עם:
  // - שם פרטי: 'Emma'
  // - שם משפחה: 'Wilson'
  // - כתובת אימייל: 'emma@mail.com'
  // - ספרות במספר הטלפון: 10

  // TODO: צרו את איש הקשר השני עם:
  // - שם פרטי: 'James'
  // - שם משפחה: 'Brown'
  // - כתובת אימייל: 'james@work.com'
  // - ספרות במספר הטלפון: 11

  // TODO: קראו ל-displayCard() על כל איש קשר לפי הסדר
}
quiz iconבחנו את עצמכם

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

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

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