# 定義導向架構在 ERP 系統中的實踐模式
> 以 FormDefine 作為「表單結構描述模型」,統一驅動資料、介面與邏輯

# 1️⃣ 架構核心理念:以定義取代硬編碼
在 BeeNET 架構中,`FormDefine` 是一份**跨層共用的結構描述模型**,用來定義:
- 欄位與型別
- 結構與關聯
- 驗證與限制
- 行為與流程基礎
其目的不只是描述表單,而是作為整個系統的**定義中樞(Definition Hub)**,讓 UI、資料庫、邏輯由同一份定義衍生,確保一致性並降低重複開發成本。
**核心精神:**
- **將複雜度封裝在架構層**,簡化上層開發
- **以結構定義驅動跨層自動化**(UI / DB / Logic)
- **讓定義成為主要的溝通與開發介面**
---
# 2️⃣ FormDefine 生態鏈:統一定義如何驅動系統
FormDefine 是整個 BeeNET 架構的源頭,其他產物皆由此推導。
| 元件 | 性質 | 來源 | 用途 |
|------|------|------|------|
| **FormDefine** | 表單結構描述模型 | 人工/AI/工具建立 | 系統核心定義層 |
| **FormLayout** | UI 配置模型 | 從 FormDefine 推導 | 產生前端介面 |
| **DbTable** | 資料表結構 | 從 FormDefine 推導 | 建立/同步資料庫 |
---
## 定義生成流程圖
```mermaid
graph TD
subgraph 產生 FormDefine
A1["AI 智能生成<br/>(自然語言 → FormDefine)"]
A2["視覺化工具調整<br/>(拖拉欄位與關聯)"]
end
A1 --> A["FormDefine (表單定義)"]
A2 --> A
A --> B["FormLayout (介面配置)"]
A --> C["DbTable (資料表結構)"]
B --> D["WinForm / Web / APP 動態表單"]
C --> E["資料庫維護與同步"]
```
---
## 角色分工與運作模式
### **FormDefine → FormLayout**
- 自動產生表單佈局、控制項
- 可進行 UI 微調,不影響原始結構
### **FormDefine → DbTable**
- 自動建立/調整資料表
- 支援欄位新增、修改、型別更新
### **三者關係:共享定義、獨立演進**
- FormDefine:唯一且穩定的結構定義來源
- FormLayout:介面可獨立調整
- DbTable:資料層可另行最佳化(索引、規範)
> 💡 **FormDefine = 系統的跨層共享定義模型**
> 不僅統一定義,也提供每一層各自最佳化的彈性。
---
# 3️⃣ 實作深度:NoCode / Low Code / Any Code
開發深度依需求複雜度而調整,但所有模式皆基於同一份定義運作。
| 模式 | 自由度 | 實作方式 | 適用情境 |
|------|--------|----------|----------|
| **NoCode** | 中 | 定義生成 UI + DB | 標準流程、資料導向 |
| **Low Code** | 高 | 事件、條件、規則擴充 | 輕度客製邏輯 |
| **Any Code** | 完全 | 自訂 UI / BusinessObject / Repository | 複雜邏輯 / 跨模組整合 |
**設計理念:**
> - NoCode:最快速產生功能
> - LowCode:以事件 / 規則補上差異
> - AnyCode:保留完整程式自主權(Full Control)
> → 不會被框架限制,高度客製仍可掌控
這三種模式是同一條演進軸線上的不同深度,而非互斥的技術堆疊。
---
# 4️⃣ 定義驅動的循環:從客製到標準化
BeeNET 架構具備自我進化特性:
1. **NoCode** : 以定義實現大多數標準功能
2. **LowCode / AnyCode**:補上少量差異與客製化
3. **通用邏輯沉澱回定義層**
4. **下一次開發更自動化、更簡潔**
```mermaid
flowchart LR
A[NoCode:定義化實現]
--> B[Low Code:事件/條件擴充]
--> C[Any Code:進階邏輯]
--> D[架構回饋:模式沉澱]
--> A
```
> 💡 **每一次客製都能成為下一次的自動化能力。**
---
# 5️⃣ 為什麼 ERP 系統需要「定義導向架構」?
ERP 的核心圍繞在 **表單資料模型(Form / Master / Detail)**,但傳統做法往往造成大量重複工作與維護成本。以下整理出實務上最常見的瓶頸。
---
## 傳統模式的典型痛點
### **1. 規格分散於三層(UI / 後端 / 資料庫)**
當業務需要「新增一個欄位」時,工程師必須同時調整三個地方:
- UI 加欄位
- DTO / Model 加欄位
- DB Migration 新欄位
- 驗證邏輯再寫一次
這代表:
→ **同一份規格在三層重複實作,極易產生不一致。**
---
### **2. 業務邏輯分散、風格不一**
不同模組由不同工程師負責,常見現象包括:
- 規則實作方式不一致
- 重複開發相似邏輯
- 後期重構成本非常高
系統越累積越難以維護。
---
### **3. 客製功能無法回饋產品架構**
許多 ERP 專案的客製功能:
- 只服務單一客戶
- 實作方式各自為政
- 難以重用或標準化
最終都會形成 **難以治理的技術債**。
---
## 傳統 vs 定義導向:快速比較
| 觀點 | 傳統 ERP 開發 | 定義導向 |
|------|---------------|----------|
| 欄位新增 | UI / API / DB 各改一次 | 一處修改,自動同步 |
| UI 生成 | 人工維護、容易不一致 | 自動推導、可調整 |
| 規則一致性 | 分散於前後端各自實作 | 集中於定義層,由系統保證一致 |
| 客製化 | 重工、難複用、專案越做越亂 | 以事件 / 規則擴充,可回饋架構 |
| 系統演進 | 重構風險高、擾動大 | 以定義為中心,演進更安全 |
---
# 6️⃣ ERP 適用場景與邊界
## ✔ 適用
- 表單中心資料應用(主/明細、稽核、驗證)
- 多端統一後台(Web / App / WinForm)
- 企業內部管理系統(HR、財務、採購、倉儲、CRM)
- 資料一致性與流程可控性為核心的場景
## ✖ 不適用
- 高併發、事件密集的系統(電商、社群、遊戲)
- 高頻微服務場景
---
# ✅ 結語:讓「定義」成為系統的語言
定義導向的價值在於:
- UI、資料庫、邏輯能從同一份結構推導
- 減少大量重複開發與系統分裂
- 使 ERP 能持續演進、不崩壞
最終,系統開發將從「撰寫程式碼」進化為:
✨ **建構模型 → 定義行為 → 推動架構演進**
這讓 ERP 具備更高的一致性、可理解性與長期可維護性。
## 延伸閱讀
想了解本篇提到的 FormDefine 與 DbTable 在實際系統中的運用,可參考以下兩篇文章:
- **FormDefine**
[從 ORM 到 DR-Map:ERP 系統資料關聯的進化之路](https://hackmd.io/@jeff377/drmap)
- **DbTable**
[用抽象資料型別簡化 ERP 資料庫維護](https://hackmd.io/@jeff377/field-dbtype-design)
---
**📢 歡迎轉載,請註明出處**
**📬 歡迎追蹤我的技術筆記與實戰經驗分享**
[Facebook](https://www.facebook.com/profile.php?id=61574839666569) | [HackMD](https://hackmd.io/@jeff377) | [GitHub](https://github.com/jeff377) | [NuGet](https://www.nuget.org/profiles/jeff377)