Menu
Coddy logo textTech

אסינכרוניות במתודות של מחלקה

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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, מסדי נתונים או כל פעולה שדורשת זמן.

challenge icon

אתגר

קל

בואו נבנה מעקב אחר תיק מניות שמנהל את מחירי המניות ומחשב את ערכי התיק באמצעות מתודות אסינכרוניות! תיצרו מחלקה שמדמה שליפת נתוני מניות בזמן אמת ומשלבת כמה פעולות אסינכרוניות כדי להפיק דוחות.

תארגנו את הקוד שלכם בשני קבצים:

  • 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() ולהדפיס אותה
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Dart אונליין