אופרטורים מודעי null
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 27 מתוך 110.
מעבר ל-?. ול-!, Dart מספקת אופרטורים נוספים שהופכים את העבודה עם ערכים שיכולים להיות null לתמציתית יותר. אופרטורים מודעי-null אלה עוזרים לך לכתוב קוד נקי יותר כשעובדים עם ערכים שעשויים להיות null.
האופרטור לאיחוד ערכי null ?? מחזיר את הערך השמאלי אם הוא אינו null, אחרת הוא מחזיר את הערך הימני:
String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName); // Guest
nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName); // Alexאופרטור ההשמה המודע ל-null ??= משייך ערך רק אם המשתנה כרגע null:
String? username;
username ??= 'Anonymous';
print(username); // Anonymous
username ??= 'NewName';
print(username); // עדיין Anonymous (לא היה null)אפשר לשרשר את אופרטור הגישה המודעת ל־null ?. עבור מאפיינים מקוננים:
String? city = user?.address?.city; // בטוח גם אם user או address הם nullהאופרטורים האלה משתלבים היטב זה עם זה. לדוגמה, אפשר לגשת למאפיין שיכול להיות null ולספק ערך ברירת מחדל:
String greeting = user?.name ?? 'Stranger';
// אם user הוא null או user.name הוא null, השתמש ב-'Stranger'השימוש באופרטורים האלה שומר על הקוד שלך קריא תוך שמירה על בטיחות מפני ערכי null לאורך כל התוכנית.
אתגר
קלבואו נבנה מערכת לרישום אורחים שמדגימה כיצד אופרטורים שמודעים ל-null יכולים להפוך את הקוד שלכם לנקי יותר בעת טיפול במידע אופציונלי.
תארגנו את הקוד שלכם בשני קבצים:
guest.dart: הגדירו מחלקהGuestשמייצגת אדם שמשתתף באירוע. חלק מהאורחים מספקים פרטים מלאים, ואחרים מוסרים רק את הפרטים הבסיסיים. המחלקה שלכם צריכה לכלול:String nameשאינו יכול להיות null — לכל אורח חייב להיות שםString? emailשיכול להיות null — לא כולם מוסרים כתובת אימיילString? dietaryPreferenceשיכול להיות null — חלק מהאורחים לא מציינים העדפות תזונתיות- בנאי שמקבל את
nameכפרמטר חובה - מתודה
getDisplayEmail()שמחזירה את כתובת האימייל אם היא זמינה, או'No email provided'באמצעות האופרטור?? - מתודה
assignDefaultDiet()שמגדירה אתdietaryPreferenceלערך'Standard'רק אם הערך הנוכחי הוא null, באמצעות האופרטור??= - מתודה
getEmailDomain()שמחזירה את אורך כתובת האימייל באמצעות?., אוnullאם אין כתובת אימייל - מתודה
printBadge()שמדפיסה את פרטי תג האורח
main.dart: ייבאו את מחלקת האורח שלכם ורשמו שלושה אורחים עם רמות מידע שונות:- צרו אורחת בשם
'Alice', הגדירו את כתובת האימייל שלה ל-'alice@company.com'ואת ההעדפה התזונתית שלה ל-'Vegetarian' - צרו אורח בשם
'Bob', הגדירו רק את כתובת האימייל שלו ל-'bob@email.org'(השאירו את ההעדפה התזונתית כ-null) - צרו אורח בשם
'Charlie'(השאירו גם את כתובת האימייל וגם את ההעדפה התזונתית כ-null) - קראו למתודה
assignDefaultDiet()עבור שלושת האורחים - עבור כל אורח לפי הסדר, קראו למתודה
printBadge(), ואז הדפיסוEmail length: [result]באמצעותgetEmailDomain()
- צרו אורחת בשם
המתודה printBadge() צריכה להדפיס בפורמט הזה:
=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]שימו לב שההעדפה התזונתית של Alice נשארת 'Vegetarian' משום ש-??= משייך ערך רק כשהערך הוא null, ואילו Bob ו-Charlie מקבלים את ברירת המחדל של תזונה מסוג 'Standard'.
פלט צפוי:
=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: nullנסו בעצמכם
import 'guest.dart';
void main() {
// TODO: צרו אורחת בשם 'Alice'
// הגדירו את כתובת האימייל שלה ל-'alice@company.com'
// הגדירו את ההעדפה התזונתית שלה ל-'Vegetarian'
// TODO: צרו אורח בשם 'Bob'
// הגדירו רק את כתובת האימייל שלו ל-'bob@email.org'
// השאירו את ההעדפה התזונתית כ-null
// TODO: צרו אורח בשם 'Charlie'
// השאירו גם את כתובת האימייל וגם את ההעדפה התזונתית כ-null
// TODO: קראו ל-assignDefaultDiet() עבור כל שלושת האורחים
// TODO: עבור כל אורח לפי הסדר (Alice, Bob, Charlie):
// - קראו ל-printBadge()
// - הדפיסו 'Email length: [result]' באמצעות getEmailDomain()
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין