מחלקות אטומות (Dart 3)
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 85 מתוך 110.
Dart 3 הציגה מחלקות אטומות, שמגבילות אילו מחלקות יכולות להרחיב אותן או לממש אותן. כשמסמנים מחלקה בתור sealed, רק מחלקות באותו קובץ יכולות להיות תתי־הסוגים הישירים שלה. כך נוצר אוסף סגור של תתי־סוגים ידועים.
sealed class Result {}
class Success extends Result {
final String data;
Success(this.data);
}
class Failure extends Result {
final String error;
Failure(this.error);
}העוצמה של מחלקות אטומות נובעת מבדיקת מיצוי. כשמבצעים switch על טיפוס אטום, המהדר מכיר את כל תתי-הטיפוסים האפשריים ומוודא שמטפלים בכל אחד מהם:
String handleResult(Result result) {
return switch (result) {
Success(data: var d) => 'Got: $d',
Failure(error: var e) => 'Error: $e',
};
// אין צורך ב-default – המהדר יודע שכל המקרים מכוסים!
}
void main() {
var success = Success('Hello');
var failure = Failure('Not found');
print(handleResult(success)); // Got: Hello
print(handleResult(failure)); // Error: Not found
}אם תוסיף תת־סוג חדש למחלקה אטומה, המהדר יסמן כל משפט switch שאינו מטפל בו. לכן מחלקות אטומות אידיאליות למידול מצבים, תוצאות או כל תרחיש שבו יש לך קבוצה קבועה של וריאנטים. בניגוד למחלקות מופשטות, מחלקות אטומות מבטיחות ששום קוד חיצוני לא יוכל להוסיף תת־סוגים בלתי צפויים.
אתגר
קלבואו נבנה מטפל בבקשות רשת באמצעות מחלקות sealed! תיצרו מערכת בטוחה מבחינת טיפוסים שמדגמת מצבים שונים של תגובת רשת, ומבטיחה שכל תוצאה אפשרית תטופל כראוי.
תארגנו את הקוד בשני קבצים:
response.dart: צרו היררכיית מחלקות sealed שמייצגת את כל המצבים האפשריים של תגובת רשת:- מחלקה sealed בשם
NetworkResponseשתשמש כמחלקת הבסיס של כל סוגי התגובות - מחלקה
Loadingשמרחיבה אתNetworkResponseוכוללת שדהString message(לדוגמה, "Fetching data...") - מחלקה
Successשמרחיבה אתNetworkResponseוכוללת שדהString dataושדהint statusCode - מחלקה
Errorשמרחיבה אתNetworkResponseוכוללת שדהString errorMessageושדהint errorCode
- מחלקה sealed בשם
main.dart: ייבאו את קובץ התגובה שלכם וצרו פונקציה שמטפלת בכל סוגי התגובות באמצעות ביטוי switch:- צרו פונקציה
handleResponse(NetworkResponse response)שמחזירהString - השתמשו בביטוי switch עם התאמת תבניות כדי לטפל בכל מקרה:
- עבור
Loading: החזירוStatus: [message] - עבור
Success: החזירוSuccess ([statusCode]): [data] - עבור
Error: החזירוError ([errorCode]): [errorMessage]
- עבור
- צרו שלושה מופעים של תגובות והדפיסו את התוצאה של הטיפול בכל אחד מהם:
Loadingעם הודעהPlease wait...Successעם נתוניםUser profile loadedוקוד מצב200Errorעם הודעת שגיאהNot foundוקוד שגיאה404
- צרו פונקציה
היתרון של מחלקות sealed הוא שהמהדר מוודא שאתם מטפלים בכל סוג תגובה אפשרי — אין צורך במקרה ברירת מחדל!
הפלט הצפוי:
Status: Please wait...
Success (200): User profile loaded
Error (404): Not foundנסו בעצמכם
import 'response.dart';
// TODO: צרו פונקציה handleResponse(NetworkResponse response)
// שמחזירה String
// השתמשו בביטוי switch עם התאמת תבניות כדי לטפל בכל מקרה:
// - עבור Loading: החזירו "Status: [message]"
// - עבור Success: החזירו "Success ([statusCode]): [data]"
// - עבור Error: החזירו "Error ([errorCode]): [errorMessage]"
void main() {
// TODO: צרו מופע של Loading עם message "Please wait..."
// TODO: צרו מופע של Success עם data "User profile loaded" וקוד סטטוס 200
// TODO: צרו מופע של Error עם הודעת שגיאה "Not found" וקוד שגיאה 404
// TODO: הדפיסו את התוצאה של הטיפול בכל תגובה
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין