Lastnosti
Definicije lastnosti in tipi avtomatov stanj za Orb
Kako lastnosti delujejo v arhitekturi Orb - avtomati stanj, pogoji, ucinki in med-orbitalna komunikacija.
Povezano: Entitete
Pregled
V jeziku Orb je Lastnost avtomat stanj, ki definira obnasanje za entiteto. Temeljni sestav je:
Orbital enota = Entiteta + Lastnosti + Strani
Medtem ko Entitete definirajo obliko podatkov, Lastnosti definirajo, kako se ti podatki spreminjajo skozi cas prek stanj, prehodov, pogojev in ucinkov.
Definicija lastnosti
Lastnost je definirana v .orb programu z naslednjo strukturo:
{
"ime": "TaskManagement",
"kategorija": "interaction",
"povezanaEntiteta": "Task",
"opis": "Manages task lifecycle and status changes",
"oddaja": [
{
"dogodek": "TASK_COMPLETED",
"obseg": "external"
}
],
"poslusa": [
{
"dogodek": "USER_ASSIGNED",
"sprozilci": "ASSIGN"
}
],
"strojStanj": {
"stanja": [
{
"ime": "idle",
"jeZacetno": true
},
{
"ime": "active"
},
{
"ime": "completed",
"jeTerminalno": true
}
],
"dogodki": [
{
"kljuc": "START",
"ime": "Start Task"
},
{
"kljuc": "COMPLETE",
"ime": "Complete Task"
}
],
"prehodi": [
{
"iz": "idle",
"do": "active",
"dogodek": "START",
"ucinki": [
[
"nastavi",
"@entiteta.id",
"status",
"active"
]
]
},
{
"iz": "active",
"do": "completed",
"dogodek": "COMPLETE",
"strazar": [
"je",
"@entiteta.assigneeId",
"@uporabnik.id"
],
"ucinki": [
[
"nastavi",
"@entiteta.id",
"status",
"completed"
],
[
"oddaj",
"TASK_COMPLETED",
{
"taskId": "@entiteta.id"
}
]
]
}
]
}
}
Lastnosti lastnosti
| Lastnost | Obvezno | Opis |
|---|---|---|
name | Da | Identifikator lastnosti (PascalCase) |
category | Ne | Kategorija lastnosti (glej spodaj) |
linkedEntity | Ne | Entiteta, na kateri ta lastnost deluje |
description | Ne | Cloveku berljiv opis |
emits | Ne | Dogodki, ki jih ta lastnost lahko oddaja |
listens | Ne | Dogodki, ki jih ta lastnost poslusa |
stateMachine | Da | Definicija avtomata stanj |
ticks | Ne | Nacrtovani/periodicni ucinki |
config | Ne | Konfiguracijski program |
Kategorije lastnosti
Lastnosti so kategorizirane po svojem primarnem namenu:
| Kategorija | Namen | Tipicni ucinki |
|---|---|---|
interaction | Upravljanje dogodkov uporabniskega vmesnika | render-ui, navigate, notify |
integration | Strezniski operacije | persist, fetch, call-service |
lifecycle | Upravljanje zivljenjskega cikla entitete | persist, emit |
gameCore | Igralna zanka in fizika | set, emit, ticks |
gameEntity | Obnasanje igralnih entitet | set, emit, render-ui |
gameUi | Igralni UI, HUD, kontrole | render-ui, notify |
Primeri kategorij
Lastnost za interakcijo - upravlja dogodke UI:
{
"ime": "FormInteraction",
"kategorija": "interaction",
"strojStanj": {
"prehodi": [
{
"dogodek": "SUBMIT",
"ucinki": [
[
"izrisi-vmesnik",
"main",
{
"tip": "form",
"loading": true
}
],
[
"oddaj",
"FORM_SUBMITTED",
"@podatki"
]
]
}
]
}
}
Lastnost za integracijo - upravlja strezniski operacije:
{
"ime": "DataPersistence",
"kategorija": "integration",
"strojStanj": {
"prehodi": [
{
"dogodek": "SAVE",
"ucinki": [
[
"shrani",
"update",
"Task",
"@entiteta.id",
"@podatki"
],
[
"oddaj",
"DATA_SAVED",
{
"id": "@entiteta.id"
}
]
]
}
]
}
}
Avtomat stanj
Vsaka lastnost ima avtomat stanj, ki definira njeno obnasanje.
Stanja
Stanja predstavljajo mozne pogoje lastnosti:
{
"stanja": [
{
"ime": "idle",
"jeZacetno": true,
"opis": "Waiting for input"
},
{
"ime": "loading",
"opis": "Fetching data"
},
{
"ime": "active",
"opis": "Ready for interaction"
},
{
"ime": "error",
"jeTerminalno": true,
"opis": "Error state"
}
]
}
| Lastnost | Opis |
|---|---|
name | Identifikator stanja (male crke) |
isInitial | Zacetno stanje (natanko eno je obvezno) |
isTerminal | Pricakovanih ni nobenih odhodnih prehodov |
description | Cloveku berljiv opis |
Dogodki
Dogodki sprozijo prehode stanj:
{
"dogodki": [
{
"kljuc": "INIT",
"ime": "Initialize"
},
{
"kljuc": "SUBMIT",
"ime": "Submit Form",
"podatki": [
{
"ime": "email",
"tip": "niz",
"obvezno": true
},
{
"ime": "name",
"tip": "niz",
"obvezno": true
}
]
},
{
"kljuc": "ERROR",
"ime": "Error Occurred"
}
]
}
| Lastnost | Opis |
|---|---|
key | Identifikator dogodka (UPPER_SNAKE_CASE) |
name | Prikazno ime |
payload | Pricakovana shema obremenitve |
Prehodi
Prehodi definirajo, kako se stanja spreminjajo kot odziv na dogodke:
{
"prehodi": [
{
"iz": "idle",
"do": "loading",
"dogodek": "SUBMIT",
"strazar": [
"in",
[
"ne_enako",
"@podatki.email",
""
],
[
"ne_enako",
"@podatki.name",
""
]
],
"ucinki": [
[
"nastavi",
"@entiteta.id",
"email",
"@podatki.email"
],
[
"shrani",
"create",
"User",
"@podatki"
]
]
},
{
"iz": [
"loading",
"active"
],
"do": "error",
"dogodek": "ERROR"
}
]
}
| Lastnost | Opis |
|---|---|
from | Izvorno stanje/stanja - niz ali seznam |
to | Ciljno stanje (vedno posamicno) |
event | Sprozilni dogodek |
guard | Pogoj, ki mora biti izpolnjen (neobvezno) |
effects | Ucinki za izvedbo ob prehodu (neobvezno) |
Prehodi z vec izvori: Uporabite seznam za from za obdelavo istega dogodka iz vec stanj:
{
"iz": [
"idle",
"error"
],
"do": "loading",
"dogodek": "RETRY"
}
Pogoji
Pogoji so izrazi, ki se morajo ovrednotiti na true, da se prehod izvede. Uporabljajo sintakso S-izrazov.
Operatorji pogojev
| Kategorija | Operatorji |
|---|---|
| Primerjava | =, !=, <, >, <=, >= |
| Logika | and, or, not |
| Matematika | +, -, *, /, % |
| Seznami | count, includes, every, some |
Primeri pogojev
// Preprosta enakost
["=", "@entity.status", "active"]
// Sestavljeni pogoj
["and",
["!=", "@payload.email", ""],
["!=", "@payload.name", ""]
]
// Numericna primerjava
[">=", "@entity.balance", "@payload.amount"]
// Preverjanje seznama
[">", ["count", "@entity.items"], 0]
// Uporabnisko dovoljenje
["=", "@entity.ownerId", "@user.id"]
// Kompleksen pogoj
["and",
["=", "@entity.status", "pending"],
["or",
["=", "@user.role", "admin"],
["=", "@entity.assigneeId", "@user.id"]
]
]
Vezave v pogojih
Pogoji se lahko sklicujejo na podatke prek vezav (glej Vezave entitet):
| Vezava | Opis |
|---|---|
@entity.field | Trenutna vrednost polja entitete |
@payload.field | Polje obremenitve dogodka |
@state | Ime trenutnega stanja lastnosti |
@user.id | ID overjene osebe |
@now | Trenutni casovni zig |
Neuspesnost pogoja
Ce se pogoj ovrednoti na false:
- Prehod je blokiran
- Nobeni ucinki se ne izvedejo
- Stanje ostane nespremenjeno
- Odgovor oznaci
transitioned: false
Ucinki
Ucinki so dejanja, ki se izvedejo ob prehodu. Uporabljajo sintakso S-izrazov.
Tipi ucinkov
| Ucinek | Streznik | Odjemalec | Namen |
|---|---|---|---|
render-ui | Prezrt | Izvede | Prikazi vzorec v rezino UI |
navigate | Prezrt | Izvede | Navigacija po poteh |
notify | Prezrt | Izvede | Prikazi obvestilo/toast |
fetch | Izvede | Prezrt | Poizvedba v podatkovno bazo |
persist | Izvede | Prezrt | Ustvari/posodobi/izbrisi podatke |
call-service | Izvede | Prezrt | Klici zunanji API |
emit | Izvede | Izvede | Objavi dogodek |
set | Izvede | Izvede | Spremeni polje entitete (podpira povecanje/zmanjsanje prek S-izrazov) |
Model dvojnega izvajanja
Lastnosti se izvajajo hkrati na odjemalcu in strezniku:
┌─────────────────────────────────────────────────────────────┐
│ Odjemalec Streznik │
│ ───────── ──────── │
│ render-ui ✓ render-ui → clientEffects │
│ navigate ✓ navigate → clientEffects │
│ notify ✓ notify → clientEffects │
│ fetch ✗ fetch ✓ (poizvedba) │
│ persist ✗ persist ✓ (zapis) │
│ call-service ✗ call-service ✓ (API klic) │
│ emit ✓ (EventBus) emit ✓ (med-orbitalno)│
│ set ✓ set ✓ │
└─────────────────────────────────────────────────────────────┘
Primeri ucinkov
render-ui - Prikazi vzorec UI:
[
"izrisi-vmesnik",
"main",
{
"tip": "entity-table",
"entiteta": "Task",
"columns": [
"title",
"status",
"dueDate"
]
}
]
persist - Operacije s podatkovno bazo:
// Ustvari
["persist", "create", "Task", "@payload"]
// Posodobi
["persist", "update", "Task", "@entity.id", { "status": "completed" }]
// Izbrisi
["persist", "delete", "Task", "@entity.id"]
fetch - Poizvedba podatkov:
[
"pridobi",
"Task",
{
"status": "active",
"assigneeId": "@uporabnik.id"
}
]
emit - Objavi dogodek:
[
"oddaj",
"TASK_COMPLETED",
{
"taskId": "@entiteta.id",
"completedBy": "@uporabnik.id"
}
]
set - Spremeni polje:
["set", "@entity.id", "status", "active"]
["set", "@entity.id", "updatedAt", "@now"]
// Povecanje/zmanjsanje z matematicnimi operatorji:
["set", "@entity.id", "score", ["+", "@entity.score", 10]] // Povecaj za 10
["set", "@entity.id", "health", ["-", "@entity.health", 5]] // Zmanjsaj za 5
Opomba: increment in decrement nista locena tipa ucinkov. Uporabite ucinek set z matematicnimi operatorji S-izrazov (+, -) za spreminjanje numericnih polj.
navigate - Sprememba poti:
[
"pojdi",
"/tasks/@entity.id"
]
notify - Prikazi obvestilo:
[
"obvesti",
"Task completed successfully",
"success"
]
call-service - Zunanji API:
[
"poklici-storitev",
"email",
"send",
{
"do": "@entiteta.email",
"subject": "Task Assigned",
"body": "You have been assigned a new task."
}
]
linkedEntity - Vezava Lastnost-Entiteta
Lastnost linkedEntity doloca, na kateri entiteti lastnost deluje.
Primarna entiteta
Vsaka Orbital enota ima primarno entiteto. Lastnosti brez linkedEntity uporabljajo to entiteto:
{
"name": "TaskManagement",
"entity": { "name": "Task", "fields": [...] },
"traits": [
{ "name": "StatusTrait" } // Uporablja entiteto Task
]
}
Ekspliciten linkedEntity
Dolocite linkedEntity za delovanje na drugi entiteti:
{
"ime": "TaskManagement",
"entiteta": {
"ime": "Task"
},
"znacilnosti": [
{
"ime": "StatusTrait",
"povezanaEntiteta": "Task"
},
{
"ime": "CommentTrait",
"povezanaEntiteta": "Comment"
},
{
"ime": "PlayerStatsTrait",
"povezanaEntiteta": "Player"
}
]
}
Zakaj linkedEntity?
- Ponovno uporabne lastnosti - Splosna lastnost lahko deluje s katero koli entiteto
- Med-entitetne operacije - Delovanje na povezanih entitetah
- Tipska varnost - Prevajalnik preveri reference na polja entitete
- Jasne odvisnosti - Eksplicitna vezava izboljsa berljivost
Glej Vezave entitet za vec podrobnosti.
Komunikacija z dogodki (emit/listen)
Lastnosti komunicirajo prek dogodkov, kar omogoca ohlapno sklopljenost med Orbital enotami.
Oddajanje dogodkov
Deklarirajte dogodke, ki jih lastnost lahko oddaja:
{
"ime": "OrderFlow",
"oddaja": [
{
"dogodek": "ORDER_CONFIRMED",
"obseg": "external",
"opis": "Fired when order is confirmed",
"podatki": [
{
"ime": "orderId",
"tip": "niz"
},
{
"ime": "items",
"tip": "array"
}
]
}
]
}
Oddajanje v ucinkih:
[
"oddaj",
"ORDER_CONFIRMED",
{
"orderId": "@entiteta.id",
"elementi": "@entiteta.items"
}
]
Poslusanje dogodkov
Deklarirajte dogodke, ki jih lastnost poslusa:
{
"ime": "InventorySync",
"poslusa": [
{
"dogodek": "ORDER_CONFIRMED",
"sprozilci": "RESERVE_STOCK",
"obseg": "external",
"podatkiPreslikava": {
"elementi": "@podatki.items"
},
"strazar": [
"vec",
[
"count",
"@podatki.items"
],
0
]
}
]
}
| Lastnost | Opis |
|---|---|
event | Ime dogodka za poslusanje |
triggers | Notranji dogodek za sprozitev (privzeto ime dogodka) |
scope | internal (ista Orbital enota) ali external (med Orbital enotami) |
payloadMapping | Pretvorba vhodne obremenitve |
guard | Neobvezni pogoj za filtriranje dogodkov |
Doseg dogodka
| Doseg | Opis |
|---|---|
internal | Dogodki samo znotraj iste Orbital enote |
external | Dogodki lahko presezejo meje Orbital enot |
Tok med-orbitalne komunikacije
┌──────────────────┐ ┌──────────────────┐
│ OrderManagement │ │ InventoryManagement│
│ │ │ │
│ ┌────────────┐ │ emit │ ┌────────────┐ │
│ │ OrderFlow │──┼────────►│ │InventorySync│ │
│ └────────────┘ │ ORDER_ │ └────────────┘ │
│ │CONFIRMED│ │
└──────────────────┘ └──────────────────┘
- Lastnost
OrderFlowoddajaORDER_CONFIRMED(zunanji doseg) - Vodilo dogodkov posreduje vsem poslusajocim lastnostim
InventorySyncprejme dogodek, preslika obremenitev- Dogodek
RESERVE_STOCKse sprozi naInventorySync - Avtomat stanj obdela prehod normalno
Cikli (nacrtovani ucinki)
Cikli izvajajo ucinke periodicno, tudi brez interakcije uporabnika.
Definicija cikla
{
"utripi": [
{
"ime": "cleanup_expired",
"interval": "60000",
"strazar": [
"vec",
[
"count",
"@entiteta.expiredSessions"
],
0
],
"ucinki": [
[
"shrani",
"delete",
"Session",
{
"expiresAt": [
"manj",
"@zdaj"
]
}
]
],
"opis": "Clean up expired sessions every minute"
},
{
"ime": "sync_status",
"interval": "5000",
"ucinki": [
[
"pridobi",
"ExternalStatus",
{}
],
[
"nastavi",
"@entiteta.id",
"lastSync",
"@zdaj"
]
]
}
]
}
Lastnosti cikla
| Lastnost | Opis |
|---|---|
name | Identifikator cikla |
interval | Milisekunde ali niz, kot "5s", "1m" |
guard | Pogoj (cikel se preskoci, ce je false) |
effects | Ucinki za izvedbo |
appliesTo | Doloceni ID-ji entitet (neobvezno) |
description | Cloveski opis |
Pogosti vzorci ciklov
Ciscenje:
{
"ime": "cleanup",
"interval": "300000",
"ucinki": [
[
"shrani",
"delete",
"TempData",
{
"ustvarjenoPri": [
"manj",
[
"minus",
"@zdaj",
86400000
]
]
}
]
]
}
Periodicna sinhronizacija:
{
"ime": "sync",
"interval": "10000",
"ucinki": [
[
"poklici-storitev",
"external-api",
"fetch-updates",
{}
],
[
"oddaj",
"DATA_SYNCED",
{
"timestamp": "@zdaj"
}
]
]
}
Igralna zanka:
{
"ime": "game_tick",
"interval": "16",
"ucinki": [
[
"nastavi",
"@entiteta.id",
"position",
[
"plus",
"@entiteta.position",
"@entiteta.velocity"
]
],
[
"izrisi-vmesnik",
"canvas",
{
"tip": "game-canvas"
}
]
]
}
Reference na lastnosti in vgrajene lastnosti
Lastnosti se lahko definirajo vgrajeno ali se nanje sklicujemo iz zunanjih virov.
Vgrajena definicija
Definirajte lastnost neposredno v Orbital enoti:
{
"orbital": "TaskManagement",
"traits": [
{
"name": "StatusTrait",
"stateMachine": {
"states": [...],
"transitions": [...]
}
}
]
}
Referenca
Sklicevanje na lastnost iz standardne knjiznice ali uvozov:
{
"orbitala": "TaskManagement",
"uporablja": [
{
"iz": "std/behaviors/crud",
"kot": "CRUD"
}
],
"znacilnosti": [
{
"sklic": "CRUD.traits.CRUDManagement",
"povezanaEntiteta": "Task",
"konfiguracija": {
"allowDelete": true,
"mehkoIzbrisi": false
}
}
]
}
Lastnosti referenc
| Lastnost | Opis |
|---|---|
ref | Pot do lastnosti (npr. "Alias.traits.TraitName") |
linkedEntity | Preglasitev vezave entitete |
config | Konfiguracijske preglasitve |
Kdaj uporabiti reference
- Ponovno uporabni vzorci - CRUD, avtentikacija, stranjevanje
- Standardna obnasanja - Iz
std/behaviors/ - Med-projektno deljenje - Uvoz iz drugih programov
- Konfiguracijski pogojeno - Ista lastnost, drugacna konfiguracija
Celoten primer
Celotna lastnost, ki prikazuje vse zmoznosti:
{
"ime": "CheckoutFlow",
"kategorija": "integration",
"povezanaEntiteta": "Order",
"opis": "Handles the checkout process from cart to confirmation",
"oddaja": [
{
"dogodek": "ORDER_PLACED",
"obseg": "external",
"podatki": [
{
"ime": "orderId",
"tip": "niz"
},
{
"ime": "total",
"tip": "stevilo"
}
]
},
{
"dogodek": "PAYMENT_FAILED",
"obseg": "internal"
}
],
"poslusa": [
{
"dogodek": "CART_UPDATED",
"sprozilci": "RECALCULATE",
"obseg": "internal"
},
{
"dogodek": "INVENTORY_RESERVED",
"sprozilci": "CONFIRM_STOCK",
"obseg": "external"
}
],
"strojStanj": {
"stanja": [
{
"ime": "cart",
"jeZacetno": true,
"opis": "Shopping cart"
},
{
"ime": "checkout",
"opis": "Entering shipping/payment"
},
{
"ime": "processing",
"opis": "Processing payment"
},
{
"ime": "confirmed",
"opis": "Order confirmed"
},
{
"ime": "failed",
"jeTerminalno": true,
"opis": "Order failed"
}
],
"dogodki": [
{
"kljuc": "PROCEED",
"ime": "Proceed to Checkout"
},
{
"kljuc": "SUBMIT",
"ime": "Submit Order",
"podatki": [
{
"ime": "paymentMethod",
"tip": "niz",
"obvezno": true
}
]
},
{
"kljuc": "PAYMENT_SUCCESS",
"ime": "Payment Succeeded"
},
{
"kljuc": "PAYMENT_FAILED",
"ime": "Payment Failed"
},
{
"kljuc": "RECALCULATE",
"ime": "Recalculate Totals"
},
{
"kljuc": "CONFIRM_STOCK",
"ime": "Stock Confirmed"
}
],
"prehodi": [
{
"iz": "cart",
"do": "checkout",
"dogodek": "PROCEED",
"strazar": [
"vec",
[
"count",
"@entiteta.items"
],
0
],
"ucinki": [
[
"izrisi-vmesnik",
"main",
{
"tip": "form",
"schema": "checkout"
}
]
]
},
{
"iz": "checkout",
"do": "processing",
"dogodek": "SUBMIT",
"strazar": [
"in",
[
"ne_enako",
"@podatki.paymentMethod",
""
],
[
"vec_enako",
"@entiteta.total",
0
]
],
"ucinki": [
[
"nastavi",
"@entiteta.id",
"paymentMethod",
"@podatki.paymentMethod"
],
[
"nastavi",
"@entiteta.id",
"status",
"processing"
],
[
"poklici-storitev",
"payment",
"charge",
{
"amount": "@entiteta.total",
"method": "@podatki.paymentMethod"
}
],
[
"izrisi-vmesnik",
"main",
{
"tip": "stats",
"loading": true
}
]
]
},
{
"iz": "processing",
"do": "confirmed",
"dogodek": "PAYMENT_SUCCESS",
"ucinki": [
[
"nastavi",
"@entiteta.id",
"status",
"confirmed"
],
[
"nastavi",
"@entiteta.id",
"confirmedAt",
"@zdaj"
],
[
"shrani",
"update",
"Order",
"@entiteta.id",
"@entiteta"
],
[
"oddaj",
"ORDER_PLACED",
{
"orderId": "@entiteta.id",
"total": "@entiteta.total"
}
],
[
"obvesti",
"Order confirmed!",
"success"
],
[
"pojdi",
"/orders/@entity.id"
]
]
},
{
"iz": "processing",
"do": "failed",
"dogodek": "PAYMENT_FAILED",
"ucinki": [
[
"nastavi",
"@entiteta.id",
"status",
"failed"
],
[
"oddaj",
"PAYMENT_FAILED",
{
"orderId": "@entiteta.id"
}
],
[
"obvesti",
"Payment failed. Please try again.",
"error"
]
]
},
{
"iz": [
"cart",
"checkout"
],
"do": "cart",
"dogodek": "RECALCULATE",
"ucinki": [
[
"nastavi",
"@entiteta.id",
"total",
[
"seznam/zmanjsaj",
"@entiteta.items",
[
"lambda",
[
"sum",
"item"
],
[
"plus",
"@sum",
"@item.price"
]
],
0
]
]
]
}
]
},
"utripi": [
{
"ime": "expire_abandoned",
"interval": "300000",
"strazar": [
"in",
[
"je",
"@stanje",
"checkout"
],
[
"manj",
"@entiteta.updatedAt",
[
"minus",
"@zdaj",
1800000
]
]
],
"ucinki": [
[
"nastavi",
"@entiteta.id",
"status",
"abandoned"
],
[
"shrani",
"update",
"Order",
"@entiteta.id",
{
"status": "abandoned"
}
]
]
}
]
}
Povzetek
Sistem lastnosti v Orb zagotavlja:
- Avtomati stanj - Definirajo mozna stanja in prehode
- Pogoji - Scitijo prehode z logicnimi pogoji
- Ucinki - Izvajajo dejanja ob prehodu (UI, podatkovna baza, dogodki)
- Dvojno izvajanje - Strezniski ucinki (persist, fetch) + odjemalski ucinki (render, navigate)
- Komunikacija z dogodki - Oddajanje/poslusanje za med-lastnostno in med-orbitalno sporocanje
- Cikli - Nacrtovani periodicni ucinki
- linkedEntity - Eksplicitna vezava na podatke entitete
- Kategorije - Razvrstitev lastnosti po namenu (interakcija, integracija, igra)
- Ponovna uporabnost - Sklicevanje na lastnosti iz knjiznic ali vgrajena definicija
Lastnosti so vedenjsko jedro Orbital enot - definirajo, kako se entitete spreminjajo skozi cas prek deklarativnega, sestavljajocega modela avtomatov stanj.
Dokument ustvarjen: 2026-02-02 Na podlagi analize kodne baze orbital-rust in builder paketov