Menu
Coddy logo textTech

האופרטורים ? ו-!

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

בעבודה עם טיפוסים שיכולים להיות ריקים, Dart מספקת שני אופרטורים חיוניים לגישה בטוחה לערכים. אופרטור גישה מודע ל־null ?. ואופרטור הצהרה על אי־ריקות ! מאפשרים לך לשלוט באופן שבו תטפל בערכים שעשויים להיות null.

האופרטור ?. ניגש בבטחה למאפיינים או למתודות של ערך שניתן להיות null. אם הערך הוא null, הביטוי כולו מחזיר null במקום לקרוס:

String? name = 'Alice';
print(name?.length);  // 5

name = null;
print(name?.length);  // null (בלי קריסה!)

האופרטור ! אומר ל-Dart: "אני בטוח שהערך הזה אינו null." הוא ממיר טיפוס שניתן להיות null לטיפוס שלא ניתן להיות null, אך זורק שגיאה אם הערך אכן null:

String? maybeName = 'Bob';
String definite = maybeName!;  // תקין - אנו קובעים שהוא אינו null
print(definite.length);  // 3

String? empty = null;
// String crash = empty!;  // שגיאת זמן ריצה! הערך היה null

השתמשו ב־?. כשרוצים לטפל בערכי null בצורה בטוחה. השתמשו ב־! רק כשאתם בטוחים לחלוטין שערך קיים — אולי לאחר שבדקתם זאת באמצעות הצהרת if או כשידוע לכם שהלוגיקה מבטיחה ערך. שימוש מופרז ב־! מבטל את המטרה של בטיחות מפני null ועלול לגרום לקריסות בזמן ריצה.

challenge icon

אתגר

קל

בואו נבנה מערכת מלאי מוצרים שמדגימה איך לעבוד בבטחה עם ערכים שיכולים להיות null באמצעות האופרטורים ?. ו-!.

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

  • product.dart: הגדירו מחלקה בשם Product שמייצגת פריט במלאי. לחלק מהמוצרים יש מידע מלא, ואחרים עדיין נמצאים בתהליך רישום. המחלקה שלכם צריכה לכלול:
    • String name שאינו יכול להיות null — לכל מוצר חייב להיות שם
    • double price שאינו יכול להיות null — לכל מוצר חייב להיות מחיר
    • String? description שיכול להיות null — לחלק מהמוצרים עדיין אין תיאור
    • String? category שיכול להיות null — חלק מהמוצרים עדיין לא סווגו
    • בנאי שמקבל את name ואת price כפרמטרים נדרשים
    • מתודה בשם getDescriptionLength() שמחזירה את אורך התיאור באמצעות ?., או null אם אין תיאור
    • מתודה בשם getCategoryUppercase() שמחזירה את הקטגוריה באותיות גדולות באמצעות ! — המתודה מניחה שהקטגוריה הוגדרה
    • מתודה בשם displayProduct() שמדפיסה את פרטי המוצר, ומציגה No description כאשר התיאור הוא null ו-Uncategorized כאשר הקטגוריה היא null
  • main.dart: ייבאו את מחלקת המוצר והדגימו את שני האופרטורים:
    • צרו מוצר בשם 'Laptop' במחיר 999.99, ואז הגדירו את התיאור שלו כ-'High-performance computing device' ואת הקטגוריה שלו כ-'Electronics'
    • צרו מוצר בשם 'Mystery Item' במחיר 49.99 (השאירו את התיאור והקטגוריה בתור null)
    • עבור Laptop: קראו למתודה displayProduct(), הדפיסו Description length: [length] באמצעות getDescriptionLength(), והדפיסו Category: [uppercase] באמצעות getCategoryUppercase()
    • עבור Mystery Item: קראו למתודה displayProduct() והדפיסו Description length: [length] באמצעות getDescriptionLength() (הדבר יציג null)

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

Product: [name] - $[price]
Description: [description or "No description"]
Category: [category or "Uncategorized"]

פלט צפוי:

Product: Laptop - $999.99
Description: High-performance computing device
Category: Electronics
Description length: 32
Category: ELECTRONICS
Product: Mystery Item - $49.99
Description: No description
Category: Uncategorized
Description length: null

נסו בעצמכם

import 'product.dart';

void main() {
  // TODO: צרו מוצר בשם 'Laptop' במחיר 999.99
  // לאחר מכן הגדירו את התיאור שלו ל-'High-performance computing device'
  // והגדירו את הקטגוריה שלו ל-'Electronics'
  
  // TODO: צרו מוצר בשם 'Mystery Item' במחיר 49.99
  // השאירו את התיאור ואת הקטגוריה כ-null
  
  // TODO: עבור Laptop:
  // - קראו ל-displayProduct()
  // - הדפיסו "Description length: [length]" באמצעות getDescriptionLength()
  // - הדפיסו "Category: [uppercase]" באמצעות getCategoryUppercase()
  
  // TODO: עבור Mystery Item:
  // - קראו ל-displayProduct()
  // - הדפיסו "Description length: [length]" באמצעות getDescriptionLength()
}
quiz iconבחנו את עצמכם

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

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

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