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

إخفاء البيانات

جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 12 من 87.

إخفاء المعلومات هو مبدأ تقييد الوصول المباشر إلى البيانات الداخلية للكائن. من خلال دمج حقول private مع دوال الجلب (getters) ودوال التعيين (setters)، فإنك تنشئ حاجزاً وقائياً حول حالة الكائن الخاص بك.

تأمل ما يحدث بدون إخفاء المعلومات:

public class Temperature {
    public double celsius;  // مكشوفة بشكل مباشر
}

// يمكن لأي شخص تعيين قيم غير صالحة
Temperature t = new Temperature();
t.celsius = -500;  // أقل من الصفر المطلق - مستحيل!

باستخدام إخفاء المعلومات، يمكنك التحكم في كيفية الوصول إلى البيانات وتعديلها:

public class Temperature {
    private double celsius;
    
    public void setCelsius(double celsius) {
        if (celsius >= -273.15) {
            this.celsius = celsius;
        }
    }
    
    public double getCelsius() {
        return celsius;
    }
}

الآن يتم رفض درجات الحرارة غير الصالحة تلقائيًا. التمثيل الداخلي مخفي - يمكنك لاحقًا تغيير كيفية تخزين درجة الحرارة داخليًا (ربما إلى كلفن) دون التأثير على الكود الذي يستخدم الفئة (class).

يوفر هذا النهج ثلاث فوائد رئيسية: التحقق من الصحة يضمن سلامة البيانات، والمرونة تسمح بإجراء تغييرات داخلية دون كسر الكود الخارجي، والتحكم يتيح لك تحديد العمليات المسموح بها بالضبط على بياناتك.

challenge icon

التحدي

سهل

لنقم ببناء فئة Password لإدارة كلمات المرور توضح مفهوم إخفاء المعلومات (information hiding) من خلال حماية البيانات الحساسة وفرض قواعد الأمان عبر الوصول المتحكم فيه.

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • Password.java: قم بإنشاء فئة Password تخفي بياناتها الداخلية وتتحكم في كيفية تعيين كلمات المرور والوصول إليها:
    • حقل password خاص (String) يخزن كلمة المرور الفعلية
    • حقل minLength خاص (int) يحدد الحد الأدنى لطول كلمة المرور المقبول
    • منشئ (constructor) يأخذ متطلب الحد الأدنى للطول
    • دالة تعيين (setter) باسم setPassword(String password) تقبل فقط كلمات المرور التي تستوفي متطلب الحد الأدنى للطول. إذا كانت صالحة، قم بتخزينها وإرجاع true؛ وإذا كانت قصيرة جدًا، لا تغير كلمة المرور وأرجع false
    • دالة جلب (getter) باسم getMaskedPassword() ترجع كلمة المرور مع استبدال جميع الأحرف بعلامات النجمة (*) - لا تكشف أبدًا عن كلمة المرور الفعلية!
    • دالة checkPassword(String attempt) ترجع true إذا كانت المحاولة تطابق كلمة المرور المخزنة، و false بخلاف ذلك
    • دالة جلب (getter) باسم getLength() ترجع طول كلمة المرور الحالية (أو 0 إذا لم يتم تعيين كلمة مرور)
  • Main.java: قم بإنشاء كائن Password بحد أدنى للطول يبلغ 6، ثم اقرأ مدخلين: كلمة مرور لتعيينها ومحاولة للتحقق منها. اطبع ثلاثة أسطر:
    • Set: true أو Set: false (نتيجة تعيين كلمة المرور)
    • Masked: ****** (النسخة المقنعة من كلمة المرور)
    • Match: true أو Match: false (نتيجة التحقق من المحاولة)

ستتلقى مدخلين: كلمة المرور المراد تعيينها، ومحاولة كلمة المرور للتحقق منها.

لاحظ كيف لا يمكن الوصول إلى كلمة المرور الفعلية مباشرة من خارج الفئة - هذا هو تطبيق لمفهوم إخفاء المعلومات. تتحكم الفئة تمامًا في المعلومات التي يتم الكشف عنها وكيفية تعديل كلمة المرور.

ورقة مرجعية

يؤدي إخفاء المعلومات (Information hiding) إلى تقييد الوصول المباشر إلى البيانات الداخلية للكائن باستخدام حقول private مقترنة بأساليب الجلب (getters) والتعيين (setters).

بدون إخفاء المعلومات، تكون الحقول مكشوفة ويمكن تعيينها لقيم غير صالحة:

public class Temperature {
    public double celsius;  // Exposed directly
}

Temperature t = new Temperature();
t.celsius = -500;  // Invalid value allowed

مع إخفاء المعلومات، يمكنك التحكم في الوصول والتحقق من صحة البيانات:

public class Temperature {
    private double celsius;
    
    public void setCelsius(double celsius) {
        if (celsius >= -273.15) {
            this.celsius = celsius;
        }
    }
    
    public double getCelsius() {
        return celsius;
    }
}

الفوائد الرئيسية لإخفاء المعلومات:

  • التحقق من الصحة (Validation): يضمن سلامة البيانات من خلال رفض القيم غير الصالحة
  • المرونة (Flexibility): يسمح بإجراء تغييرات داخلية دون التأثير على الكود الخارجي
  • التحكم (Control): يتيح لك تحديد العمليات المسموح بها على بياناتك

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة كلمة المرور لتعيينها
        String passwordToSet = scanner.nextLine();
        // قراءة محاولة كلمة المرور للتحقق منها
        String passwordAttempt = scanner.nextLine();
        
        // TODO: إنشاء كائن Password بطول أدنى قدره 6
        
        // TODO: تعيين كلمة المرور وطباعة النتيجة ("Set: true" أو "Set: false")
        
        // TODO: طباعة كلمة المرور المقنعة ("Masked: ******")
        
        // TODO: التحقق من محاولة كلمة المرور وطباعة النتيجة ("Match: true" أو "Match: false")
        
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming