元数据驱动开发 - 面向对象编程思想的补充(上)

当前绝大多数管理信息系统都采用面向对象思想开发实现,其优点是贴合管理业务逻辑,比如将部门、员工、订单、商品、客户都抽象成对象,该对象的属性和行为对应真实业务场景,逻辑清晰,易于理解,开发效率高。另外利用封装、继承、多态快速搭建通用模块(权限、审批、日志、报表),便于复用与扩展,更加提升了开发效率。

但随着信息化推进逐渐深化,管理信息系统规模越来越庞大,需求变更越来越频繁,传统的面向对象开发也越来越力不从心。具体表现为开发周期漫长、需求响应迟缓、个性化开发费用高。导致这些问题的原因就是过度滥用面向对象思想 ,面向对象的封装 在隔离变化的同时也限制了变化,使得后续调整的代价大大增加。面向对象的继承和多态的方法论过于高端,在面对大多数业务需求时,开发人员最常见的做法是加个条件语句,而不是采用继承和多态的方式实现;但如果开发人员采用继承和多态去实现需求,就引入了巨大的后期维护成本,继承层级越深,维护代价呈指数级上涨。

这是国内外的研究共识,管理类业务系统不适合深度继承 ,其实无论什么类型的软件,过多的继承层次都是难以掌握的。管理软件行业目前的主流改良做法是严格控制继承,只做单层或二层极简继承,并且采用组合聚合的方式来扩展功能。易元平台认为主流改良做法没有解决根本问题 ,仅仅缓解了继承和多态导致的问题,但根源问题是封装导致,因为封装从一开始就限制了变化,而管理信息系统当前最迫切的需求就是柔性管理和拥抱变化。

笔者在这里先提出一个结论:当前管理信息系统面临的矛盾之一就是:面向对象封装的限制与不断增长变化的需求之间的矛盾。接下来继续说明如何解决这个矛盾。

元数据驱动开发

管理信息系统有大量的易变数据信息不适合用对象封装,而市场经济的不断深化、信息化的不断发展也要求管理信息系统能更好更快地适应需求变化。面向对象设计思想无法解决管理信息系统适应需求变化时遇到的困境,笔者认为:管理信息系统应全面采用元数据驱动开发,这是目前解决传统开发方式无法快速适应需求变化的问题的最佳途径。

接下来从元数据的定义、历史、作用等各个方面详细讲述为什么推荐采用元数据驱动开发。

什么是元数据

元数据是描述数据的数据,元数据可以描述静态结构内容,也可以描述动态过程、流程、行为和事件等,按描述的内容可以分为两类:

  1. 静态元数据 - 描述事物的结构

    比如描述客户表有如下字段:编号(上限20字符,唯一)、客户名称(上限100字符,下限1字符,唯一)、电话(上限20字符)、地址(上限200字符)、业务员(引用职员表,不允许空)、备注(上限500字符)。

    上面的元数据描述了客户表的静态结构,规定了客户表中存放的数据应符合的规范要求,这种元数据就是静态元数据。

  2. 动态元数据 - 描述数据变化,并制订规则

    比如描述新增订单保存之后如何增加库存上对应商品的数量;或者描述流程的各个步骤,每步的审批人和下一步骤等。

    上面的元数据要么描述动作行为发生对数据的影响;要么描述数据流转过程,每一步怎么做,下一步到什么步骤等等。都是对动态变化的描述,称为动态元数据。

tps://github.com/previtreing/egxsso/blob/main/wqArlYfPtr_938376.md

https://github.com/previtreing/egxsso/commit/78c62512f0a3d67ef954c4e313092e6bccad0881

https://github.com/yonny6013/ekqdpc/blob/main/mNa1vipZ3X_554409.md

https://github.com/yonny6013/ekqdpc/commit/f86ce928e0ae8edce122d3913745d4266a2c7d83

https://github.com/mikebairouwe/qpnbvz/blob/main/7uUB5t0kEi_498821.md

https://github.com/mikebairouwe/qpnbvz/commit/fbc263b7b764e367be4cf51a8d14d241ce36ef93

https://github.com/insbrangotekson/hbhkxt/blob/main/0115CT18sM_610593.md

https://github.com/insbrangotekson/hbhkxt/commit/d5234f02c1d71ecef219d6907b7b67989fc1848a

https://github.com/justinghove/tobnjf/blob/main/THNbYzqa42_165448.md

https://github.com/justinghove/tobnjf/commit/ef4d12b85517cc7ef09dff54653e9b3df679c4cb

https://github.com/grootobfis/qyilhd/blob/main/2D4HEfWGkE_697081.md

https://github.com/grootobfis/qyilhd/commit/7aed484ca5cedf5c2475cab620562f7ac0745ee3

https://github.com/abdys-lono/gqwznj/blob/main/9ZQd4ymtd6_337260.md

https://github.com/abdys-lono/gqwznj/commit/cb2d436274a34dcd0051105e950cd1bc2716721a

https://github.com/kewarh1/dcobxt/blob/main/nX48mZgQuO_448710.md

https://github.com/kewarh1/dcobxt/commit/a6621b4d31b3c8a5d73ef424e8561a2cc2677cc6

https://github.com/angelcorem/kcrvie/blob/main/5xhiFM6a4Y_221604.md

https://github.com/angelcorem/kcrvie/commit/a4a0b10898c49882f017816db6eaf60fb86e8d66

https://github.com/andrewillei/cjwjfr/blob/main/Sq7hriSwQu_387260.md

https://github.com/andrewillei/cjwjfr/commit/566cf1b53c86cd8c2c1285f8ecc6dd6fe47aeb3c

https://github.com/freckleuy/qjfbxd/blob/main/JDXE8v2mGk_777326.md

https://github.com/freckleuy/qjfbxd/commit/715aa47e55b4e25d563edd660fd386d2b3861334

https://github.com/vakshramit-lykhe/qvruif/blob/main/tqHBV9w3nH_655438.md

https://github.com/vakshramit-lykhe/qvruif/commit/7365d7db674d7747cd6a84b83647fc36b4c07dad

https://github.com/tendybrenyan/gokxth/blob/main/Iztgo4cjTx_776104.md

https://github.com/tendybrenyan/gokxth/commit/8a6c069841b8ca82086e62e1af8c513971fca4e8

https://github.com/spyderjh/tuxres/blob/main/y29QSZJnHl_993771.md

https://github.com/spyderjh/tuxres/commit/2f66e704eb3682f7591205ee8e19b00612697ff2

https://github.com/anukamohanov/ijwznj/blob/main/2pQ70ovf9d_221104.md

https://github.com/anukamohanov/ijwznj/commit/f65cb831464b199e706f1f8b2077b3228265d91d

https://github.com/jrnov/xwieaw/blob/main/mTq7eFzTxR_110548.md

https://github.com/jrnov/xwieaw/commit/43667c25d5c9cc69b0517fb645f5f9562a5992bf

https://github.com/aaronmalek/tdqdpe/blob/main/9WnKRBf9d7_115510.md

https://github.com/aaronmalek/tdqdpe/commit/8d424e3235b9f83321772c7c17c398db65f5cffe

https://github.com/previtreing/egxsso/blob/main/BFM67elVzT_001608.md

https://github.com/previtreing/egxsso/commit/9b20f9bc8b3da5a19bd18a7bfd929ff0c12cb0c7

https://github.com/yonny6013/ekqdpc/blob/main/vPMmdNrLpJ_044821.md

https://github.com/yonny6013/ekqdpc/commit/cb087b040577be250ba7b41ff3b8c927b3703d24

https://github.com/mikebairouwe/qpnbvz/blob/main/5sT93ryiCg_226154.md

https://github.com/mikebairouwe/qpnbvz/commit/a834f8ab0081789b2ebf04edeb008a82ed46d1ea

https://github.com/insbrangotekson/hbhkxt/blob/main/EzzXeOsMqK_488710.md

https://github.com/insbrangotekson/hbhkxt/commit/d0eb62ce950d97cc363f8f98af0235be4ddb5afa

https://github.com/justinghove/tobnjf/blob/main/O899hoY2W0_993371.md

https://github.com/justinghove/tobnjf/commit/258167cae15e81abf7c428e58926ea68ca55686c

https://github.com/grootobfis/qyilhd/blob/main/D5LtTAbSCg_999321.md

https://github.com/grootobfis/qyilhd/commit/e735c95f9c3b4e5674f1db77d17dad2dc1b31d3c

https://github.com/kewarh1/dcobxt/blob/main/ZMweYs2td7_664482.md

https://github.com/kewarh1/dcobxt/commit/9e37b9a46fc743406a38f3d167bd715bbffdef2e

https://github.com/angelcorem/kcrvie/blob/main/k8Pz90kEiC_837604.md

https://github.com/angelcorem/kcrvie/commit/a7832f6be8a26e3ef87625962a08503243d9d96c

https://github.com/freckleuy/qjfbxd/blob/main/QLfMG3AuOs_222604.md

相关推荐
用户6757049885026 小时前
从失真到绝对精准:Go语言中如何进行高精度计算?
后端·go
程序员cxuan7 小时前
GPT-5.6 官宣解禁,明天全量发布!
人工智能·后端·程序员
郑州光合科技余经理7 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
喜欢打篮球的普通人8 小时前
Trition程序编写:从“Hello CUDA“到“Hello Triton“:向量加法背后的编译黑魔法
开发语言·后端·rust
苏三说技术8 小时前
Spring AI 2.0和Spring AI Alibaba,哪个更好?
后端
用户6757049885028 小时前
还在用字符串返回错误提示?Go语言优雅错误处理的正确姿势!
后端·go
雪隐8 小时前
用Flutter做背单词APP-02我画了设计稿,然后让AI帮我设计了数据库(顺便聊了会天)
前端·人工智能·后端
用户938515635078 小时前
从零打造你的第一个智能体(Agent):*手写一个能自主建项目的Mini Cursor (三)
javascript·人工智能·后端
Alan_758 小时前
GraphQL 深度解析:为什么它能替代传统 REST API
数据库·后端
SamDeepThinking8 小时前
为什么很多人学了Java,还是没真正理解类和对象?
java·后端·面试