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

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

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

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

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

元数据驱动开发

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

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

什么是元数据

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

  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

相关推荐
Chenyiax10 分钟前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH12 分钟前
Koa和Express的区别
后端
MariaH17 分钟前
Koa框架的使用
后端
luckdewei1 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某3 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy3 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom3 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
用户1474853079747 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody1237 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething3658 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈