Menu
Coddy logo textTech

מחלקות אטומות (Dart 3)

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

Dart 3 הציגה מחלקות אטומות, שמגבילות אילו מחלקות יכולות להרחיב אותן או לממש אותן. כשמסמנים מחלקה בתור sealed, רק מחלקות באותו קובץ יכולות להיות תתי־הסוגים הישירים שלה. כך נוצר אוסף סגור של תתי־סוגים ידועים.

sealed class Result {}

class Success extends Result {
  final String data;
  Success(this.data);
}

class Failure extends Result {
  final String error;
  Failure(this.error);
}

העוצמה של מחלקות אטומות נובעת מבדיקת מיצוי. כשמבצעים switch על טיפוס אטום, המהדר מכיר את כל תתי-הטיפוסים האפשריים ומוודא שמטפלים בכל אחד מהם:

String handleResult(Result result) {
  return switch (result) {
    Success(data: var d) => 'Got: $d',
    Failure(error: var e) => 'Error: $e',
  };
  // אין צורך ב-default – המהדר יודע שכל המקרים מכוסים!
}

void main() {
  var success = Success('Hello');
  var failure = Failure('Not found');
  
  print(handleResult(success));  // Got: Hello
  print(handleResult(failure));  // Error: Not found
}

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

challenge icon

אתגר

קל

בואו נבנה מטפל בבקשות רשת באמצעות מחלקות sealed! תיצרו מערכת בטוחה מבחינת טיפוסים שמדגמת מצבים שונים של תגובת רשת, ומבטיחה שכל תוצאה אפשרית תטופל כראוי.

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

  • response.dart: צרו היררכיית מחלקות sealed שמייצגת את כל המצבים האפשריים של תגובת רשת:
    • מחלקה sealed בשם NetworkResponse שתשמש כמחלקת הבסיס של כל סוגי התגובות
    • מחלקה Loading שמרחיבה את NetworkResponse וכוללת שדה String message (לדוגמה, "Fetching data...")
    • מחלקה Success שמרחיבה את NetworkResponse וכוללת שדה String data ושדה int statusCode
    • מחלקה Error שמרחיבה את NetworkResponse וכוללת שדה String errorMessage ושדה int errorCode
  • main.dart: ייבאו את קובץ התגובה שלכם וצרו פונקציה שמטפלת בכל סוגי התגובות באמצעות ביטוי switch:
    • צרו פונקציה handleResponse(NetworkResponse response) שמחזירה String
    • השתמשו בביטוי switch עם התאמת תבניות כדי לטפל בכל מקרה:
      • עבור Loading: החזירו Status: [message]
      • עבור Success: החזירו Success ([statusCode]): [data]
      • עבור Error: החזירו Error ([errorCode]): [errorMessage]
    • צרו שלושה מופעים של תגובות והדפיסו את התוצאה של הטיפול בכל אחד מהם:
      • Loading עם הודעה Please wait...
      • Success עם נתונים User profile loaded וקוד מצב 200
      • Error עם הודעת שגיאה Not found וקוד שגיאה 404

היתרון של מחלקות sealed הוא שהמהדר מוודא שאתם מטפלים בכל סוג תגובה אפשרי — אין צורך במקרה ברירת מחדל!

הפלט הצפוי:

Status: Please wait...
Success (200): User profile loaded
Error (404): Not found

נסו בעצמכם

import 'response.dart';

// TODO: צרו פונקציה handleResponse(NetworkResponse response)
// שמחזירה String
// השתמשו בביטוי switch עם התאמת תבניות כדי לטפל בכל מקרה:
// - עבור Loading: החזירו "Status: [message]"
// - עבור Success: החזירו "Success ([statusCode]): [data]"
// - עבור Error: החזירו "Error ([errorCode]): [errorMessage]"

void main() {
  // TODO: צרו מופע של Loading עם message "Please wait..."
  
  // TODO: צרו מופע של Success עם data "User profile loaded" וקוד סטטוס 200
  
  // TODO: צרו מופע של Error עם הודעת שגיאה "Not found" וקוד שגיאה 404
  
  // TODO: הדפיסו את התוצאה של הטיפול בכל תגובה
}
quiz iconבחנו את עצמכם

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

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

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