בדיקה אם מפתחות וערכים קיימים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 27 מתוך 65.
לפני שניגשים לנתונים בתוך Map, חשוב לוודא שהמפתח או הערך שאתם מחפשים אכן קיימים. Dart מספקת שתי שיטות לכך: containsKey() ו-containsValue().
המתודה containsKey() בודקת אם מפתח מסוים קיים במפה, ומחזירה true אם הוא נמצא ו-false אחרת. היא שימושית במיוחד לפני ניסיון לגשת לערך, ועוזרת לך להימנע משגיאות אפשריות.
Map<String, String> userPermissions = {
'user123': 'admin',
'user456': 'editor',
'user789': 'viewer'
};
bool hasUser = userPermissions.containsKey('user123');
print(hasUser); // true
bool hasUnknownUser = userPermissions.containsKey('user999');
print(hasUnknownUser); // falseבאופן דומה, containsValue() בודקת אם ערך מסוים קיים במקום כלשהו במפה. המתודה הזו מחפשת בכל הערכים ומחזירה true אם היא מוצאת התאמה.
bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin); // trueהשיטות האלה חיוניות לכתיבת קוד בטוח שמטפל היטב בנתונים חסרים ומונע שגיאות בזמן ריצה בעת עבודה עם תוכן דינמי של מפה.
אתגר
קלצרו תוכנית שמנהלת מערכת לאימות משתמשים באמצעות אימות פרטי הכניסה של המשתמשים ובדיקת רמות ההרשאה. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם המערכת
- לקרוא כמה זוגות של קלטים שמייצגים שמות משתמשים ורמות הרשאה שלהם (הקלט יסתיים כשתקבלו
"users_done") - לקרוא קלט מסוג מחרוזת שמייצג את שם המשתמש לבדיקה
- לקרוא קלט מסוג מחרוזת שמייצג את רמת ההרשאה לאימות
- ליצור Map לאחסון שמות משתמשים כמפתחות ורמות ההרשאה שלהם כערכים
- להשתמש ב-
containsKey()כדי לבדוק אם שם המשתמש קיים במערכת - להשתמש ב-
containsValue()כדי לבדוק אם רמת ההרשאה שצוינה קיימת במקום כלשהו במערכת - להדפיס את ניתוח האימות בפורמט המדויק שמוצג למטה
לדוגמה, אם שם המערכת הוא "Corporate Network", המשתמשים כוללים את "alice" עם "admin", את "bob" עם "editor", את "charlie" עם "viewer", את "diana" עם "admin", שם המשתמש לבדיקה הוא "alice", ורמת ההרשאה לאימות היא "admin", התוכנית שלכם צריכה להפיק:
System: Corporate Network
User Database: {alice: admin, bob: editor, charlie: viewer, diana: admin}
Authentication Check:
Username 'alice' exists: true
Permission 'admin' exists in system: true
User 'alice' has permission 'admin': true
Access Status: GRANTED - User authenticated with valid permissions
Security Level: High (admin access detected)אם שם המערכת הוא "School Portal", המשתמשים כוללים את "teacher1" עם "instructor", את "student1" עם "student", את "admin1" עם "administrator", שם המשתמש לבדיקה הוא "guest", ורמת ההרשאה לאימות היא "student", התוכנית שלכם צריכה להפיק:
System: School Portal
User Database: {teacher1: instructor, student1: student, admin1: administrator}
Authentication Check:
Username 'guest' exists: false
Permission 'student' exists in system: true
User 'guest' has permission 'student': false
Access Status: DENIED - Username not found in system
Security Level: Low (user not registered)אם שם המערכת הוא "Library System", המשתמשים כוללים את "librarian" עם "staff", את "member1" עם "member", את "member2" עם "member", שם המשתמש לבדיקה הוא "librarian", ורמת ההרשאה לאימות היא "premium", התוכנית שלכם צריכה להפיק:
System: Library System
User Database: {librarian: staff, member1: member, member2: member}
Authentication Check:
Username 'librarian' exists: true
Permission 'premium' exists in system: false
User 'librarian' has permission 'premium': false
Access Status: DENIED - Permission level not available
Security Level: Medium (valid user, invalid permission)התוכנית שלכם חייבת להשתמש ב-containsKey() כדי לוודא אם שם המשתמש קיים, וב-containsValue() כדי לבדוק אם רמת ההרשאה קיימת במקום כלשהו במערכת. כדי לבדוק אם למשתמש המסוים יש את ההרשאה המסוימת, השוו בין רמת ההרשאה בפועל של המשתמש לבין הרמה המבוקשת. קבעו את רמת האבטחה על סמך התוצאות: "High" אם הגישה אושרה עם הרשאות מסוג מנהל (admin, administrator, staff), "Medium" אם המשתמש קיים אך ההרשאות שלו שגויות, ו-"Low" אם המשתמש אינו קיים. פורמט הקלט יהיה: שם המערכת, לאחריו שמות משתמשים ורמות הרשאה לסירוגין, ובסוף "users_done", ולאחר מכן שם המשתמש לבדיקה ורמת ההרשאה לאימות.
נסו בעצמכם
import 'dart:io';
void main() {
// קרא את שם המערכת
String? systemName = stdin.readLineSync();
// צור Map לאחסון שמות המשתמשים ורמות ההרשאה שלהם
Map<String, String> userDatabase = {};
// קרא את נתוני המשתמשים עד "users_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "users_done") {
break;
}
String username = input!;
String? permission = stdin.readLineSync();
userDatabase[username] = permission!;
}
// קרא את שם המשתמש לבדיקה ואת רמת ההרשאה לאימות
String? usernameToCheck = stdin.readLineSync();
String? permissionToVerify = stdin.readLineSync();
// TODO: כתוב את הקוד שלך למטה
// השתמש ב-containsKey() כדי לבדוק אם שם המשתמש קיים
// השתמש ב-containsValue() כדי לבדוק אם רמת ההרשאה קיימת במערכת
// בדוק אם למשתמש המסוים יש את ההרשאה המסוימת
// קבע את מצב הגישה ואת רמת האבטחה:
// - "High (admin access detected)" אם הגישה אושרה AND ההרשאה היא admin, administrator, או staff
// - "Medium (standard access)" אם הגישה אושרה אך ההרשאה אינה מסוג admin
// - "Medium (valid user, invalid permission)" אם המשתמש קיים אך ההרשאה שלו שגויה
// - "Low (user not registered)" אם המשתמש אינו קיים
// הדפס את ניתוח האימות
print("System: $systemName");
print("User Database: $userDatabase");
print("Authentication Check:");
// הוסף כאן את פקודות הפלט שלך
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1מניפולציות מתקדמות ברשימות
מאפייני רשימה: ראשון ואחרוןמצב הרשימה: isEmpty ו-isNotEmpהיפוך רשימההוספה לרשימה: insertהסרת פריטים מרשימה: removeWhereחיפוש ברשימה: indexOfמיון רשימהערבוב רשימהסיכום – מארגן רשימות4מניפולציה מתקדמת של Map
מעבר על Mapבדיקה אם מפתחות וערכים קיימיםמאפייני Map: מפתחות וערכיםהוספה מותנית: putIfAbsentהסרת רשומות מ־MapMaps מקונניםסיכום – עדכון מלאי2פעולות פונקציונליות על רשימות
טרנספורמציה באמצעות 'map'סינון באמצעות 'where'שימוש ב-'.toList()'בדיקת תנאים באמצעות 'any'תנאים באמצעות 'every'איתור באמצעות 'firstWhere'סיכום – סינון נתונים5פרויקט: חישוב עגלת קניות
הגדרת הפרויקטהוספת פריטים לעגלה3קבוצות
מהי קבוצה?יצירת קבוצההוספה והסרה מקבוצותבדיקת נוכחות של איברים בקבוצההמרת רשימה לקבוצהאיחוד קבוצותחיתוך קבוצותהפרש קבוצותסיכום – רשימת אורחים ייחודית6טיפול בסיסי בשגיאות
מהן חריגות?בלוק ה-try-catchתפיסת חריגות באמצעות onבלוק ה-finallyהשלכת חריגהסיכום – חלוקה בטוחה9טיפוסי מנייה (Enums)
מה הם Enums?הגדרת Enum פשוטשימוש ב-Enums במשתניםEnums במשפטי 'switch'סיכום – רמזורתרגלו בעצמכם: קומפיילר Dart אונליין