当前绝大多数管理信息系统都采用面向对象思想开发实现,其优点是贴合管理业务逻辑,比如将部门、员工、订单、商品、客户都抽象成对象,该对象的属性和行为对应真实业务场景,逻辑清晰,易于理解,开发效率高。另外利用封装、继承、多态快速搭建通用模块(权限、审批、日志、报表),便于复用与扩展,更加提升了开发效率。
但随着信息化推进逐渐深化,管理信息系统规模越来越庞大,需求变更越来越频繁,传统的面向对象开发也越来越力不从心。具体表现为开发周期漫长、需求响应迟缓、个性化开发费用高。导致这些问题的原因就是过度滥用面向对象思想 ,面向对象的封装 在隔离变化的同时也限制了变化,使得后续调整的代价大大增加。面向对象的继承和多态的方法论过于高端,在面对大多数业务需求时,开发人员最常见的做法是加个条件语句,而不是采用继承和多态的方式实现;但如果开发人员采用继承和多态去实现需求,就引入了巨大的后期维护成本,继承层级越深,维护代价呈指数级上涨。

这是国内外的研究共识,管理类业务系统不适合深度继承 ,其实无论什么类型的软件,过多的继承层次都是难以掌握的。管理软件行业目前的主流改良做法是严格控制继承,只做单层或二层极简继承,并且采用组合聚合的方式来扩展功能。易元平台认为主流改良做法没有解决根本问题 ,仅仅缓解了继承和多态导致的问题,但根源问题是封装导致,因为封装从一开始就限制了变化,而管理信息系统当前最迫切的需求就是柔性管理和拥抱变化。
笔者在这里先提出一个结论:当前管理信息系统面临的矛盾之一就是:面向对象封装的限制与不断增长变化的需求之间的矛盾。接下来继续说明如何解决这个矛盾。
元数据驱动开发
管理信息系统有大量的易变数据信息不适合用对象封装,而市场经济的不断深化、信息化的不断发展也要求管理信息系统能更好更快地适应需求变化。面向对象设计思想无法解决管理信息系统适应需求变化时遇到的困境,笔者认为:管理信息系统应全面采用元数据驱动开发,这是目前解决传统开发方式无法快速适应需求变化的问题的最佳途径。
接下来从元数据的定义、历史、作用等各个方面详细讲述为什么推荐采用元数据驱动开发。
什么是元数据
元数据是描述数据的数据,元数据可以描述静态结构内容,也可以描述动态过程、流程、行为和事件等,按描述的内容可以分为两类:
-
静态元数据 - 描述事物的结构
比如描述客户表有如下字段:编号(上限20字符,唯一)、客户名称(上限100字符,下限1字符,唯一)、电话(上限20字符)、地址(上限200字符)、业务员(引用职员表,不允许空)、备注(上限500字符)。
上面的元数据描述了客户表的静态结构,规定了客户表中存放的数据应符合的规范要求,这种元数据就是静态元数据。
-
动态元数据 - 描述数据变化,并制订规则
比如描述新增订单保存之后如何增加库存上对应商品的数量;或者描述流程的各个步骤,每步的审批人和下一步骤等。
上面的元数据要么描述动作行为发生对数据的影响;要么描述数据流转过程,每一步怎么做,下一步到什么步骤等等。都是对动态变化的描述,称为动态元数据。
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