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

منطق التحقق من الصحة

جزء من قسم البرمجة كائنية التوجه في رحلة 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 تعمل كحارس بوابة، فتضمن ألا تدخل إلى الكائن إلا البيانات المعقولة.

challenge icon

التحدي

سهل

لنبنِ فئة 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.

ستتلقى ثلاث مدخلات:

  1. اسم player
  2. قيمة health المراد محاولة ضبطها (رقم، وقد تكون valid أو invalid)
  3. قيمة 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}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Lua عبر الإنترنت