Menu
Coddy logo textTech

מילת המפתח Late ובטיחות מפני ערכי null

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 26 מתוך 110.

לפעמים צריך משתנה שאינו יכול לקבל ערך null, אבל אי אפשר להקצות לו ערך מיד. מילת המפתח late אומרת ל-Dart: "אני מבטיח לאתחל אותו לפני שאשתמש בו."

late String description;

void setup() {
  description = 'Initialized later';
}

void main() {
  setup();
  print(description);  // עובד - אותחל לפני השימוש
}

בלי late, Dart תתלונן ש־description לא מאותחל. עם late, האחריות לוודא שיש לו ערך לפני הגישה אליו מוטלת עליך. אם תנסה לקרוא אותו לפני האתחול, תקבל שגיאת זמן ריצה.

מקרה שימוש נפוץ הוא חישובים יקרים שברצונך לדחות עד שיהיה בהם צורך בפועל:

class DataProcessor {
  late List<int> data = _loadData();
  
  List<int> _loadData() {
    print('Loading data...');
    return [1, 2, 3, 4, 5];
  }
}

DataProcessor processor = DataProcessor();
// 'Loading data...' עדיין לא הודפס
print(processor.data);  // עכשיו הנתונים נטענים ומודפסים

המתודה _loadData() מופעלת רק כאשר ניגשים לראשונה אל data, ולא כאשר האובייקט נוצר. אתחול עצל זה יכול לשפר את הביצועים כאשר ייתכן שלא יהיה צורך בערך כלל.

השתמשו ב־late כשאתם בטוחים שמשתנה יאותחל לפני השימוש בו, אבל אינכם יכולים לעשות זאת בזמן ההכרזה עליו. זוהי הבטחה למהדר — אם תפרו אותה, התוכנית שלכם תקרוס.

challenge icon

אתגר

קל

בואו נבנה מנהל תצורה שמדגים את העוצמה של משתני late לאתחול מושהה. תיצור מערכת שבה פעולות הגדרה יקרות מתבצעות רק כשיש צורך ממשי בתצורה.

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

  • config_manager.dart: הגדר מחלקה בשם ConfigManager שמטפלת בהגדרות היישום. למחלקה צריכים להיות:
    • String appName שמועבר דרך הבנאי
    • late String databaseUrl שיאותחל בהמשך באמצעות שיטת הגדרה
    • late int maxConnections עם אתחול עצלני שמדפיס Calculating max connections... בפעם הראשונה שניגשים אליו ומחזיר 100
    • שיטה setupDatabase(String url) שמאתחלת את databaseUrl
    • שיטה displayConfig() שמדפיסה את התצורה הנוכחית
  • main.dart: ייבא את מנהל התצורה שלך והדגם כיצד משתני late פועלים:
    • צור ConfigManager עם שם היישום 'MyApp'
    • הדפס Config created
    • קרא ל-setupDatabase עם כתובת ה-URL 'localhost:5432/mydb'
    • הדפס Accessing max connections...
    • הדפס את הערך של maxConnections
    • הדפס Accessing max connections again...
    • הדפס שוב את הערך של maxConnections (שים לב שהודעת החישוב אינה מופיעה שוב)
    • קרא ל-displayConfig()

השיטה displayConfig() צריכה להדפיס בפורמט הזה:

--- Configuration ---
App: [appName]
Database: [databaseUrl]
Max Connections: [maxConnections]

שים לב שחישוב האתחול העצלני של maxConnections מתבצע פעם אחת בלבד — בפעם הראשונה שניגשים אליו. זה היתרון של late עם מאתחל!

פלט צפוי:

Config created
Accessing max connections...
Calculating max connections...
100
Accessing max connections again...
100
--- Configuration ---
App: MyApp
Database: localhost:5432/mydb
Max Connections: 100

נסו בעצמכם

import 'config_manager.dart';

void main() {
  // TODO: צרו ConfigManager עם שם האפליקציה 'MyApp'
  
  // TODO: הדפיסו 'Config created'
  
  // TODO: קראו ל-setupDatabase עם URL 'localhost:5432/mydb'
  
  // TODO: הדפיסו 'Accessing max connections...'
  
  // TODO: הדפיסו את הערך של maxConnections
  
  // TODO: הדפיסו 'Accessing max connections again...'
  
  // TODO: הדפיסו שוב את הערך של maxConnections
  // (שימו לב שהודעת החישוב אינה מופיעה שוב)
  
  // TODO: קראו ל-displayConfig()
}
quiz iconבחנו את עצמכם

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

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

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