一个思想超前的低代码平台主要实现思路

3 篇文章 2 订阅
订阅专栏

1. 背景

        当前公司一个几年前使用传统开发模式(tomcat+mysql+Jersey+mybatis)研发的一个应用服务在ToB市场卖了好几年。ToB市场最恼火的是各种定制化开发,这也是大量以项目制形式运作的外包公司和Team哪哪都是的根本原因。对于ToB的定制化开发,公司层面的应对也是左左右右:有时使用自己的研发人员进行定制化需求的研发,以保障交付的可控度。有时候交给服务商(合作伙伴)或者短期聘用外包人员。在开发界大家都有一个共识:改别人的代码往往纠结更多。老服务的问题不仅如此,性能不高使得在面对大中型企业应用时感觉身体被掏空。

        第一季度年度规划时,领导有意研发应用服务2.0,摆在眼前的问题非常明确:1、二开门槛高;2、性能需要提升。性能问题基本难不倒人(分布式常用套路:一致性哈希去分而治之,LRU等缓存策略,IO优化考虑等),二开门槛高该如何应对呢?思前想后也只有一个模糊的感觉:需要搞一个与业务无关的托管平台,并且一切皆可配。基于此,首先考虑两个最基本的方面:1、数据结构可配;2、接口可配;由此,前几个月开始了各种思路发散、方案验证、方案变更的反复,经历了2个多季度纠结,第四季度开始思路逐步清晰和收拢,研发越来越聚焦和收拢。然后昨天给BOSS进行了演示,然后就没有然后了,当即正式叫停该项目。原因很简单:咱家一直搞传统火电站,你们整个核电站,这不是我们的领域和赛道,项目风险大。

2. 整体功能

IMG

  • 数据:配置数据结构(包括表、字段、字段类型)、配置索引、配置SQL等。
  • 接口:配置接口信息(包括接口方法、路径、参数等)、接口调式等。
  • 函数:配置函数、接口母版(类似ASP.Net中的母版概念)。
  • 任务:配置定时任务。
  • 依赖:项目依赖管理(例如:企业通讯录项目依赖用户项目)。
  • 路由:配置对外HTTP交互模板路由(模板引擎结合脚本)。
  • 测试:配置接口测试用例(一个接口支持配置多个用例)、配置回归测试计划、自动化拨测计划。
  • 工具:数据库文档生成、API文档生成、客户端胶水层代码生成、配置导入、导出等。

3. 数据

IMG

        动态建表显然简单,但是如果想做Severless的aPaaS,这样干就是找死,业务变更直接导致物理表结构的变更显然不可接受。可能此时有人会这样想:那么好吧,不管3721给表预建百十个字段不就行了(有些自定表单的系统好像确实就是这样干的)。但是这样干引发的其他弊端和约束又如何解决呢?例如:表长太长影响性能、要根据预建字段进行查询怎么搞?难道强制约束为:预建字段只允许显示?……

        基于此,我们首先想到纵向进行数据存储,但如果想法仅仅这样简单,纵表带来的其他问题如何应对?例如纵表使用、理解复杂度高。纵表数据检索如何搞?在这两个问题上我们经历的曲折、反复、纠结不做介绍,最终方案的要领为:

  • 数据本身纵向存储
            数据本身类型约束为:字符串(varchar)、数字(bigint)、浮点数字(double)三者之一,不能一切皆String的原因很简单:数字1,2,11你用String去表达,最后排序你咋搞?

  • 数据索引横向存储
            数据索引表动态建表。例如给类型为String和Int的两个字段建立一个普通索,首次系统会建一张:普通索引_String_Int的索引横表,并给String和Int这2个字段建立一个普通索引。那么其他情况大家类推了。

  • 先查索引再查数据
            类似Mysql数据存储引擎的处理方式,先查索引再查数据。我们在实际的处理中采取的是索引数据和数据本身通过真实PK关联,可以把这里说的真实PK理解为一个行号,那么数据查询过程就是:先查一个数据索引横表:pk,field1,field2,其中field1,field2建立索引(PK,UNIQUE、INDEX之一)得到一个行号,然后再用这个行号(即PK)去查数据纵表(也就是说,数据纵表完全基于PK查询)。
            可能这样说大家还是不好理解,那么大家可以按照:数据本身的存储其实聚簇索引(将数据存储和索引放在一起、并且是按照一定的顺序组织的,找到索引也就找到了数据),而上面提到的索引数据是非聚簇索引(不存储数据,存储的是数据行地址),如果查询结果需要返回索引字段之外的其他字段,则需要走一个通过非聚簇索引 ->数据本身的回表过程(不过现在回想起来,我们的整个系统的这个rowId是用飘雪算法生成的8字节long,mysql如果在没有PK和UIndex的情况下,系统生成的rowId是6字节的东西,基于我们系统设计和验证绕了很多弯路后得出的结论:不要轻易自己创造什么概念和假定什么结论,如果有类似成熟系统可以参考,则应该优先使用其概念和结论。那么这里我们用8字节表达rowid,显然存在2字节的浪费,在这个以云服务器为主的年代,内存和磁盘的占用都是钱哪!这种基础的东西如果能省一点,抠一点,最终产生的收益往往非常可观,反之,浪费可观!)。这里的提到的:聚簇索引、非聚簇索引、回表其含义及做法与Mysql是相通的,只是说这些过程以前大家可以不需要关注,Mysql自身就帮你完成了。同样,在当前这套系统的使用过程中,你同样可以不需要关注,直接写业务SQL即可。另外需要说明是:考虑到性能,我们不做全表扫描,因此在后台中提交SQL时,如果条件没有命中任何索引,系统会强制拒绝该条SQL的提交。
            介绍到这里,对比一下Mysql:一个索引对应一个B+树,当一个表有多个索引的时候,数据仍然只存储一份,这些索引会跟mysql的PK或者UIndex或者默认的rowId进行绑定。可以看出:我们对于数据存储引擎的:数据本身纵向存储、数据索引横向存储、先查索引再查数据的设计理念与Mysql自身的处理机制基本一致,那么可以说:我们系统中的数据存储引擎的设计基本合理。
            可能大家有一个印象mysql这玩意单表数据超过1k万就完犊子了,但是如果完全基于PK查询,十亿级别下效率也是感人的毫秒级。演示之前我做了一个压力测试:单台8C16G服务器下,数据表在接近十亿的情况下调用读写接口的TPS性能为:

  • 写性能:
    新增数据(18个字段)写:1536.13
    新增数据(5个字段):3498.46

  • 读性能(存量数据6-8亿)
    单表查询-无本地缓存-不命中SQL缓存: 560.7
    单表查询-无本地缓存-命中SQL缓存 : 4153.7
    两表联合查询-无本地缓存-不命中SQL缓存: 241.23
    两表联合查询-无本地缓存-命中SQL缓存: 3677.78

        到这里,解决了读写问题,但还一个不可回避的问题:这样搞使用起来太复杂了!别说外包人员了,就是公司内部自己的高级研发也得骂娘。搞玩意的初衷不就是想给外面的人改起来简单方便吗?那就更一步吧:使用上对外屏蔽纵表读写的复杂度。做法是:解析SQL,然后转成纵表读写语句执行。谈到语法解析、AST什么的,我当时也是觉得这玩意太高深。还好有现成的SQL -> AST 东西可以直接用。不过接下来实现接口配置的时候,我们不得不面对。还好我们的首席架构师LM大神搞定了这块最难啃的骨头。 昨天演示了一个企业通讯录项目,其中的一个SQL配置为以下,这里我们可以看出:对外使用上是直接当横表去用的(由于进行了SQL解析,因此扩展自定义SQL函数变得十分方便)。

SELECT relation.*,org.organizationName AS organizationName
FROM organization_relation AS relation
INNER JOIN organization AS org ON relation.objectId = org.organizationId
WHERE relation.parentId = #{parentId} 
ORDER BY relation.objectOrder ; 

收一收,对数据配置总结一下:
1、纵向数据存储引擎
使用简单:以横表方式直接进行使用,对外隔离纵向存储复杂度。
读写高效:亿级数据量下读写表现良好。
约束性强:通过不允许执行无索引的查询约束使得低效SQL无法执行。

2、Demo
数据处理部分代码的Demo后续看是否有时间剥离出来Share给大家吧,目前暂时只把整个系统的DB设计贴出来给大家参考吧:(要把平台表结构给讲清楚,那不是简单能说清楚的事情,大家能从中GET到多少,那么就看大家自己了) --此段修改与2023年春节前(一年过的真快……):
在这里插入图片描述

4. 接口

IMG
        下面说说接口,接口配置中配置接口信息(包括接口方法、路径、参数等)没啥难度,可是接口的逻辑也要实现可配置如何搞?这时万恶的词法解析、语法解析,最终还是没能避开,其实也不是没有进行过尝试去避开:最开始使用现成的脚本引擎去搞,后来还用过逆波兰表达式处理,因不完全可控、达不到预期、扩展太麻烦等原因而放弃。下面简单说下脚本引擎的实现思路:

  • 词法分析
    1、扫描源代码文本,从左到右扫描文本,把文本拆成一些单词。
    2、分析出拆出来的单词是什么:关键字、标识符、符号、,注释……,其结果产物为Token。

上面的话不太好懂,举个栗子:

var a = 1 + 1;  // Comment

var :关键字
a : 标识符
= : 符号
1 : 数字
// Comment : 注释

  • 语法分析
    1、token序列会经过语法解析器识别出文本中的各类短语。
    2、根据语言的文法规则输出解析树(AST)。

需要说明的是,我们在实现过程中文法定义由配置文件表达,这样做的好处是在实现脚本多语言时,只需要定义新文法配置文件,然后写对应的statementHandler即可。目前我们的脚本语法选择高度贴合JavaScript,如果未来想搞套其他语言的语法实现则会相对方便(例如.Net支持 C#、VB.Net、JS.Net 3种语法,但编译后生成的中间语言相同)。

  • 脚本编译
    1、根据AST生成四元式。
    2、序列化四元式(有一定压缩优化,如果满大街的很长的标识符,显然很容易对其优化)。
    关于四元式举个栗子(当然现在大家基本上都是用带返回的用三元式去搞):
5 + 6 -> 四元式:

5 : p1
6 : p2
+ : operator
11 : result
  • 脚本运行时
    1、 简单来说就是按照顺序执行四元式数组,当然还有jump(想想for -> do while, if else 嘛)。
    2、 目前和JAVA原生的执行效率对比是4点几 : 200多(冒泡排序Java原生执行和脚本运行1万次的用时对比,单位:毫秒;当然这是公司发的笔记本电脑跑出的结果),为了赶演示导致没有时间继续优化(1周半完成接口、函数、项目等的后台及联调和问题解决),这块还有提升空间,应该能做到跟JAVA原生差1一个量级。

  • 脚本能力
    1、支持JavaScript语法和数据结构,例如:运算、条件、循环、判断等;String、Number、数组、Map等;函数(匿名函数)、对象等。
    2、此外内置提供应用开发中常用函数,例如,DB操作、Redis操作、LRU缓存等。
    3、脚本支持分布式(一个接口如果因为业务逻辑确实很重时通过分布式执行方式可以充分发挥服务器集群能力),同时支持非阻塞旁路分支逻辑(例如,创建用户的同时需要请求其他系统获取Token,获取Token走旁路逻辑则不影响创建用户接口自身响应时间)。

收一收,对接口配置中涉及的脚本引擎总结一下:
1、自定义脚本引擎
简洁易用:高度贴合JavaScript,内置应用开发所需的常用函数。
扩展性强:脚本增加新语法、内置函数快速简单。
执行高效:通过基于非解释性元组的执行方式使得执行效率非常高效,同时编译产物有一定压缩率。
支持分布式:一段脚本执行到任意一行之后支持交给其他节点服务器继续进行处理。

2、Demo
上面说了那么多,可能大家还是一头雾水,后来我专门写了一篇专题介绍:

  • 编译原理抽象语法树生成及执行实例:https://blog.csdn.net/camelials/article/details/123415475
  • expression-engine-protype源码:https://github.com/bossfriday/expression-engine-protype

如果大家能理解和体会清楚(自己把Demo代码调试一遍),就会发现扩展新的语法支持,其实也是相对容易的搞定。

5. 其他

  • 定时任务
    定时任务的实现是将quartz与脚本运行结合实现的,不想花额外的精力,况且cron表达式已经是大家共识的规范。

  • 复用性
    1、依赖,真正意义上实现了应用开发中经常提起的模块化能力,演示中展示的就是:“通讯录项目”依赖“用户项目”。 简单来说就是支持已有项目组合,然后再去加已有项目能力之外的东西,已有的能力和新加能力在一起就全部可用了。
    2、通过import方式支持函数复用、通过母版的方式支持应用内全局复用。

  • 文档及客户端代码生成
    1、DB和API所有定义规则服务端均有明确表达,具备生成这2个文档的能力理所当然。
    2、同样客户端接口调用胶水层代码生成也是同一个道理。

  • 开发环境
    1、WEB IDE插件目前不是鲜见的东西了,早在2019年5月7日微软就推出了WEB版本VS Code,目前支持代码提示、代码格式化、查找定义等。
    2、此外还支持Debug调试(后台具备能力,WEB后台没加)、日志获取等。
    3、参考VS Code后,我新设计的配置后台原型个人认为更加合理。

IMG

  • 客户端逻辑植入(当前未实现)
    1、 基于对脚本引擎的介绍大家可以知道整个运行机制其实就是执行四元式数组,那么只要实现安卓、OC、WEB的执行器后就可以做到服务端定义客户端逻辑后下发给客户端去执行。那么终极的效果可以做到:客户端UI稳定之后,客户端逻辑变更将不再需要客户端发版(客户端发出去的版就是泼出去的水,就问你微信让你强制升级你恼火不?)。

  • 方案可行性证明
    1、 上述图片展示的配置WEB后台调用的接口就是基于目前的这套游戏规则手工配置出来的(手工把接口相关信息写到配置库里,然后编译)。就是说自己后台的接口用自己的游戏规则去配出来先验证一次。
    2、 演示企业通讯录项目:用户项目包括创建用户、用户登录、各种获取/修改用户信息等功能。通讯录项目包括创建公司、部门及其关系、全量获取通讯录信息、按需增量获取通讯录信息、加人、删人等等。基本上花1天时间完成通讯录的主体功能。Github上某著名项目:某API对外称相对传统开发模式效率提升25倍以上, 那么我们搞的这玩意不知道说得说多少倍合适了(某API的本质其实就是API是SQL的另一种表达形式,需要手动建横表)。

6. 低代码能力的五个级别

  • L1. 基础表单工具
    支持用户自定义表单,表单支持基础权限管理,支持基础的主从表结构,面向非编码人员,基本不支持函数,也不支持编程。适用场景,调查登记表, 问卷等。

  • L2. 低代码平台
    支持用户自定义表单,支持综合性的主从表单,支持丰富的权限体系,支持完全自定义的用户角色,支持流程与基础报表分析。 支持部分函数,支持部分的前端编码干预,开放通用的数据接口, pc端移动端双向适配。 不支持复杂业务场景。适用基础客户关系管理, 部分的销售、采购管理等。

  • L3. 企业级低代码工具
    支持完全的用户自定义数据结构,生成相应的综合性表单和接口, 支持复杂的角色权限体系设计, 支持所有的前后端编码 。 非内置的复杂场景,需要自行编码完成。 相对完整的组件级封装,pc端移动端双向适配。 有完整的架构设计,大概包括数据结构、权限、元数据、流程、菜单、业务分层、系统配置、路由、日志等。基本无内置完整应用。 架构相对完整,适合初级人员快速开发独立的项目,组件级封装大大减少前端编码量。 复杂业务场景未能有效简化。

  • L4. 高级企业级低代码工具
    支持用户自定义数据结构,生成全能型表单和接口, 支持完整的权限体系设计,支持前后端编码, 内置处理大部分复杂场景。 自动化处理大部分CRUD工作,全面业务封装,pc端移动端双向适配。 覆盖完整的架构设计,内置成熟的应用。适合定制化的综合性项目,整体代码量非常少。

  • L5. 与机器沟通完成编程
    无需任何编码知识,只需跟机器沟通需求,机器自己组装代码完成编码工作。 非完全人机对话可实现, 基于庞大的代码库和AI技术, 人类面向代码引擎,描述要解决的问题,机器调用代码库,用户根据代码描述选择就行。 所有的代码抽象为过程,同时生成可被普通人认知的描述, 普通人根据描述认知每个过程,并组装。

        其实我曾对低代码未来趋势、现状分析等做过调研和向BOSS汇报,目的很简单:希望这个项目能活下去。曾经写过2个汇报PPT,一个是XX公司提供 aPaaS 云服务调研分析,从历史发展趋势的:物理机-虚拟机-云-到Serverless,再到最后的低代码aPasS,然后谈及Gartner预测:2024年所有应用程序开发活动当中的65%将通过低代码的方式完成、未来5年中国企业数字化转型至少需要开发5亿个新应用。再到资本风向、大厂布局、低代码行业现状,利弊分析等方面给BOSS吹风。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

然后还写了一个关于将来对外推广宣讲材料草稿及思路的PPT,里面对于平台介绍、未来产品规划、商业模式(运行时开源、用户可选择全云上Serverless使用,也可以选择云上开发,私有运行和全私有方式)等均做了具体规划和设想。无奈公司战略级问题,岂是我等鼠辈能左右。假如有老板喊融资一个Y,哪我肯定秒跟了(不让做白日梦,黑日梦总可以吧?)。目前DD-YD虽然背靠实力庞大的AL,而且其目的也是做生态,但从本质上来说还是基于表单的数据获取、展现及分析的低代码,就算将来具备了良好的生态,也不能真正达到L5。
在这里插入图片描述

7. 结束语

        在2021年的最后1天稀里哗啦写那么多,一方面回顾今年主要工作,另一方面,希望给低代码后来之人提供一些思路参考。需要说明的是,这玩意纯属于闭门造车,我们Team中的这几个人之前在低代码领域都是小白,方案中的不妥之处,还请各位看官轻点。 以前真不懂什么叫做集体的智慧,什么事情都是自己闷想,经过该项目后,才真正体会到什么是集体的智慧。我在这个项目中做的事情比较杂,面上的负责人,实际上,架构师的系统设计、程序员的代码编写、产品经理的UI原型设计、项目经理的计划排期都搞了。希望L4的低代码+AI+良好生态的Level5级产品早日问世(生态这玩意已经不是技术问题,也不是个人能推动和解决的事情了)。这里只是简单介绍低代码平台建设思路,后续考虑开源部分代码原型;如自定义脚本引擎,纵向数据存储引擎等。

原创不易,请给作者打赏或点赞,您的支持是我坚持原创和分享的最大动力!
在这里插入图片描述

2024年,java开发还有未来么?
pantouyuchiyu的博客
05-30 1020
Java凭借跨平台性、面向对象和强大生态系统成为最受欢迎的编程语言之一,市场需求广泛,就业领域多样,技术发展前景良好。Java开发依然具有广阔的发展前景和学习机会,但持续学习和努力是成功的关键。Java自诞生以来,凭借其跨平台性、面向对象和强大的生态系统,迅速成为了全球最受欢迎的编程语言之一,不仅在企业级应用中占据主导地位,还在Web开发、移动开发、大数据处理等领域拥有广泛的应用。而它广泛的应用和强大的社区支持,也使它在全球编程语言排行榜上始终保持着领先地位。
从零实现一套低代码(保姆级教程)【后端服务】 --- 【16】初始化后端项目
weixin_46726346的博客
01-15 1234
在前面的实现过程中,我们的低代码平台,在前端已经有一定的构建页面的能力了。但是对于我们实现一个平台,肯定要支持用户对页面进行保存等功能,包括后面我们运行时的设计,都要依赖于后端的能力所以,现在我们需要考虑开始使用数据存储了。那因为博主平时的工作主要都是前端开发,所以后端框架选择了比较贴合前端的。我们低代码来讲,通常是对协议的保存以及修改,所以我们的数据库使用,当然,如果读者有一定的后端开发经验,可以自行选择后端框架和数据库。
5大低代码开源平台案例研究
NocoBase 的博客
08-15 1410
本文深入探究物流、金融等行业的五大案例,揭示低代码开源平台如何助力企业应对技术挑战,激发业务创新活力。
实现原理看低代码
2401_83915664的博客
03-29 969
低代码平台需要支持用户存储自定义数据,因为每个应用所需的字段是不一样的。自定义数据存储是后端低代码最重要的功能,使用什么方案将直接影响这个产品的适用范围,目前我们已知有 5 种方案,每种都有自己的优缺点。你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;
如何设计一个低代码平台
Jarod_Chou的博客
10-17 7786
近些年来,低代码发展火热,各种低代码平台如雨后春笋纷纷崛起,这些平台各定位不同,优劣不同,用户的选择空间很大。那么,如果用户想从零开始设计一个低代码平台,该如何做呢?
带你一步步实现低代码开发平台——概述、实现模式、整体框架
热门推荐
学海无涯,行者无疆
04-24 1万+
当下,低代码与无代码的概念正炙手可热,市面上涌现了众多相关平台。客观而言,低代码开发平台确实通过配置化的方式显著提升了开发效率,降低了成本,并缩短了项目周期。同时,这种开发方式也降低了对开发人员的技能要求,所生成的代码更为标准化,有效减少了低级错误,间接提升了软件质量。然而,低代码开发并非是一个全新的概念,其历史可追溯至较早时期。在一个软件系统中,许多功能具有共性,这些功能可以通过抽象建模和标准化来简化开发流程。例如,单实体(如计量单位)对应单张数据表,展示和操作方式相对简单;
带你一步步实现低代码开发平台——低代码配置模块、实体、模型设计
学海无涯,行者无疆
05-15 5186
今天我们通过一个实际案例来辅助说明下低代码平台设计。之前开源了一套通用接口平台,详见专栏。我们将其迁移整合一下,使其成为开发平台一个功能模块。接口平台自身基础数据的维护,如应用、接口服务、消息主题等,需要实现相应的管理功能。
一种关于低代码平台(LCDP)建设实践与设计思路
阿里云云栖号
08-18 3482
业务线特别多,每个业务线对同一个页面都有个性化布局和不同的字段需求,在资源有限的情况下如何支撑好呢?本文就降本的情况下,如何低成本构建产品能力去支撑多条业务线、多租户。
低代码平台实现原理
Z__7Gk的博客
06-20 1050
基于模型驱动的可视化开发是当前低代码平台实现主要实现技术,为什么基于模型驱动开发成为了低代码主要技术途径,本文阐述其基本的实现原理。
<Verilog实现加法器>四位超前进位加法器设计———持续更新版
IC跳跳鱼的博客
04-29 4219
一,内容介绍 加法器是数字电路中的最基础电路之一,也是CPU的核心功能之一。 在这个专栏,我会把所有我知道的数字电路的加法器相关模型都实现一遍并解释其原理。 编程使用的语言为Verilog,代码风格为强迫症系列风格。 加法器系列链接: 上一篇:4位行波加法器设计 目前:四位超前进位加法器设计 下一篇:暂无 ...
<Verilog实现加法器>brent-kung加法器设计——超前进位加法器改进
IC跳跳鱼的博客
04-30 1830
一,内容介绍 加法器是数字电路中的最基础电路之一,也是CPU的核心功能之一。 在这个专栏,我会把所有我知道的数字电路的加法器相关模型都实现一遍并解释其原理。 编程使用的语言为Verilog,代码风格为强迫症系列风格。 加法器系列链接: 上一篇:brent-kung加法器设计 目前:koggle-stone加法器设计 下一篇:ladner-Fisher加法器设计 ...
1.低代码平台实现目标.md
08-04
包含低代码平台的整体实现目标,以及具体到各个模块时的代码实现功能罗列。 是实现低代码平台的最最基础的元素,帮助您扩展一下思路。希望对您有帮助!
MATLAB算法实战应用案例精讲-【智能优化算法】蜻蜓算法(DA)(附MATLAB代码实现
qq_36130719的博客
04-06 882
蜻蜓算法(Dragonfly algorithm,DA)是Seyedali Mirjalili于2015年提出的一种群智能优化算法,蜻蜓算法的主要灵感来自于自然界中蜻蜓的静态和动态成群行为。在静态群体中,蜻蜓会分为几个子群体在不同区域飞行寻找食物;在动态群体中,蜻蜓会聚集成一个大群体沿着一个方向飞行,因此将这两种群体行为近似对应到群智能算法的全局探索和局部搜索中。
《代码大全2》读书笔记
在路上
07-18 1456
第7章 高质量的子程序 7.1 创建子程序的正当理由 降低/隔离复杂度,隐藏实现细节,引入中间的、易懂的抽象 避免代码重复,支持子类化 提高可移植性,限制变化所带来的影响 简化复杂的逻辑判断,改善性能 7.2 在子程序层上设计 功能的内聚性:只做了一件事并把它做得很好,操作与名称相符 顺序上的内聚性:包含需按特定顺序执行的操作,它们共享数据且只有全部执行完功能才完整 通信上的内聚性:不同操作...
技术人员的一点产品思维思考
最新发布
AI天才研究院
09-26 367
作为一线的开发人员,大家是不是都经历过和产品吵得不可开交的经历,甚至最后谁也无法说服谁,只能将问题上升。最后由老板出面解决,而大多数情况下老板还真能够以某种方法去解决,并且是一个双方都能接受的方案。这个时候可能大部分同学会认为是老板的权威,地位导致了这一结果。其实这很不准确(可能有一部分原因但绝对不是主要原因)其实更多的是各个老板们有比一线开发更强的产品力,能够听懂对方的诉求和抓住矛盾点并且给出解决方案。
天画项目-低代码平台-总体设计实现
程序男的专栏
12-27 5672
一、背景&需求 1.1 总体背景 我在业余时间构建了一个租房平台,采用springboot微服务的架构模式,同时结合服务化思想进行代码实践,但是由于存在很多重复且低效的变更导致业余时间对这个租房平台的进度产生影响。作为开发人员长期维护一个业余项目产生了很多进度延迟和效率问题会导致项目项目被遗弃的概率增大,对开发者来说也是一个非常沮丧的事情。为了避免这种事情发生,我一方面鼓励自己尽量每天贡献代码,并在合适的时间构建提高开发效率的使用平台。另一方面也是为了借助这个租房平台进行微服务+分库分表+DDD
低代码平台系统实现详解
lssffy的博客
08-10 827
低代码平台是一种新兴的开发技术,它通过可视化界面和预构建模块,使开发人员能够以最少的手工编码量创建应用程序。低代码平台主要目标是降低开发的复杂性,减少开发周期,并帮助企业快速应对市场需求。典型的低代码平台包括Microsoft PowerApps、OutSystems、Mendix等,它们通过拖放式界面设计、自动代码生成、业务流程管理等功能,显著提升了开发效率。总结低代码平台的现状,分析其在企业数字化转型中的作用和前景。
原来低代码平台可以这样设计
程序员成长指北
07-23 2861
大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群本文会主要分享自己对低代码平台的理解,从多个角度和问题去看低代码平台设计。我觉得「低代码平台的核心在于模型设计,包括控件模型、组件模型、画布模型等等」。希望看完本文,你能知道:低代码平台核心的底层逻辑是什么?为何常见低代码平台都包含“控件区”、“布局区”和“属性编辑区”...
带你一步步实现低代码开发平台——低代码配置模块视图功能总体设计
学海无涯,行者无疆
05-22 3406
上一篇介绍了整合接口平台,架构优化,使用低代码配置模块、实体、模型,今天接着上篇继续写,重点介绍下视图整体的设计。 视图,实际上也就是前端web页面,这部分超级复杂。根据用途不同,将视图进行了分类,建模产生以下类型的视图 - 列表视图 - 新增视图 - 修改视图 - 查看视图 - 树视图 - 树表视图 - 参照视图 - 树参照视图 - 树表参照视图 - 主从视图(待实现) - 自定义视图(待实现
生成一个4bit位超前进位加法器verilog代码
03-31
module adder4bit_carryahead(a, b, cin, sum, cout); input [3:0] a; input [3:0] b; input cin; output [3:0] sum; output cout; wire [3:0] s; wire [3:0] c; assign s = a + b; assign c = (a & b) | (a & cin) | (b & cin); assign sum = s; assign cout = c[3]; endmodule // Testbench module testbench; reg [3:0] a, b; reg cin; wire [3:0] sum; wire cout; adder4bit_carryahead adder(a, b, cin, sum, cout); initial begin a = 4'b0000; b = 4'b0000; cin = 0; #10 a = 4'b0001; #10 b = 4'b0011; #10 cin = 1; #10 a = 4'b1111; #10 b = 4'b0001; #10 cin = 0; #10 $finish; end always @(posedge clk) begin $display("a=%b b=%b cin=%b sum=%b cout=%b", a, b, cin, sum, cout); end endmodule
写文章

热门文章

  • 一个关于国产化适配 的PPT文案 22624
  • ChatGPT接口使用及计费策略简述 7220
  • 一个思想超前的低代码平台主要实现思路 5758
  • 开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述 3733
  • Mockito+Junit单元测试快速入门 3430

分类专栏

  • 手撸IM 2篇
  • 其他 11篇
  • AI & LLM 4篇
  • LDAP 5篇
  • 低代码 3篇
  • 信创国产化 1篇
  • JMeter 3篇
  • 分布式 3篇
  • ActorRPC 2篇

最新评论

  • JAVA版网易云音乐格式转换器

    熊云达: 表情包我把代码拉下来试了试,的确可以将网易云音乐的.ncm文件转换为标准音乐格式.flac。亲测有效,笔者棒棒哒! 我懒得去详细的看代码,所以只是粗略的浏览了类描述与方法描述,于是开始调试, 第一次尝试,在本地创建了两个文件夹,一个是歌曲源文件夹,另一个是破译歌曲源文件夹,运行程序,显示运行结束(没有显示破译日志记录),最后“解码失败”,导致源文件内容被全部删除。 第二次尝试,直接将歌曲源文件复制到当前项目的ncm目录下,再次尝试,成功解码! 等我有空了,给加一个界面,直接做成软件,这样应该会给其他更多的人带来方便。表情包

  • JTextField限制只能输入特定字符

    2401_83977689: 文章结构严谨有条,层次分明,读起来一点也不费劲,让人受益匪浅。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Spring Cloud Gateway XSS防护大众方案实现优化

    Hyman先吃饭: 如果是get请求的话 XssRequestFilter 第10行getBody再处理会报错吧,我在之前单独过滤get请求就可以

  • Spring Cloud Gateway XSS防护大众方案实现优化

    BossFriday: 排查gateway之后的处理服务是否收到了请求,如果能收到,则排查请求长什么样子,是否有错误。如果收不到,优先排查后面的服务是否有活着并且可达的节点。

最新文章

  • SpringCloud Gateway HTTP/HTTPS 路由/监听双支持
  • Java程序员Python一小时速成
  • 开源DMS文档管理系统 Nuxeo Vs Alfresco对比及 API 使用概述
2024年9篇
2023年10篇
2022年14篇

目录

目录

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BossFriday

原创不易,请给作者打赏或点赞!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司宝安怎样在网站优化网站链接结构优化的作用网站seo优化关键广东企业网站优化公司如何济南企业网站优化河南百度网站关键词优化西安网站优化公司地址公司网站访问慢优化亳州网站优化哪家合适茌平县优化网站公司成都哪个网站做优化好闵行区项目网站优化价格萍乡湘东区网站优化铝业网站seo优化联系方式西工网站优化上饶网络推广网站优化中山快速网站优化厦门网站排名优化价格济源实力网站优化公司电话郴州网站页面优化杭州专业网站seo优化公司怀宁网站优化费用瑶海优化型网站网站优化需要避开的误区优化网站链接的方法小程序网站优化营销黄浦区百度网站优化定制阳江网站优化技巧贵阳网站如何做优化推广网站优化过程中的内链香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化