الحاويات والأصول
الحاويات هي التجريد الأساسي للتخزين في Asset Core. إنها تحمل الأصول ذات الخصائص المكانية المختلفة اعتمادًا على نوعها. الفكرة الرئيسية هي أن نفس نموذج المعاملة ينطبق على جميع أنواع الحاويات، لذا يمكنك نمذجة مجالات متنوعة دون تغيير البنية التحتية.
المشكلة التي يحلها هذا المفهوم
إدارة الأصول في العالم الحقيقي تتضمن أنماط تخزين متنوعة. نموذج البيانات الذي يناسب الجميع إما أن يكون مفرط التخصيص أو يفقد الدلالات الحيوية، خاصة في الأنظمة المكانية.
- الكميات المجمعة (أرصدة الحسابات، عدّ المخزون)
- تسلسلات مرتبة (فتحات المعدات، قوائم مرتبة)
- التنسيقات المكانية (شبكات المستودعات، ألواح المختبر)
لا يمكن لنموذج تخزين واحد أن يمثل جميع هذه الأنماط بكفاءة. يحل Asset Core هذه المشكلة من خلال توفير أنواع متعددة من الحاويات، كل منها مُحسّن لأبعاده المكانية مع مشاركة واجهة عمليات مشتركة. هذا يمنحك كل من الدقة والاتساق.
الأفكار الأساسية
التصنيف البُعدي
أصعب جزء في بناء أنظمة الحالة المكانية هو التعامل مع عدم التوافق البُعدي بين أنماط التخزين. أرصدة الحسابات هي عددية (0D): أنت تهتم بالكمية، وليس بالموقع. فتحات المعدات هي تسلسلية (1D): الموقع مهم، ولكن فقط في خط. شبكات المستودعات هي ثنائية الأبعاد (2D): الجوار والتصادم مهمان في بعدين.
تختار معظم الأنظمة نموذجًا واحدًا وتقوم بتمديده بشكل غير مريح. تخزن كل شيء في جدول علاقات وتفقد الدلالات المكانية (لا يوجد كشف عن التصادم، لا استعلامات مجاورة). تخزن كل شيء في رسم بياني وتدفع ثمن هيكل لا تحتاجه (الرصيد لا يحتاج إلى إحداثيات). تخزن كل شيء في متجر مفتاح-قيمة عام وتنفذ المنطق المكاني في كود التطبيق (إعادة اختراع كشف التصادم لكل مجال).
تتبع AssetCore نهجًا مختلفًا: توفير الحاوية المناسبة لكل حاجة بُعدية، ولكن الحفاظ على واجهة التشغيل متسقة. يتم تصنيف الحاويات حسب بُعد مساحة عنوانها. يضيف كل نوع دلالات مكانية دون تغيير مظروف المعاملة:
| النوع | الأبعاد | مساحة العنوان | أمثلة على حالات الاستخدام |
|---|---|---|---|
الرصيد (balance) | 0D | لا شيء (تجميع فقط) | الأرصدة، الإجماليات |
المنافذ (slots) | 1D | مؤشرات متسلسلة | المعدات، القوائم المرتبة |
الشبكة (grid) | 2D | إحداثيات الشبكة | الألواح، المستودعات |
خط مستمر (continuous_line_1d) | 1D | إحداثيات ثابتة (x) | السكك الحديدية، المحركات |
سطح مستمر (continuous_grid_2d) | 2D | إحداثيات ثابتة (x، y) | خلايا عمل الروبوت، الالتقاط والنقل |
هذا النوع البُعدي يحل مشكلة حقيقية: فهو يمنعك من التعامل عن غير قصد مع رصيد عددي كشبكة (غير منطقي) أو استعلام عن مواقع الفتحات من مستوى مستمر (خطأ نوع). نوع الحاوية يشفر العقد المكاني، وتتحقق العمليات ضده في وقت التنفيذ.
ما تكسبه: نفس العمليات (AddFungible, MoveInstance, إلخ) تتكيف تلقائيًا مع هندسة الحاوية. ما تتخلى عنه: العبء المعرفي لتعلم 5 أنواع من الحاويات بدلاً من 1. نحن نعتقد أن هذه المقايضة تجعلك أسرع على المدى الطويل لأن نموذج مجالك يتطابق مع نموذجك الذهني.
الأرصدة (0D)
تحتوي حاويات الرصيد على أرصدة قابلة للتبادل. استخدمها عندما تكون مهتمًا فقط بالكمية وليس بالتوزيع المكاني—دفاتر الحسابات، إجماليات العملات، مجمعات الموارد.
الأرصدة هي أبعاد صفرية: ليس لديها إحداثيات، ولا مواقع، ولا بصمة مكانية. الرصيد هو عداد عددي بحت. وهذا يجعلها الأداة المناسبة لأسئلة “كم” وليس لأسئلة “أين”.
- تم التعرف عليها بواسطة أزواج
(class_id, key) - الكميات تتجمع بدون موقع مكاني (لا توجد إحداثيات x/y)
- دعم عمليات الإضافة والإزالة والنقل
لماذا هذا مهم: إذا قمت بتخزين العملة في حاوية Grid، فسيتعين عليك اختيار إحداثيات عشوائية لكل وحدة. إذا قمت بتخزينها في Slots، فسوف تضيع فتحة لكل وحدة وتصل إلى حدود السعة على الفور. توفر الأرصدة تجميعًا عدديًا غير محدود، وهو ما تمثله العملة فعليًا.
حالة استخدام مثال: جرد للمواد الكيميائية في مختبر حيث تتعقب المليلترات من النيتروجين السائل. لا يهمك أين يوجد النيتروجين (إنه في الخزان)، بل يهمك كم لديك. هذا هو الرصيد.
{
"op": "AddFungible",
"args": {
"class_id": 100,
"key": 1,
"quantity": 500,
"location": {
"container_id": 1001,
"kind": "balance"
}
}
}
ما تكسبه: التجميع بدون عبء مكاني. تكلفة رصيد يحتوي على 1,000,000 وحدة هي نفس تكلفة رصيد يحتوي على وحدة واحدة—إنه مجرد عداد. ما تتخلى عنه: الاستعلامات المكانية. لا يمكنك أن تسأل “ما هو في الموقع (3,5)” لرصيد لأن المواقع غير موجودة. إذا كنت بحاجة إلى دلالات مكانية، استخدم حاويات Grid أو Continuous بدلاً من ذلك.
الفتحات (1D)
تحتوي حاويات الفتحات على حالات فريدة في مواقع متتالية. إنها مثالية للمعدات، والتجهيزات، أو القوائم المرتبة حيث تكون الحصرية أكثر أهمية من الهندسة.
- الفهارس من 1 إلى N (سعة قابلة للتكوين)
- كل فتحة تحتوي على حد أقصى من مثيل واحد
- دعم عمليات الإضافة، الإزالة، والتبديل
مثال: فتحات المعدات على شخصية أو مواقع في قائمة المعالجة.
{
"op": "PlaceInSlot",
"args": {
"container_id": 1001,
"instance_id": 9001,
"slot_index": 1
}
}
الشبكة (2D)
تضيف حاويات الشبكة هندسة مكانية. إنها الخيار الصحيح للمستودعات، وألواح المختبر، وأي بيئة حيث تهم القرب والتصادم.
- عرض × ارتفاع شبكة من الخلايا
- العناصر تشغل خلايا متعددة بناءً على الشكل
- دعم اكتشاف التصادم والتجاور
مثال: لوحة بقدرة 96 بئر أو شبكة تخزين في المستودع.
يمكن أن تحتوي حاويات الشبكة على كتل قابلة للتبادل (مع وضع مكاني) وحالات فريدة.
الخط المستمر (1D)
تخزن حاويات الخط المستمر (continuous_line_1d) الحالات على طول محور ثابت واحد. تضمن الإحداثيات الثابتة إعادة التشغيل الحتمية دون انحراف نقطة عائمة.
- الإحداثيات هي أعداد صحيحة ثابتة حتمية (لا توجد أعداد عشرية)
- يجب أن تظل التعيينات ضمن الحدود الدنيا/القصوى
- تحقق التصادم يفرض نطاقات غير متداخلة
حالات الاستخدام: القضبان الخطية، الناقلات بدقة تحت الخلية، والروبوتات ذات المحور الواحد.
الطائرة المستمرة (2D)
تخزن حاويات الطائرات المستمرة (continuous_grid_2d) الحالات في مساحة عمل محدودة ومستدامة. تم تصميمها لخلايا العمل الروبوتية ومهام التخطيط المستمر.
- إحداثيات x/y ثابتة مع تقريب حتمي
- فحوصات تصادم المستطيلات الموجهة (الدوران بالميليدرجات)
- أماكن محددة بالحدود، حركات، وتدويرات
- أماكن مخصصة فقط للحالات (لا توجد كتل قابلة للتبادل)
حالات الاستخدام: خلايا العمل الروبوتية، مهام الالتقاط والتوصيل، وتخطيط التصادمات المترية.
الحالات مقابل القابلة للتداول
هذا التمييز يعكس العالم الحقيقي: العملة قابلة للتبادل (ورقة العشرين دولار الخاصة بك قابلة للتبادل مع ورقتي)، بينما المعدات فريدة (سيفك المحدد له متانة، وتعويذات، وتاريخ). يفرض نظام الأنواع هذا على مستوى العمليات.
الأصول القابلة للتبادل هي كميات قابلة للتبادل. يتم تمثيلها بواسطة أزواج من الفئة والمفتاح ويمكن تقسيمها أو دمجها بحرية.
- محدد حسب الفئة والمفتاح
- العمليات تحدد الكميات
- يمكن تقسيمها ودمجها بحرية
لماذا الأمر مهم: يمكن تقسيم الأصول القابلة للتداول ودمجها بحرية، مما يمكّن من إجراء عمليات مثل Distribute (تقسيم الكمية عبر الأهداف) وConsolidateStacks (الدمج في واحدة). محاولة “تقسيم” مثيل هي خطأ نوع يتم اكتشافه في وقت التحقق.
الحالات الفريدة يتم تتبعها بشكل فردي. يتم تمثيلها بواسطة معرفات مستقرة ويمكن ربطها أو فصلها لتشكيل هيراركية.
- تحتوي على معرفات فريدة عالمياً
- لا يمكن تقسيمها أو دمجها
- يمكن تشكيل هياكل الأب-الطفل عبر الإرفاق/الفصل
لا يمكن تقسيم أو دمج الحالات الفريدة - MoveInstance ينقل الحالة بأكملها بشكل ذري. نموذج التسلسل الهرمي للأب والطفل للحالات (Attach/Detach) يعكس التعشيش الحقيقي: تحتوي الحقيبة على جيب، والذي يحتوي على جرع. يتم عكس التسلسل الهرمي في الاستعلامات، مما يجعل “ما الذي يوجد في هذه الحاوية بشكل متكرر؟” عملية من الدرجة الأولى.
الفئات والأشكال
الفئات تعرف أنواع الأصول. إنها المعرفات القياسية لكل من الأصول القابلة للتبادل والحالات، ويجب تسجيلها قبل الاستخدام.
- توفير بيانات وصفية مثل الأسماء والعلامات الاختيارية
- تعمل كمعرفات مستقرة للأرصدة القابلة للتبادل أو الحالات الفريدة
- يجب تسجيله قبل الاستخدام
الفئات محددة النطاق: class_id له معنى فقط ضمن نطاقه. نفس المعرف الرقمي في نطاق مختلف هو فئة مختلفة. بمجرد تسجيله، لا يمكن إعادة استخدام معرف الفئة لتعريف مختلف. هذا يحافظ على استقرار الهوية للتدقيق وإعادة التشغيل.
يمكن أن تحتوي الفئات على قيود سلوكية يتم تطبيقها في وقت التحقق من العمليات. هذه القيود هي الطريقة التي تقوم بها بتشفير الحدود “العالمية الحقيقية” في قواعد حتمية:
- ميزان توازن (تكميم النقاط الثابتة للميزانات)
- الحد الأدنى والحد الأقصى لحدود الرصيد
- الحد الأقصى لحجم المكدس للكتل القابلة للتبادل
- الحد الأقصى لعدد الحزم لكل حاوية لفئة
- القدرة على الرصيد السلبي (مسموح بها صراحةً أم لا)
الأشكال تحدد بصمات المكان. إنها تسمح للوقت الفعلي بفرض قواعد الاصطدام بشكل حتمي، وهو أمر أساسي للصحة.
- العرض والارتفاع في خلايا الشبكة
- مرتبط بفئة ومفتاح متغير اختياري
- مطلوب لوضع حاوية الشبكة
تُعبر المتغيرات باستخدام stack_key. يُحدد الزوج (class_id, stack_key) الهوية القابلة للتبادل ويحدد الشكل المطلوب (إن وجد) للتوزيع. يتيح لك ذلك نمذجة المتغيرات (الحجم، المستوى، الحالة) دون مضاعفة معرفات الفئة.
ملخص التوافق:
- الرصيد: كميات قابلة للتبادل فقط (ميزان نقطة ثابتة؛ لا توجد مراكز)
- المساحات: حالات فقط (حالة واحدة لكل مساحة)
- الشبكة: كتل أو مثيلات قابلة للتبادل (الأشكال المطلوبة للتوزيع متعدد الخلايا)
- متواصل 1D/2D: حالات فقط (إحداثيات ثابتة؛ الأشكال/الامتدادات مطلوبة)
{
"op": "RegisterClass",
"args": {
"request": {
"class_id": 200,
"flags": 2,
"name": "Sample Tube"
}
}
}
كيف يتناسب مع النظام
التحقق والإرسال
نوع الحاوية هو جزء من عقد التشغيل. خلال التحقق من L2، يتحقق وقت التشغيل من نوع الحاوية، تسجيل الفئة، ومتطلبات الشكل قبل أي تعديل. يستخدم التحقق المسبق نفس الفحوصات، لذا فإن التحقق المسبق الناجح يعني أن الالتزام سينجح إذا لم يتغير العالم.
أمثلة على كيفية حدوث ذلك:
AddFungibleعلى الرصيد يزيد رصيدًا عدديًا.AddFungibleعلى الشبكة يتطلب تسجيل الشكل وفحوصات التصادم.PlaceInSlotعلى الرصيد مرفوض (نوع الحاوية غير صحيح).
التسجيل والأشكال
تسجيل الفئات والأشكال يعيش في مساحة الأسماء registry. تستشير التوزيعات الشبكية والمستمرة السجل للحصول على بصمات أو امتدادات، بحيث يكون التوزيع حتميًا وآمنًا لإعادة التشغيل بدلاً من كونه عشوائيًا.
قراءة التوقعات واستعلامات الأسطح
تحتفظ توقعات القراءة بمؤشرات محددة للحاويات (الأرصدة حسب الفئة/المفتاح، إشغال الفتحات، نقاط الشبكة). تعيد استجابات القراءة تحميلات محددة حسب نوع الحاوية، لذا فإن استعلامات “محتويات الحاوية” تتطابق دائمًا مع الهندسة التي تفرضها الحاوية.
انظر أيضًا
- المعاملات والعمليات - كيفية عمل العمليات
- مرجع الإجراء - مرجع العملية الكامل
- نموذج وقت التشغيل - كيف تتناسب الحاويات في الهيكلية