我是如何提高代码的可扩展性的

2024-05-09 01:08
文章标签 代码 提高 可扩展性

本文主要是介绍我是如何提高代码的可扩展性的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近写了一个逻辑表达式引擎(everlogic),对于如何提高代码的可扩展性做了一些思考,在这里做个总结,希望对大家有所启发。
该引擎想要达到的目标是传入一组参数,判断参数是否满足一定的逻辑条件。如传入参数 A 和 B,判断A、B是否都大于100,且 A 大于 B,逻辑表达式如下

A > 100 and B > 100 and A > B

除支持简单的逻辑表达式,还支持多个表达式的聚合,如

(A > 100 and B > 100 and A > B) and (C > 1000 or D > 10000)

除了支持数字类型参数外,还可以支持其它类型数据,例如

  • 字符串
  • 日期
  • 布尔
  • JSON

等等,并且需要支持自定义类型,让用户可以自由扩展该引擎。

抽象

逻辑单元

如数字逻辑、字符串逻辑、日期逻辑等等,是逻辑运算的具体场所。

转换器

用于将输入数据转换为可比较的类型,如数字转换器,将输入转为数字类型(Double)。这样用户就可以自主控制输入的转换,例如有些场景可能需要将 null 转换为 0,而不是报空指针错误。

比较器

用于比较数据,例如比较数字、日期、布尔等数据类型。这样用户可以自由扩展自己的比较逻辑。

逻辑单元依赖具体的转换器和比较器。

工厂

因为需要支持多种类型的逻辑单元,很自然地想到用工厂生产具体的逻辑单元。

工厂根据不同的数据类型返回具体的逻辑单元,如当数据类型为数字时,返回数字逻辑单元。

so far so good

继续思考,如果用户想扩展自己的类型,但不能修改核心代码(将引擎作为一个类库使用),以上的设计能支持吗?

例如用户需要扩展一种代表矩形的数据类型,增加矩形相关的逻辑,如比较大小、判断面积是否相等。用户该怎么做?

好像遇到了一点困难。仔细思考,造成困难的原因是什么?

只有一个工厂,只能生产固定的几种逻辑单元。

既然找到原因了,那就要想办法了。是否可以支持多个工厂,让用户可以生产自定义的逻辑单元?

答案是可以的,需要将原有的简单工厂,修改为包含简单工厂的工厂容器,让用户可以往容器内添加简单工厂。

扩展新逻辑

只需要以下几步,用户即可扩展自己的逻辑单元

  • 定义新的数据类型
  • 定义转换器、比较器
  • 定义逻辑单元
  • 定义新的逻辑单元工厂
  • 将工厂注册进工厂容器

感兴趣的朋友可以看 示例代码

这篇关于我是如何提高代码的可扩展性的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971956

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

麻了!一觉醒来,代码全挂了。。

作为⼀名程序员,相信大家平时都有代码托管的需求。 相信有不少同学或者团队都习惯把自己的代码托管到GitHub平台上。 但是GitHub大家知道,经常在访问速度这方面并不是很快,有时候因为网络问题甚至根本连网站都打不开了,所以导致使用体验并不友好。 经常一觉醒来,居然发现我竟然看不到我自己上传的代码了。。 那在国内,除了GitHub,另外还有一个比较常用的Gitee平台也可以用于

众所周知,配置即代码≠基础设置即代码

​前段时间翻到几条留言,问: “配置即代码和基础设施即代码一样吗?” “配置即代码是什么?怎么都是基础设施即代码?” 我们都是知道,DevOp的快速发展,让服务器管理与配置的时间大大减少,配置即代码和基础设施即代码作为DevOps的重要实践,在其中起到了关键性作用。 不少人将二者看作是一件事,配置即大代码是关于管理特定的应用程序配置设置本身,而基础设施即代码更关注的是部署支持应用程序环境所需的

53、Flink Interval Join 代码示例

1、概述 interval Join 默认会根据 keyBy 的条件进行 Join 此时为 Inner Join; interval Join 算子的水位线会取两条流中水位线的最小值; interval Join 迟到数据的判定是以 interval Join 算子的水位线为基准; interval Join 可以分别输出两条流中迟到的数据-[sideOutputLeftLateData,

Git代码管理的常用操作

在VS022中,Git的管理要先建立本地或远程仓库,然后commit到本地,最后push到远程代码库。 或者不建立本地的情况,直接拉取已有的远程代码。 Git是一个分布式版本控制系统,用于跟踪和管理文件的变化。它可以记录文件的修改历史,并且可以轻松地回滚到任何历史版本。 Git的基本概念包括: 仓库(Repository):Git使用仓库来存储文件的版本历史。一个仓库可以包含多个文件

HTML文档插入JS代码的几种方法

在HTML文档里嵌入客户端JavaScript代码有4中方法: 1.内联,放置在< script>和标签对之间。 2.放置在由< script>标签的src属性指定的外部文件中。 3.放置在HTML事件处理程序中,该事件处理程序由onclick或onmouseover这样的HTML属性值指定。 4.放在一个URL里,这个URL使用特殊的“javascript:”协议。 在JS编程中,主张