📦 تعريف الكائنات (Objects) في لغة نفطه


في لغة نفطه، الكائن هو عبارة عن تجميع من الحقول (متغيرات) المرتبطة مع بعضها ضمن وحدة واحدة. يمكنك تعريف كائن بسيط أو تحديد نوعه بشكل صريح.


In Naftah language, an object is a collection of fields (variables) grouped together as a single unit. You can define a simple object or explicitly specify its type.


أمثلة تعريف كائنات:

--- كائن بسيط يحتوي على حقلين عددين
متغير أ تعيين { متغير أ تعيين 1 , متغير ب تعيين 4 }

--- نفس الكائن مع تحديد النوع (أي_نمط)
متغير أ_1 : أي_نمط تعيين { متغير أ تعيين 1 , متغير ب تعيين 4 }

--- كائن يحتوي حقول مختلفة الأنواع (نص، عدد، بوليان)
متغير شخص تعيين {
  متغير الاسم تعيين "أنيس",
  متغير العمر تعيين 32,
  متغير متزوج تعيين خطأ
}

🏠 كائنات متداخلة (Nested Objects)

يمكن أن يحتوي الكائن على حقول تكون بدورها كائنات، ما يسمح ببناء بنى بيانات معقدة.

--- كائن عنوان
متغير عنوان تعيين {
  متغير الشارع تعيين "شارع البيئة",
  متغير المدينة تعيين "توزر",
  متغير الرمز_البريدي تعيين 2200
}

--- كائن مدينة يحتوي حقل عنوان ككائن فرعي
متغير مدينة تعيين {
  متغير الاسم تعيين "توزر",
  متغير السكان تعيين 37000,
  متغير العنوان تعيين "عنوان"
}

📌 كيفية الوصول إلى حقول الكائن

باستخدام نقطتين :

مدينة:العنوان

باستخدام الأقواس المربعة []

مدينة["العنوان"]

الوصول الاختياري مع علامات استفهام ؟ لتجنب الأخطاء عند عدم وجود الحقل

مدينة؟:العنوان
مدينة؟["العنوان"]

📌 تعديل قيم الحقول باستخدام النقطتين :

متغير المدينة تعيين {
    متغير الاسم تعيين "قبلي" ,     --- خاصية "الاسم" = "قبلي"
    متغير عدد_السكان تعيين 50000 ,  --- خاصية عدد السكان
    --- خاصية فرعية "بلدة"
    متغير البلدة تعيين {
        متغير الاسم تعيين "سوق الأحد" ,  --- اسم البلدة
        متغير عدد_البيوت تعيين 400     --- عدد البيوت في البلدة
    }
}

--- تعديل عدد البيوت في البلدة إلى 50
المدينة:البلدة:عدد_البيوت = 50

--- ارجاع قيمة عدد البيوت
المدينة:البلدة:عدد_البيوت

📌 تعديل قيم الحقول باستخدام الأقواس المربعة []

--- تعديل عدد البيوت في البلدة إلى 5000
المدينة["البلدة"]["عدد_البيوت"] = 5000

--- ارجاع القيمة الجديدة
المدينة["البلدة"]["عدد_البيوت"]

📌 الوصول الاختياري مع علامات استفهام ؟ لتجنب الأخطاء عند عدم وجود الحقل

--- تعديل عدد البيوت مع التحقق من وجود الحقول
المدينة؟:البلدة؟:عدد_البيوت = 100

--- ارجاع القيمة بأمان
المدينة؟:البلدة؟:عدد_البيوت

--- باستخدام الأقواس المربعة مع الوصول الاختياري
المدينة؟["البلدة"]؟["عدد_البيوت"] = 200
المدينة؟["البلدة"]؟["عدد_البيوت"]

🧩 مثال كامل لكائن متعدد المستويات

متغير النظام تعيين {
  متغير المستخدم تعيين {
    متغير المعرف تعيين "NAF001",
    متغير الاسم تعيين "سلمى",
    متغير بيانات_التسجيل تعيين {
      متغير البريد_الإلكتروني تعيين "salma@naftah.tn",
      متغير تاريخ_التسجيل تعيين "2024-11-30",
      متغير الحالة تعيين "مفعّل"
    },
    متغير العنوان تعيين {
      متغير الشارع تعيين "شارع الواحات",
      متغير المدينة تعيين "توزر",
      متغير الدولة تعيين {
        متغير الاسم تعيين "تونس",
        متغير الرمز تعيين "TN",
        متغير الموقع تعيين {
          متغير القارة تعيين "أفريقيا",
          متغير الإحداثيات تعيين {
            متغير خط_العرض تعيين 33,9197,
            متغير خط_الطول تعيين 8,1335
          }
        }
      }
    }
  },
  متغير نسخة_النظام تعيين "naftah-1.0.0"
}

🧠 السلوك (Implementations) في لغة نفطه

في لغة نفطه، السلوك (سلوك) هو آلية لإضافة منطق ودوال إلى كائن مُعرَّف مسبقًا، دون إعادة تعريف بنيته.


📌 تعريف سلوك لكائن

يتم تعريف السلوك باستخدام الكلمة المفتاحية سلوك متبوعة باسم الكائن:

سلوك اسم_الكائن {
  --- دوال ومنطق
}

داخل السلوك يمكن:


👤 مثال: سلوك كائن “شخص”

--- تعريف متغير 'شخص' ككائن يحتوي حقول الاسم، العمر، حالة الزواج
متغير شخص تعيين {
  ثابت الاسم تعيين "نورالدين",
  ثابت العمر تعيين 72,
  متغير متزوج تعيين صحيح,
  متغير متوفي تعيين خطأ,
  متغير سعيد تعيين صحيح
}

🔧 السلوك المرتبط بالكائن “شخص”

سلوك شخص {

  --- getters (دوال قراءة)

  دالة الاسم() {
    هذا:الاسم
  }

  دالة العمر() {
    ارجع هذا:العمر
  }

  دالة هل_متزوج() {
    هذا:متزوج
  }

  دالة هل_متوفي() {
    ارجع هذا:متوفي
  }

  دالة هل_سعيد() {
    هذا:سعيد
  }

  --- setters (دوال تعديل)

  دالة إجعل_متزوج(قيمة: منطقي) {
    إذا هذا:متوفي إذن {
      ارجع خطأ
    }
    غير_ذلك {
      هذا:متزوج تعيين قيمة
      ارجع صحيح
    }
  }

  دالة إجعل_سعيد(قيمة: منطقي) {
    إذا هذا:متوفي إذن {
      هذا:سعيد تعيين خطأ
    }
    غير_ذلك {
      هذا:سعيد تعيين قيمة
    }
  }

  --- منطق إضافي

  دالة توفي() {
    هذا:متوفي تعيين صحيح
    هذا:سعيد تعيين خطأ
    هذا:متزوج تعيين خطأ
  }

  دالة هل_حي() {
    ارجع ليس هذا:متوفي
  }

  --- وصف وطباعة

  دالة وصف() {
      "الإسم: " + هذا:الاسم
    + "\nالعمر: " + هذا:العمر
    + "\nمتزوج: " + هذا:متزوج
    + "\nمتوفي: " + هذا:متوفي
    + "\nسعيد: " + هذا:سعيد
  }

  دالة إطبع() {
    إطبع(هذا::وصف())
  }
}

🏠 مثال: سلوك كائن “عنوان”

--- تعريف متغير 'عنوان' يحتوي الشارع، المدينة، والرمز البريدي
متغير عنوان تعيين {
  متغير الشارع تعيين "شارع البيئة",
  متغير المدينة تعيين "توزر",
  متغير الرمز_البريدي تعيين 2200
}
سلوك عنوان {

  --- getters (دوال قراءة)

  دالة الشارع() {
    هذا:الشارع
  }

  دالة المدينة() {
    هذا:المدينة
  }

  دالة الرمز_البريدي() {
    هذا:الرمز_البريدي
  }

  --- setters (دوال تعديل)

  دالة إجعل_الشارع(قيمة: تسلسل_رموز) {
    هذا:الشارع تعيين قيمة
  }

  دالة إجعل_المدينة(قيمة: تسلسل_رموز) {
    هذا:المدينة تعيين قيمة
  }

  دالة إجعل_الرمز_البريدي(قيمة: أي_عدد) {
    هذا:الرمز_البريدي تعيين قيمة
  }

  --- منطق

  دالة وصف() {
      "الشارع: " + هذا:الشارع
    + "\nالمدينة: " + هذا:المدينة
    + "\nالرمز البريدي: " + هذا:الرمز_البريدي
  }

  دالة إطبع() {
    إطبع(هذا::وصف())
  }
}

🏙️ مثال: سلوك كائن “مدينة”

--- تعريف متغير 'مدينة' يحتوي الاسم، عدد السكان، ومرجع إلى العنوان
متغير مدينة تعيين {
  متغير الاسم تعيين "توزر",
  متغير السكان تعيين 37000,
  متغير العنوان تعيين عنوان
}
سلوك مدينة {

  --- getters (دوال قراءة)

  دالة الاسم() {
    هذا:الاسم
  }

  دالة السكان() {
    هذا:السكان
  }

  دالة العنوان() {
    هذا:العنوان
  }

  --- setters (دوال تعديل)

  دالة إجعل_الاسم(قيمة: تسلسل_رموز) {
    هذا:الاسم تعيين قيمة
  }

  دالة إجعل_السكان(قيمة: أي_عدد) {
    هذا:السكان تعيين قيمة
  }

  دالة إجعل_العنوان(قيمة: كائن) {
    هذا:العنوان تعيين قيمة
  }

  --- منطق

  دالة زد_السكان(قيمة: أي_عدد) {
    هذا:السكان تعيين هذا:السكان + قيمة
  }

  دالة هل_كبيرة() {
    هذا:السكان > 100000
  }

  دالة وصف() {
      "اسم المدينة: " + هذا:الاسم
    + "\nعدد السكان: " + هذا:السكان
    + "\nالعنوان:\n" + هذا:العنوان
  }

  دالة إطبع() {
    إطبع(هذا::وصف())
  }
}

🏘️ مثال: سلوك كائن “بلدة”

--- تعريف متغير 'بلدة' يحتوي الاسم، مرجع إلى المدينة، وعدد الأحياء
متغير بلدة تعيين {
  متغير الاسم تعيين "نفطة",
  متغير المدينة تعيين مدينة,
  متغير عدد_الأحياء تعيين 5
}
سلوك بلدة {

  --- getters (دوال قراءة)

  دالة الاسم() {
    هذا:الاسم
  }

  دالة المدينة() {
    هذا:المدينة
  }

  دالة عدد_الأحياء() {
    هذا:عدد_الأحياء
  }

  --- setters (دوال تعديل)

  دالة إجعل_الاسم(قيمة: تسلسل_رموز) {
    هذا:الاسم تعيين قيمة
  }

  دالة إجعل_المدينة(قيمة: كائن) {
    هذا:المدينة تعيين قيمة
  }

  دالة إجعل_عدد_الأحياء(قيمة: أي_عدد) {
    هذا:عدد_الأحياء تعيين قيمة
  }

  --- منطق

  دالة زد_حي() {
    هذا:عدد_الأحياء تعيين هذا:عدد_الأحياء + 1
  }

  دالة هل_كبيرة() {
    هذا:عدد_الأحياء > 10
  }

  دالة وصف() {
      "اسم البلدة: " + هذا:الاسم
    + "\nعدد الأحياء: " + هذا:عدد_الأحياء
    + "\nالمدينة:\n" + هذا:المدينة
  }

  دالة إطبع() {
    إطبع(هذا::وصف())
  }
}

🧠 ملاحظات مهمة


## 📁 ملفات مرتبطة * [Home - الرئيسية](./../../../README.md) * [🔑 الكلمات المفتاحية - Keywords](./01_keywords.md) * [🧱 الأنواع الأولية و الثوابت و المتغيرات - Primitive Types And Variables](./02_primitives_and_variables.md) * [📚 بُنى المعطيات - Collections](./03_collections.md) * [🧮 التعبيرات - Expressions](./04_expressions.md) * [🔢 الأعداد بأنظمة العد - Radix Numbers](./05_radix_numbers.md) * [🌀 التحكم في تدفق البرنامج - Control Flow](./07_control_flow.md) * [⚙️ الدوال في لغة نفطه - Functions](./08_functions.md) * [⚙️ التوافق مع Java (Java Interop) في لغة نفطه - Java Interop](./09_java_interop.md) * [⚡ التعامل مع التزامن في نفطه – Concurrency](./10_concurrency.md) * [⏱️ الزمن والنقاط الزمنية في نفطه – Temporal](./11_temporal.md) ---