67 lines
3.2 KiB
Markdown
67 lines
3.2 KiB
Markdown
# 10. 数据读取
|
|
|
|
数据读取是逻辑调用的一种用法:代码引用数据结构,发起读取,并按声明的字段使用取得的结果。调用方处理业务数据,不处理传输响应或缓存连接。
|
|
|
|
## 10.1 数据结构
|
|
|
|
代码归属:`atelier:shop.data`。商品结构沿用第 7 章的 Product:
|
|
|
|
```endorphin
|
|
class Product {
|
|
name: String
|
|
price: Number
|
|
}
|
|
```
|
|
|
|
结构使调用方能够共同理解商品名称和价格。它不定义数据库表、持久化实体或自动建表行为。
|
|
|
|
## 10.2 读取形式
|
|
|
|
> 语法提案:本节用 `Product.get(...)` 表达“通过类取得数据”。get 的存在与声明方式尚未定义,该写法不是所有 class 自动拥有的成员。
|
|
|
|
代码归属:`market:shop.checkout`。读取函数示例,采用 Product 与读取成员均可访问的条件;成功路径中,读取成员接收一个 String 标识并返回 Product,其正式声明语法仍未定义:
|
|
|
|
```endorphin
|
|
use atelier:shop.data
|
|
|
|
function productPrice(id: String): Number {
|
|
let product = Product.get(id)
|
|
return product.price
|
|
}
|
|
```
|
|
|
|
调用参数 id 表达所需数据的标识,不是 namespace key。`atelier:shop.data` 定位数据结构与逻辑来源,id 指定本次业务对象。
|
|
|
|
成功调用 productPrice 后,返回值应为取得商品的 price 字段。结果已经具有 Product 结构,调用方无需先解析 HTTP 响应或手动转换传输数据。
|
|
|
|
## 10.3 读取与字段使用
|
|
|
|
读取结果可用后,才可读取它的字段。函数中的 product.price 依赖 Product.get 的成功结果;系统必须保持这一依赖。
|
|
|
|
Preflight 理解结构、引用和成员调用的类型关系,inflight 取得本次数据并交付结果。声明 Product 本身不在 Preflight 中读取商品。
|
|
|
|
具体读取成员必须在最终规则中具有可检查的参数与返回定义。仅有前面的字段声明不足以证明 get 调用合法。
|
|
|
|
## 10.4 结果状态
|
|
|
|
| 状态 | 调用方需要获知的内容 |
|
|
| --- | --- |
|
|
| 成功 | 符合 Product 结构的结果 |
|
|
| 缺失 | 目标数据不存在 |
|
|
| 失败 | 本次读取无法完成 |
|
|
| 未就绪 | 成功结果尚未可用 |
|
|
|
|
上述函数只展示成功路径。缺失、失败和未就绪不能自动当作合法 Product,也不能默认替换成空字符串或零。
|
|
|
|
状态的类型与处理语法,以及是否需要显式等待,集中列于[规范状态](../appendices/specification-status.md#调用与数据)。
|
|
|
|
## 10.5 一次读取与持续结果
|
|
|
|
本节 get 提案按一次读取说明。持续跟随数据变化与一次读取具有不同的可观察行为;是否使用不同表达式或结果类型仍未定义。
|
|
|
|
UI 可以直接使用成功取得的类型化字段展示内容,跨端通信由平台承担,不要求应用自行解析响应或恢复对象类型。加载、缺失、失败与后续更新仍需要对应的可观察状态;具体访问和呈现关系见[资源访问与呈现](11-resource-access-and-presentation.md)。
|
|
|
|
数据读取的协议、缓存和后端绑定不影响上述源码目标,也不在本章选择。
|
|
|
|
[上一章:函数与调用](09-functions-and-calls.md) · [下一章:资源访问与呈现](11-resource-access-and-presentation.md) · [目录](../README.md)
|