בטיחות מפני ערכי null במחלקות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 28 מתוך 110.
בעת תכנון מחלקות, עליך להחליט אילו שדות נדרשים ואילו אופציונליים. בטיחות מפני ערכי null משפיעה על האופן שבו אתה מצהיר על משתני מופע וכותב בנאים.
יש לאתחל שדות שאינם ניתנים להקצאת ערך null לפני שהגוף של הבנאי מופעל. אפשר לעשות זאת באמצעות רשימות אתחול, פרמטרים של הבנאי או ערכי ברירת מחדל:
class User {
String name; // חייב לעבור אתחול
String? bio; // אופציונלי - יכול להיות null
int age = 0; // יש לו ערך ברירת מחדל
User(this.name); // name מאותחל באמצעות פרמטר
}בשדות שניתנים ל-null, אפשר להשאיר אותם ללא אתחול, מכיוון שברירת המחדל שלהם היא null. הדבר שימושי לנתונים אופציונליים:
class Product {
String title;
String? description; // תיאור מוצר אופציונלי
double? discount; // ללא הנחה כברירת מחדל
Product(this.title);
}
var item = Product('Laptop');
print(item.description); // null
print(item.discount); // nullבעת גישה לשדות שיכולים להיות null, השתמשו באופרטורים המודעים ל-null שלמדתם:
class Order {
String id;
User? customer;
Order(this.id);
String getCustomerName() {
return customer?.name ?? 'Guest';
}
}מילת המפתח required בפרמטרים בעלי שם מבטיחה שהקוראים לפונקציה יספקו ערכים חיוניים:
class Account {
String email;
String? phone;
Account({required this.email, this.phone});
}
var acc = Account(email: 'test@mail.com'); // phone הוא אופציונליעל ידי בחירה מושכלת בין שדות שיכולים להיות null לשדות שאינם יכולים להיות null, יוצרים מחלקות שמבהירות אילו נתונים חיוניים ואילו נתונים הם אופציונליים.
אתגר
קלבואו נבנה מערכת הזמנות למלון שמדגימה כיצד לתכנן מחלקות עם שילוב מושכל של שדות נדרשים ואופציונליים באמצעות בטיחות מפני ערכי null.
תארגנו את הקוד שלכם בשני קבצים:
reservation.dart: הגדירו מחלקהReservationשמייצגת הזמנה למלון. כל הזמנה צריכה מידע חיוני מסוים, אבל פרטים מסוימים הם תוספות אופציונליות שהאורחים עשויים לספק או לא לספק. המחלקה שלכם צריכה לכלול:String guestNameשאינו nullable — לכל הזמנה חייב להיות שם אורחint roomNumberשאינו nullable — לכל הזמנה חייב להיות מוקצה חדרint nightsשאינו nullable עם ערך ברירת מחדל1— השהייה המינימלית היא לילה אחדString? specialRequestsשהוא nullable — לאורחים עשויות להיות בקשות מיוחדותDateTime? checkInTimeשהוא nullable — ייתכן ששעת ההגעה המדויקת אינה ידועה- בנאי המשתמש בפרמטרים בעלי שם, עם
requiredעבורguestNameו-roomNumber, בעוד ש-nightsצריך להיות אופציונלי עם ערך ברירת המחדל שלו - מתודה
getRequestsSummary()שמחזירה את הבקשות המיוחדות אם סופקו, או'No special requests'באמצעות האופרטור?? - מתודה
getArrivalInfo()שמחזירה את הייצוג כמחרוזת של שעת הצ'ק-אין באמצעות?., אוnullאם לא הוגדרה - מתודה
printConfirmation()שמציגה את פרטי ההזמנה
main.dart: ייבאו את מחלקת ההזמנה שלכם וצרו הזמנות שמציגות שילובים שונים של נתונים נדרשים ואופציונליים:- צרו הזמנה לאורחת
'Sarah Johnson'בחדר101למשך3לילות, עם בקשות מיוחדות'Late checkout'ושעת צ'ק-אין שמוגדרת ל-DateTime(2024, 6, 15, 14, 30) - צרו הזמנה לאורח
'Mike Chen'בחדר205(השתמשו בברירת המחדל של מספר הלילות), והגדירו רק בקשות מיוחדות ל-'Extra pillows' - צרו הזמנה לאורחת
'Emma Davis'בחדר310למשך2לילות (השאירו את שני השדות האופציונליים כ-null) - עבור כל הזמנה לפי הסדר, קראו ל-
printConfirmation(), ואז הדפיסוArrival: [result]באמצעותgetArrivalInfo()
- צרו הזמנה לאורחת
המתודה printConfirmation() צריכה להדפיס בפורמט הזה:
=== Reservation Confirmed ===
Guest: [guestName]
Room: [roomNumber]
Nights: [nights]
Requests: [getRequestsSummary()]הפלט הצפוי:
=== Reservation Confirmed ===
Guest: Sarah Johnson
Room: 101
Nights: 3
Requests: Late checkout
Arrival: 2024-06-15 14:30:00.000
=== Reservation Confirmed ===
Guest: Mike Chen
Room: 205
Nights: 1
Requests: Extra pillows
Arrival: null
=== Reservation Confirmed ===
Guest: Emma Davis
Room: 310
Nights: 2
Requests: No special requests
Arrival: nullנסו בעצמכם
import 'reservation.dart';
void main() {
// TODO: צור הזמנה עבור 'Sarah Johnson'
// חדר 101, 3 לילות, בקשות מיוחדות: 'Late checkout'
// שעת הצ'ק-אין: DateTime(2024, 6, 15, 14, 30)
// TODO: צור הזמנה עבור 'Mike Chen'
// חדר 205, השתמש במספר הלילות המוגדר כברירת מחדל, בקשות מיוחדות: 'Extra pillows'
// לא צוינה שעת צ'ק-אין
// TODO: צור הזמנה עבור 'Emma Davis'
// חדר 310, 2 לילות, ללא בקשות מיוחדות וללא שעת צ'ק-אין
// TODO: עבור כל הזמנה לפי הסדר:
// 1. קרא ל־printConfirmation()
// 2. הדפס 'Arrival: [result]' באמצעות getArrivalInfo()
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין