refactor(array-tracer): 移除 preset 指令并简化类型参数
- 将 preset 功能合并到 create 指令中,简化 API 设计 - 移除 ArrayTracerPresetCommand 类型及相关处理逻辑 - 调整 createArrayTracer 泛型参数以直接接受数组类型 - 更新相关文档以反映新的初始化模式
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
# 多语言 SDK 初始化设计规范
|
||||
|
||||
## 背景
|
||||
|
||||
为了简化 SDK 的使用流程并统一 API 设计体验,我们决定将 Tracer 的初始化数据(Initial Data)合并到创建(Create)阶段。这意味着用户在实例化 Tracer 时,可以直接传入初始数据,而无需单独调用 `preset` 方法。
|
||||
|
||||
这一设计模式(Construct as Initialize)在大多数现代编程语言中都有成熟的最佳实践。本文档旨在为不同语言的 SDK 实现提供具体的代码范式参考。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. **优先使用构造函数参数**:如果语言支持(如 Python, Kotlin, Swift),优先使用带默认值的命名参数。
|
||||
2. **利用语言特性**:
|
||||
- **重载 (Overloading)**:适用于 Java, C++, C#。
|
||||
@@ -18,6 +20,7 @@
|
||||
## 各语言实现参考
|
||||
|
||||
### 1. TypeScript / JavaScript (当前基准)
|
||||
|
||||
利用接口(Interface)定义配置对象,简洁且扩展性强。
|
||||
|
||||
```typescript
|
||||
@@ -31,13 +34,14 @@ export const createArrayTracer = <T>(options: ArrayTracerOptions<T>) => { ... }
|
||||
|
||||
// 调用
|
||||
const t1 = createArrayTracer({ description: "Empty" });
|
||||
const t2 = createArrayTracer({
|
||||
description: "My Array",
|
||||
array: [1, 2, 3]
|
||||
const t2 = createArrayTracer({
|
||||
description: "My Array",
|
||||
array: [1, 2, 3]
|
||||
});
|
||||
```
|
||||
|
||||
### 2. Python (Keyword Arguments)
|
||||
|
||||
利用 `**kwargs` 或显式关键字参数,非常符合 Pythonic 风格。
|
||||
|
||||
```python
|
||||
@@ -53,6 +57,7 @@ t2 = ArrayTracer(description="My Array", data=[1, 2, 3])
|
||||
```
|
||||
|
||||
### 3. Java (Constructor Overloading)
|
||||
|
||||
利用构造函数重载提供多种初始化路径。
|
||||
|
||||
```java
|
||||
@@ -74,6 +79,7 @@ var t2 = new ArrayTracer<Integer>("My Array", Arrays.asList(1, 2, 3));
|
||||
```
|
||||
|
||||
### 4. C++ (Overloading & Initializer List)
|
||||
|
||||
利用 `std::initializer_list` 支持花括号初始化,语法极其简洁。
|
||||
|
||||
```cpp
|
||||
@@ -82,10 +88,10 @@ class ArrayTracer {
|
||||
public:
|
||||
// 基础构造
|
||||
ArrayTracer(std::string description) { ... }
|
||||
|
||||
|
||||
// 带数据构造 (支持 vector)
|
||||
ArrayTracer(std::string description, const std::vector<T>& data) { ... }
|
||||
|
||||
|
||||
// 带数据构造 (支持 {1,2,3} 字面量)
|
||||
ArrayTracer(std::string description, std::initializer_list<T> data) { ... }
|
||||
};
|
||||
@@ -96,6 +102,7 @@ ArrayTracer<int> t2("My Array", {1, 2, 3});
|
||||
```
|
||||
|
||||
### 5. Go (Functional Options Pattern)
|
||||
|
||||
Go 社区处理复杂构造参数的标准模式。
|
||||
|
||||
```go
|
||||
@@ -121,6 +128,7 @@ t2 := NewArrayTracer("My Array", WithData([]interface{}{1, 2, 3}))
|
||||
```
|
||||
|
||||
### 6. Rust (Builder Pattern)
|
||||
|
||||
利用 Builder 模式处理构造参数,保证类型安全和可读性。
|
||||
|
||||
```rust
|
||||
@@ -142,6 +150,7 @@ let t = ArrayTracer::builder("My Array")
|
||||
```
|
||||
|
||||
### 7. C# (Optional Arguments)
|
||||
|
||||
类似于 TypeScript 和 Kotlin,C# 支持命名参数和默认值。
|
||||
|
||||
```csharp
|
||||
@@ -157,6 +166,7 @@ var t2 = new ArrayTracer<int>("My Array", data: new[] { 1, 2, 3 });
|
||||
```
|
||||
|
||||
### 8. C 语言 (Special Case)
|
||||
|
||||
C 语言不支持重载,且缺乏自省能力,因此建议提供两种创建模式:
|
||||
|
||||
**方案 A: 基础数据类型 (使用宏或特定后缀)**
|
||||
@@ -186,10 +196,10 @@ typedef void (*serializer_func)(const void* elem, char* buffer);
|
||||
* @param serializer 用户提供的序列化函数
|
||||
*/
|
||||
tracer_t* tracer_create_array_custom(
|
||||
const char* desc,
|
||||
const void* data,
|
||||
size_t len,
|
||||
size_t elem_size,
|
||||
const char* desc,
|
||||
const void* data,
|
||||
size_t len,
|
||||
size_t elem_size,
|
||||
serializer_func serializer
|
||||
);
|
||||
|
||||
@@ -210,4 +220,5 @@ tracer_t* t = tracer_create_array_custom("Points", pts, 2, sizeof(Point), point_
|
||||
---
|
||||
|
||||
## 总结
|
||||
|
||||
通过统一采用**“构造即初始化”**的设计模式,我们能够在几乎所有主流编程语言中提供一致、简洁且符合语言习惯(Idiomatic)的 SDK 使用体验。这不仅降低了用户的学习成本,也使得代码更加紧凑和易读。
|
||||
|
||||
Reference in New Issue
Block a user