根据这个定义,我们就会发现很多工具都是低代码工具。例如:C# 程序员比较熟悉的 CodeSmith。就是一个典型的低代码工具。它有效的减少了重复代码的编写,提高了开发效率。我以前也用 python 写了一些类似工具,并且让其支持一些简单的逻辑让它变成 DSL。
大家熟悉的 SQL(结构化查询语言)就是 DSL。SQL 就是优秀的低代码工具。
所以我们得出一个结论:二次开发绝对不是低代码!
国内低代码平台,基本都包含一个可视化的设计器,通过可视化定义UI,工作流和数据模型。通过拖拉来编程。然而项目本身的复杂性是无法通过拖拉来避免的。有过 Delphi 开发经验的人肯定有其深刻的印象。拖拉编程不能解决业务的复杂性问题,反而会带来开发效率变慢,工作量变大的问题。举个简单的例子:需要分布式事务这种拖拉编程,怎么解决?如果真的要用 UI 来设置的话估计整个工程都会变的非常复杂!需要分布式缓存和数据库一致性的又该怎么解决?而这些还不涉及到非常复杂的业务问题!所以拖拉编程最后的结果只是低能和弱智的表现。还有一种拖拉编程拖拉的是业务组件,这个更扯,如果对于非标的业务,那么这个组件就要适配所有非标的情况,这个组件的学习成本,维护成本该多高啊!如果这种组件在项目中是普遍存在的,那么整个项目的学习成本和维护成本又该是个什么量级的喃?
结论:目前国内号称的低代码平台的现状,其实就是封装的很差的框架。用这个框架来进行二次开发!这种产品非但不能降低开发的难度,提升产能。反而处处掣肘,不仅仅要学习这个框架的用法,还要考虑自己的业务和这个框架的匹配度,如果自己的业务需要实现的功能框架本身支持差怎么办?调试错误难怎么办?所以吃过太多苦的业内人士,一提到低代码,就认为这就是低能弱智的东西,骗老板钱还给自己工作量翻倍的垃圾玩意儿!
真正的低代码平台,必须符合两个条件:
案例:为现有的登录模块添加缓存,让应用程序先读取缓存中的数据,如果缓存中的数据不存在,才读取数据库中的数据!同时,在修改或删除数据的时候,必须同步将缓存中的数据也一起修改或删除
需求的分析:
缓存和数据库双写一致性方案:
此外还有缓存更新失败、删除失败、数据库保存失败,都有可能影响到缓存数据和数据库不一致的问题
结论:即使是通过编程来实现上面的业务需求,都是非常复杂的事情!通过拖拉来实现这种业务是绝对不可能的事!
因为 DawnSql 支持如下特性:
CREATE TABLE IF NOT EXISTS public.my_users (
-- 用户ID
UserID INTEGER NOT NULL auto,
-- 用户名
UserName VARCHAR(15) NOT NULL,
-- 密码
Password VARCHAR,
PRIMARY KEY (UserID)
) WITH "template=manage";
INSERT INTO public.my_users (UserName, Password) VALUES('张三', 'zhangsan');
INSERT INTO public.my_users (UserName, Password) VALUES('李四', 'lishi');noSqlCreate({"table_name": "public.my_users_cache", "mode": "partitioned"});function get_user(user_name:string, password:string)
{
let vs = noSqlGet({"table_name": "public.my_users_cache", "key": concat(user_name, password)});
match {
notNullOrEmpty?(vs): vs;
else let rs = query_sql("select g.UserID from public.my_users as g where g.UserName = ? and g.Password = ?", [user_name, password]);
let result;
for (r in rs)
{
-- 如果存在就保存在缓存中,并且返回
noSqlInsert({"table_name": "public.my_users_cache", "key": concat(user_name, password), "value": r.first()});
result = r.first();
}
result;
}
}
-- 查询
get_user('张三', 'zhangsan');function get_user_obj(user_id:int)
{
let rs = query_sql("select g.UserName, g.Password from public.my_users as g where g.UserID = ?", [user_id]);
rs.next();
}function update_user(user_id:int, password:string)
{
let user_password = get_user_obj(user_id);
let my_key = concat(user_password.first(), user_password.nth(1));
let lst = [['update public.my_users set Password = ? where UserID = ?', [password, user_id]]];
lst.add(noSqlDeleteTran({"table_name": "public.my_users_cache", "key": my_key}));
trans(lst);
}function delete_user(user_id:int)
{
let user_password = get_user_obj(user_id);
let my_key = concat(user_password.first(), user_password.nth(1));
let lst = [['delete from public.my_users where UserID = ?', [user_id]]];
lst.add(noSqlDeleteTran({"table_name": "public.my_users_cache", "key": my_key}));
trans(lst);
}结论
DawnSql 本身就是一个低代码平台,它不仅仅有完善的基础设施,还有自己的脚本语言,用户只需要通过脚本语言就可以描述完成整个业务!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。