אסינכרוניות במתודות של מחלקה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 80 מתוך 110.
עכשיו, לאחר שלמדת איך לטפל באתחול אסינכרוני באמצעות מתודות מפעל, בוא נבדוק איך להפוך מתודות מופע רגילות לאסינכרוניות. זה פשוט — רק הוסף async לכל מתודה ודאג שהיא תחזיר Future.
class WeatherService {
String _location;
WeatherService(this._location);
Future<String> fetchTemperature() async {
await Future.delayed(Duration(seconds: 1));
return '22°C in $_location';
}
Future<void> updateLocation(String newLocation) async {
await Future.delayed(Duration(milliseconds: 500));
_location = newLocation;
print('Location updated to $_location');
}
}
Future<void> main() async {
var service = WeatherService('London');
var temp = await service.fetchTemperature();
print(temp);
await service.updateLocation('Paris');
}מתודות אסינכרוניות יכולות לגשת למשתני מופע ולשנות אותם, בדיוק כמו מתודות רגילות. ההבדל העיקרי הוא שהקוראים להן חייבים להשתמש ב־await כדי להמתין לתוצאה. מתודות שמחזירות Future<void> אינן מחזירות ערך, אך עדיין צריך להמתין להן אם רוצים לוודא שהן מסתיימות לפני שממשיכים.
אפשר גם לשלב כמה קריאות אסינכרוניות בתוך מתודה, או לקרוא למתודות אסינכרוניות אחרות מאותה מחלקה:
Future<String> getFullReport() async {
var temp = await fetchTemperature();
var humidity = await fetchHumidity();
return '$temp, Humidity: $humidity';
}תבנית זו חיונית למחלקות שמתקשרות עם משאבים חיצוניים — ממשקי API, מסדי נתונים או כל פעולה שדורשת זמן.
אתגר
קלבואו נבנה מעקב אחר תיק מניות שמנהל את מחירי המניות ומחשב את ערכי התיק באמצעות מתודות אסינכרוניות! תיצרו מחלקה שמדמה שליפת נתוני מניות בזמן אמת ומשלבת כמה פעולות אסינכרוניות כדי להפיק דוחות.
תארגנו את הקוד שלכם בשני קבצים:
portfolio.dart: צרו מחלקהStockPortfolioשעוקבת אחר מניות וכמויותיהן. המחלקה שלכם צריכה לכלול:Map<String, int>פרטי בשם_holdingsששומר את סמלי המניות ואת מספר המניות שבבעלותכם- בנאי שמאתחל את
_holdingsכמפה ריקה - מתודה
addStock(String symbol, int quantity)שמוסיפה אחזקת מניה או מעדכנת אותה (לא אסינכרונית) - מתודה אסינכרונית
fetchPrice(String symbol)שמחזירהFuture<double>. דמו השהיה של 50 מילישניות, ואז החזירו מחיר המחושב כך: אורך הסמל כפול 25.5 - מתודה אסינכרונית
getStockValue(String symbol)שמחזירהFuture<double>. עליה להמתין ל-fetchPriceעבור הסמל, להכפיל בכמות המניות שבבעלותכם ולהחזיר את הערך הכולל. אם הסמל לא נמצא באחזקות, החזירו 0.0 - מתודה אסינכרונית
getTotalValue()שמחזירהFuture<double>. עליה לחשב את הערך המשולב של כל האחזקות באמצעות המתנה ל-getStockValueעבור כל מניה וסיכום התוצאות - מתודה אסינכרונית
generateReport()שמחזירהFuture<String>. עליה לבנות דוח המציג את הערך של כל מניה ואת הסכום הכולל. עצבו כל שורה כך:[symbol]: $[value](הערך יוצג עם ספרה אחת אחרי הנקודה העשרונית), ואחריה שורה אחרונהTotal: $[totalValue](גם היא עם ספרה אחת אחרי הנקודה העשרונית)
main.dart: ייבאו את קובץ התיק שלכם והדגימו כיצד מתודות אסינכרוניות פועלות יחד בתוך מחלקה:- צרו מופע של
StockPortfolio - הוסיפו את האחזקות הבאות:
AAPLעם 10 מניות,GOOGLעם 5 מניות,MSFTעם 8 מניות - הדפיסו
Fetching portfolio data... - המתינו לתוצאה של
generateReport()והדפיסו אותה
- צרו מופע של
שימו לב כיצד generateReport() קוראת למתודות אסינכרוניות אחרות באותה מחלקה, וכיצד כל מתודה מתבססת על קודמותיה. השתמשו ב-toStringAsFixed(1) כדי לעצב ערכים עשרוניים!
פלט צפוי:
Fetching portfolio data...
AAPL: $1020.0
GOOGL: $637.5
MSFT: $816.0
Total: $2473.5נסו בעצמכם
import 'portfolio.dart';
void main() async {
// TODO: ליצור מופע של StockPortfolio
// TODO: להוסיף אחזקות:
// - AAPL עם 10 מניות
// - GOOGL עם 5 מניות
// - MSFT עם 8 מניות
// TODO: להדפיס "Fetching portfolio data..."
// TODO: להמתין לתוצאה של generateReport() ולהדפיס אותה
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
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 אונליין