التغليف والثوابت
أخفِ الحالة الداخلية، وأظهر عمليات آمنة، وحافظ على صحة ثوابت الفئة (مثل رصيد غير سالب ونطاقات صالحة).
التغليف والثوابت درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.
نظرة عامة على التغليف
الهدف: حماية حالة الكائن.
- التغليف: إخفاء الحقول وعرض واجهات برمجية آمنة
- الثابت: قاعدة تكون صحيحة دائمًا
- تحقق من الصحة في المُنشئات وملحقات الضبط والأساليب
واجهة للقراءة فقط
أبقِ الحقول خاصة. امنح المستدعين خاصية للقراءة فقط وعمليات آمنة.
using System;
// Expose read-only view; mutate via methods only
public class Counter
{
private int _value; // hidden state
public int Value // read-only to callers
{
get { return _value; }
private set { _value = value; } // keep setter private
}
public void Increment()
{
Value = Value + 1;
}
}
public class Program
{
public static void Main(string[] args)
{
Counter c = new Counter();
c.Increment();
c.Increment();
Console.WriteLine("Value = " + c.Value);
}
}
حواجز المُنشئ
يضبط المُنشئون الحالة المطلوبة. تحقّق من المدخلات غير الصالحة للحفاظ على صلاحية الكائنات منذ البداية.
using System;
// Enforce rules early (constructor guard)
public class User
{
public string Name { get; private set; }
public int Age { get; private set; }
public User(string name, int age)
{
if (string.IsNullOrEmpty(name)) throw new ArgumentException("name");
if (age < 0) throw new ArgumentOutOfRangeException("age");
Name = name;
Age = age;
}
}
public class Program
{
public static void Main(string[] args)
{
try
{
User u = new User("Ada", 28);
Console.WriteLine(u.Name + " (" + u.Age + ")");
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
}
الثابت عمليًا
حدّد ثابتًا (مثلًا: Balance ≥ 0) وطبّقه في ملحقات الضبط والأساليب.
using System;
// Invariant: Balance >= 0 at all times
public class BankAccount
{
private decimal _balance;
public decimal Balance
{
get { return _balance; }
private set
{
if (value < 0) throw new InvalidOperationException("Balance would be negative");
_balance = value;
}
}
public BankAccount(decimal opening)
{
if (opening < 0) throw new ArgumentOutOfRangeException("opening");
_balance = opening;
}
public void Deposit(decimal amount)
{
if (amount <= 0) throw new ArgumentOutOfRangeException("amount");
Balance = Balance + amount;
}
public bool TryWithdraw(decimal amount)
{
if (amount <= 0) return false;
if (Balance - amount < 0) return false;
Balance = Balance - amount;
return true;
}
}
public class Program
{
public static void Main(string[] args)
{
BankAccount a = new BankAccount(50m);
a.Deposit(20m);
bool ok = a.TryWithdraw(100m); // fails, invariant protected
Console.WriteLine("ok=" + ok + " balance=" + a.Balance);
}
}
حماية المجموعات
لا تعرض القوائم أو المصفوفات الداخلية مباشرةً. أعد نسخة (أو طريقة عرض للقراءة فقط) لحماية الثوابت.
using System;
using System.Collections.Generic;
public class Tags
{
private readonly List<string> _items = new List<string>();
public void Add(string tag)
{
if (string.IsNullOrWhiteSpace(tag)) return;
_items.Add(tag.Trim());
}
// Expose a copy so callers cannot mutate internal list
public List<string> GetAllCopy()
{
return new List<string>(_items);
}
}
public class Program
{
public static void Main(string[] args)
{
Tags t = new Tags();
t.Add(" apple ");
t.Add("banana");
List<string> view = t.GetAllCopy();
view.Add("hacker"); // modifies the copy only
Console.WriteLine("copy count=" + view.Count);
Console.WriteLine("original count=" + t.GetAllCopy().Count);
}
}
نصائح التغليف
قائمة التحقق:
- حقول خاصة؛ وخصائص وأساليب عامة.
- تحقق من الصحة في المُنشئ وملحقات الضبط.
- حافظ على صحة الثوابت بعد كل استدعاء.
- لا تسرّب المجموعات الداخلية.
مبدأ التغليف
مراجعة
مراجعة: طبّق التغليف باستخدام الحقول الخاصة وواجهات برمجية تتحقق من الصحة. حدّد ثابتًا وطبّقه في المُنشئات وملحقات الضبط والأساليب. لا تسرّب المجموعات الداخلية أبدًا.
الأسئلة الشائعة
هل درس «التغليف والثوابت» مجاني؟
نعم — نص درس «التغليف والثوابت» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.
ماذا ستتعلم في «التغليف والثوابت»؟
أخفِ الحالة الداخلية، وأظهر عمليات آمنة، وحافظ على صحة ثوابت الفئة (مثل رصيد غير سالب ونطاقات صالحة). تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.
كم من الوقت يستغرق درس «التغليف والثوابت»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.