Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التحقق من المفاتيح والقيم

جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 27 من 65.

قبل الوصول إلى البيانات في Map، من الضروري التحقق من أن المفتاح أو القيمة التي تبحث عنها موجودة بالفعل. توفر Dart طريقتين لهذا الغرض: containsKey() و containsValue().

تتحقق الطريقة containsKey() مما إذا كان مفتاح معين موجوداً في الخريطة (map)، حيث تعيد 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() مما إذا كانت قيمة معينة موجودة في أي مكان في الخريطة (map). تبحث هذه الطريقة عبر جميع القيم وتُرجع true إذا وجدت تطابقاً.

bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin);  // true

تعد هذه الأساليب ضرورية لكتابة كود آمن يتعامل مع البيانات المفقودة بسلاسة، مما يمنع أخطاء وقت التشغيل (runtime errors) عند التعامل مع محتويات الخرائط الديناميكية.

challenge icon

التحدي

سهل

قم بإنشاء برنامج يدير نظام مصادقة المستخدم من خلال التحقق من بيانات اعتماد المستخدم وفحص مستويات الأذونات. يجب على برنامجك القيام بما يلي:

  1. قراءة مدخل نصي (string) يمثل اسم النظام
  2. قراءة أزواج متعددة من المدخلات تمثل أسماء المستخدمين ومستويات أذوناتهم (سينتهي الإدخال عندما تتلقى "users_done")
  3. قراءة مدخل نصي يمثل اسم المستخدم المراد التحقق منه
  4. قراءة مدخل نصي يمثل مستوى الإذن المراد التحقق منه
  5. إنشاء Map لتخزين أسماء المستخدمين كمفاتيح (keys) ومستويات أذوناتهم كقيم (values)
  6. استخدام containsKey() للتحقق مما إذا كان اسم المستخدم موجوداً في النظام
  7. استخدام containsValue() للتحقق مما إذا كان مستوى الإذن المحدد موجوداً في أي مكان في النظام
  8. طباعة تحليل المصادقة بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كان اسم النظام هو "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"، يليه اسم المستخدم المراد التحقق منه ومستوى الإذن المراد التحقق منه.

ورقة مرجعية

استخدم containsKey() للتحقق مما إذا كان مفتاح معين موجوداً في Map:

Map<String, String> userPermissions = {
  'user123': 'admin',
  'user456': 'editor',
  'user789': 'viewer'
};

bool hasUser = userPermissions.containsKey('user123');
print(hasUser);  // true

استخدم containsValue() للتحقق مما إذا كانت قيمة معينة موجودة في أي مكان في Map:

bool hasAdmin = userPermissions.containsValue('admin');
print(hasAdmin);  // true

تُرجع كلتا الطريقتين true في حال العثور على القيمة و false في حال عدم العثور عليها، مما يساعد في منع أخطاء وقت التشغيل (runtime errors) عند التعامل مع محتويات Map الديناميكية.

جرّب بنفسك

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)" إذا تم منح الوصول وكانت الصلاحية admin أو administrator أو staff
  //   - "Medium (standard access)" إذا تم منح الوصول ولكن الصلاحية ليست من نوع المسؤول (admin-type)
  //   - "Medium (valid user, invalid permission)" إذا كان المستخدم موجوداً ولكن لديه صلاحية خاطئة
  //   - "Low (user not registered)" إذا كان المستخدم غير موجود
  
  // طباعة تحليل المصادقة
  print("System: $systemName");
  print("User Database: $userDatabase");
  print("Authentication Check:");
  // أضف عبارات الإخراج الخاصة بك هنا
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow