מבוא לבטיחות מפני ערכי 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.
אתגר
קלבוא נבנה מערכת פשוטה לכרטיסי אנשי קשר שמדגימה את החשיבות של משתנים שאינם ניתנים ל-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() על כל איש קשר לפי הסדר
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםספריות וייבואמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותמשתני מופעיסודות הבנאיחזרה: מחשבון פשוט4בטיחות מפני ערכי null
מבוא לבטיחות מפני ערכי nullניתן להקצאה ל-null לעומת לא ניתן להקצאה ל-nullהאופרטורים ? ו-!מילת המפתח Late ובטיחות מפני ערכי nullאופרטורים מודעי nullבטיחות מפני ערכי null במחלקותסיכום – מערכת פרופילי משתמשים7מחלקות מופשטות וממשקים
מחלקות מופשטותמתודות מופשטותממשקים ב-Dartממשקים משתמעיםמימוש לעומת הורשהממשקים מרוביםחזרה – מחשבון צורות10אוספים וגנריות
סקירה כללית של List, Set ו-Mapאוספים בטוחים מבחינת טיפוסיםמחלקות גנריותמתודות גנריותאילוצים גנרייםIterable ו-Iteratorסיכום – אחסון גנרי13מושגי OOP מתקדמים
הרכבה לעומת הורשהמתודות הרחבהמחלקות קריאותמחלקות אטומות (Dart 3)רשומות (Dart 3)תבניות והתאמה (3.0)טיפוסים מונים עם מתודות16פרויקט: ניהול ספרייה
סקירת הפרויקטמחלקות ספר ומשתמש2בנאים ב-Dart
בנאי ברירת מחדלבנאים בעלי שםרשימות אתחולבנאים קבועיםבנאי Factoryבנאים מפניםסיכום - בונה צורות5כימוס
חברים ציבוריים לעומת פרטייםמוסכמת הקידומת _פרטיות ברמת הספרייההעמקה ב-getters וב-settersהסתרת מידעסיכום – רשומות תלמידים8מיקסינים
מבוא למיקסיניםיצירת מיקסיניםשימוש במספר מיקסיניםמילת המפתח on במיקסיניםמיקסינים לעומת ירושהמיקסינים לעומת ממשקסיכום – מערכת בעלי החיים3מאפייני מחלקה
איברי מופע לעומת איברים סטטייםשדות final ו-constמשתני lateמתודות ושדות סטטייםGetters ו-Settersסיכום – מנהל חשבונות בנק6ירושה
ירושה בסיסיתמילת המפתח superדריסת מתודותהאנוטציה @overrideמילת המפתח final למחלקהבנאים וירושהסיכום – היררכיית עובדים9פולימורפיזם
יסודות הפולימורפיזםפולימורפיזם באמצעות ממשקיםבדיקת טיפוסים בזמן ריצההאופרטורים is ו-asמילת המפתח קווריאנטיסיכום — מעבד תשלומים12תכנות מונחה עצמים אסינכרוני
Future-ים ו-async/awaitיסודות ה-Streamsבקרי Streamsבנאים אסינכרונייםאסינכרוניות במתודות של מחלקהסיכום - אחזור נתוניםתרגלו בעצמכם: קומפיילר Dart אונליין