منطق التحقق من الصحة
جزء من قسم البرمجة كائنية التوجه في رحلة Lua على Coddy. الدرس 47 من 70.
حتى الآن، استكشفنا طرقًا مختلفة لحماية البيانات: إذ تشير اصطلاحات التسمية إلى الغرض، وتخفي عمليات الإغلاق المتغيرات تمامًا، وتمنع الجداول للقراءة فقط جميع التعديلات. لكنك غالبًا ما تحتاج إلى شيء بين ذلك: السماح بالتغييرات، ولكن الصحيحة منها فقط.
هنا تصبح أساليب setter قوية. فبدلاً من مجرد إسناد قيمة، يمكن لـ setter التحقق من أن القيمة الجديدة منطقية قبل قبولها:
local Person = {}
Person.__index = Person
function Person:new(name, age)
local obj = {
_name = name,
_age = age
}
setmetatable(obj, Person)
return obj
end
function Person:setAge(newAge)
if newAge < 0 then
print("Error: Age cannot be negative")
return
end
self._age = newAge
endعندما يستدعي شخص ما person:setAge(-5)، تلتقط الطريقة المدخلات invalid وترفض التحديث. تظل حالة الكائن متسقة. من دون هذه الحماية، قد تتسبب البيانات السيئة في إفساد برنامجك بصمت: تخيل حساب مزايا التقاعد باستخدام عمر سالب.
يمكن أن تكون عملية التحقق بسيطة أو معقدة حسب الحاجة. قد تتحقق من النطاقات، أو تتأكد من الأنواع، أو تضمن توافق القيم مع التنسيقات المتوقعة. والمبدأ الأساسي هو أن أداة setter تعمل كحارس بوابة، فتضمن ألا تدخل إلى الكائن إلا البيانات المعقولة.
التحدي
سهللنبنِ فئة Player تحمي سمات health وlevel باستخدام منطق التحقق في أساليب setter! يضمن ذلك عدم انتهاء شخصيات اللعبة بإحصاءات مستحيلة.
ستنظّم شيفرتك عبر ملفين:
Player.lua: أنشئ فئة تدير إحصاءات player مع التحقق المناسب. يجب أن يهيّئ Constructor:new(name)الـplayer باسم، مع ضبط_healthعلى100، وضبط_levelعلى1. أدرج هذه الأساليب::getName(): يعيد اسم player:getHealth(): يعيد health الحالية:getLevel(): يعيد level الحالية:setHealth(value): يحدّث health فقط إذا كانت value بين 0 و100 (شاملًا). إذا كانت invalid، اطبعError: Health must be between 0 and 100ولا تغيّر value.:setLevel(value): يحدّث level فقط إذا كانت value تساوي 1 أو أكبر. إذا كانت invalid، اطبعError: Level must be at least 1ولا تغيّر value.
main.lua: استخدم Require لوحدة Player واقرأ اسم player، ثم اقرأ value اثنتين لاختبار setter. أنشئ player، وحاول ضبط health لديه على value الأولى، وحاول ضبط level لديه على value الثانية، ثم اطبع الإحصاءات النهائية لـplayer.
ستتلقى ثلاث مدخلات:
- اسم player
- قيمة health المراد محاولة ضبطها (رقم، وقد تكون valid أو invalid)
- قيمة level المراد محاولة ضبطها (رقم، وقد تكون valid أو invalid)
يجب أن يُظهر ناتجك أي رسائل Error ناتجة عن المحاولات invalid، متبوعة بالإحصاءات النهائية لـplayer:
Name: {name}
Health: {finalHealth}
Level: {finalLevel}على سبيل المثال، إذا كانت المدخلات هي Hero و-20 و5، فيجب أن يكون الناتج:
Error: Health must be between 0 and 100
Name: Hero
Health: 100
Level: 5رفض setter الخاص بـhealth القيمة -20 (مع إبقاء health عند 100)، بينما قبل setter الخاص بـlevel القيمة 5 باعتبارها valid.
إذا كانت المدخلات هي Warrior و75 و0، فيجب أن يكون الناتج:
Error: Level must be at least 1
Name: Warrior
Health: 75
Level: 1جرّب بنفسك
-- استيراد وحدة Player
local Player = require('Player')
-- قراءة المدخلات
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())
-- TODO: أنشئ لاعبًا جديدًا بالاسم المعطى
-- TODO: حاول تعيين صحة اللاعب إلى healthValue
-- TODO: حاول تعيين مستوى اللاعب إلى levelValue
-- TODO: اطبع الإحصائيات النهائية للاعب بالتنسيق:
-- الاسم: {name}
-- الصحة: {finalHealth}
-- المستوى: {finalLevel}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
4مشروع: بنك رقمي
إعداد المشروعطريقة الإيداع7تعدد الأشكال وإعادة التعريف
إعادة تعريف الدوالاستدعاء دوال الفئة الأبDuck Typingواجهة مشتركةالتحقق من النوعمراجعة - أدوار الموظفين2نمط النموذج الأولي للفئات
مفهوم النموذج الأوليالربط باستخدام __indexالمنشئ :new()تهيئة الخصائصنسخ مستقلةملخص - مصنع السيارات5تحميل المعاملات في OOP
جمع الكائناتطرح الكائناتدمج الكائناتمقارنة الكائنات (<, >)مراجعة - رياضيات المحفظة8التغليف
اصطلاحات التسميةاستخدام Closures للخصوصيةالوصول عبر Closuresجداول للقراءة فقطمنطق التحقق من الصحةمراجعة - الخزنة الآمنة11أنماط التصميم (مبسط)
دوال المصنعجدول Singletonنمط الـ Iteratorالمراقب (المستمع)مراجعة - مصنع الـ Logger3حالة الكائن وسلوكه
متغيرات النسخةدالات الجلب (Getter Methods)دالات التعيين (Setter Methods)الخصائص المحسوبةتنسيق النصوصالتحقق من المساواةمراجعة - درجة الطالب6أساسيات الوراثة
إعداد الوراثةوراثة الـ Methodsتوسيع الـ Constructorإضافة Methods للابنالمشترك مقابل الفريدملخص - التسلسل الهرمي للأشكالتدرّب بنفسك: مترجم Lua عبر الإنترنت