תבניות והתאמה (3.0)
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 87 מתוך 110.
Dart 3 הציגה התאמת תבניות, דרך עוצמתית לפרק נתונים ולבדוק אותם בביטוי יחיד. תבניות מאפשרות לך לחלץ ערכים מאובייקטים, לבדוק את המבנה שלהם ולקשור משתנים — הכול בבת אחת.
כבר ראית פירוק בסיסי באמצעות רשומות. תבניות מרחיבות את האפשרות הזו לעבודה עם אובייקטים, רשימות ומפות:
void main() {
// תבניות רשימה
var numbers = [1, 2, 3];
var [a, b, c] = numbers;
print('$a, $b, $c'); // 1, 2, 3
// תבניות מפה
var user = {'name': 'Alice', 'age': 30};
var {'name': name, 'age': age} = user;
print('$name is $age'); // Alice בת 30
}דפוסים נעשים עוצמתיים במיוחד בביטויי switch. אפשר להתאים בו-זמנית לפי טיפוס, ערך ומבנה:
String describe(Object obj) {
return switch (obj) {
int n when n < 0 => 'Negative number',
int n => 'Positive number: $n',
String s => 'String of length ${s.length}',
[int first, ...] => 'List starting with $first',
_ => 'Something else',
};
}
void main() {
print(describe(-5)); // מספר שלילי
print(describe(42)); // מספר חיובי: 42
print(describe([1, 2, 3])); // רשימה שמתחילה ב-1
}סעיף when מוסיף תנאים לתבניות, ו-... מתאים לרכיבים הנותרים ברשימה. הקו התחתון _ משמש כתו כללי שמתאים לכל דבר. בשילוב עם מחלקות אטומות, תבניות מאפשרות טיפול ממצה ובטוח מבחינת טיפוסים במבני נתונים מורכבים.
אתגר
קלבואו נבנה מסווג נתונים שמשתמש בהתאמת תבניות כדי לנתח ולסווג סוגים שונים של קלט! תיצרו מערכת שיכולה לזהות ולתאר מבני נתונים שונים באמצעות תכונות התאמת התבניות העוצמתיות של Dart 3.
תארגנו את הקוד שלכם בשני קבצים:
classifier.dart: צרו פונקציה בשםclassifyשמקבלת פרמטר מסוגObjectומחזירה תיאור מסוגString. השתמשו בביטוי switch עם התאמת תבניות כדי לטפל במקרים הבאים:- רשימה ריקה
[]צריכה להחזירEmpty list - רשימה עם איבר שלם אחד בדיוק צריכה להחזיר
Single item: [value] - רשימה עם שני איברים בדיוק צריכה להחזיר
Pair: [first] and [second] - רשימה שמתחילה במספר שלם ואחריו איברים נוספים צריכה להחזיר
List starting with [first], length: [total length](השתמשו בתבנית השארית...) - מפה שמכילה גם את המפתחות
'name'וגם'age'צריכה להחזיר[name] is [age] years old(השתמשו בפירוק מבני של תבנית מפה) - מספר שלם שלילי (השתמשו בסעיף
when) צריך להחזירNegative: [value] - מספר שלם ששווה לאפס צריך להחזיר
Zero - כל מספר שלם אחר צריך להחזיר
Positive: [value] - כל ערך אחר צריך להחזיר
Unknown type
- רשימה ריקה
main.dart: ייבאו את המסווג שלכם והדגימו התאמת תבניות באמצעות מגוון קלטים. הדפיסו את התוצאה של סיווג כל אחד מהערכים הבאים:- רשימה ריקה
[] - רשימה עם איבר אחד:
[42] - רשימה עם שני איברים:
['hello', 'world'] - רשימה ארוכה יותר:
[1, 2, 3, 4, 5] - מפה:
{'name': 'Alice', 'age': 25} - המספר השלם
-10 - המספר השלם
0 - המספר השלם
99
- רשימה ריקה
האתגר הזה משלב תבניות רשימה, תבניות מפה, את סעיף when לבדיקת תנאים ואת תבנית השארית (...) — כל תכונות התאמת התבניות המרכזיות מהשיעור!
הפלט הצפוי:
Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99נסו בעצמכם
import 'classifier.dart';
void main() {
// TODO: השתמשו בפונקציה classify כדי לסווג כל ערך
// והדפיסו את התוצאות
// בדקו עם רשימה ריקה
print(classify([]));
// TODO: בדקו עם רשימה המכילה איבר אחד: [42]
// TODO: בדקו עם רשימה המכילה שני איברים: ['hello', 'world']
// TODO: בדקו עם רשימה ארוכה יותר: [1, 2, 3, 4, 5]
// TODO: בדקו עם מפה: {'name': 'Alice', 'age': 25}
// TODO: בדקו עם המספר השלם -10
// TODO: בדקו עם המספר השלם 0
// TODO: בדקו עם המספר השלם 99
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין