تكرار السؤال: …
الإجابة المختصرة
تحدث عندما يتم استخدام الأنواع الأولية البسيطة (مثل string, int, double) لتمثيل مفاهيم دومين معقدة تحتوي على قواعد عمل محددة (مثل البريد، الهاتف، العملة، ورقم الهوية).
الشرح
تمثيل رقم الهاتف كـ string يعني أنه يمكن تمرير أي نص عشوائي للدالة ('abc123')، مما يجبر كل دالة في النظام على تكرار التحقق من صحة الرقم عبر Regex. الحل هو إنشاء كائن قيمة مخصص مثل PhoneNumber أو Email؛ يقوم الـ Constructor بالتحقق من القواعد مرة واحدة فقط عند الإنشاء، مما يضمن أن أي كائن موجود في النظام صالح بنسبة 100% ويمنع تمرير بيانات فاسدة للمنطق الداخلي.
مثال بالكود
class EmailAddress {
private readonly value: string;
constructor(raw: string) {
if (!raw.includes('@')) throw new InvalidEmailException(raw);
this.value = raw.toLowerCase().trim();
}
getValue() { return this.value; }
}أخطاء شائعة
- تمرير معرفات الكيانات كأرقام أو نصوص مجردة، مما يؤدي للخلط الكارثي بين customerId و orderId في معاملات الدوال المتشابهة.