多项目整合设计求思路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
leegoo
V2EX    程序员

多项目整合设计求思路

  •  
  •   leegoo 2023 年 5 月 28 日 2093 次点击
    这是一个创建于 976 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有几个不用的项目,这几个项目都会解析 zip 压缩文件,zip 压缩文件中有很多子文件,每个项目有相同的一部分(大概占了 60%),还有一部分是项目个性化的。

    目前的实现方式是通过用代码编写多个程序解析相同的代码和个性化的代码。

    现在假设代码逻辑是从一个 zip 子文件中解析 A 子文件,A 子文件取第 1-4 个字节代表 XX ,然后进行计算,最后会进行存表或者其他处理。

    目前这种方式的弊端是如果再来一个项目又需要用代码编写,我想能不能整合在一起?

    我了解了一下规则引擎,不知道规则引擎适不适合这个场景?或者有没有其他的方式能把这几个项目合起来通过页面的方式进行配置。

    我想的最终实现效果,通过在页面上,比如新增一个项目,我能通过一定的规则配置对应 zip 压缩包里面的子文件,哪几个字段用什么方式进行解析、计算、存储等操作。

    其他附加说明: 1.主要工作语言是 Java 。 2.这个工作参与开发的人较少。

    13 条回复    2023-05-29 13:44:23 +08:00
    vitovan
        1
    vitovan  
       2023 年 5 月 28 日
    能,但是对于规则引擎这方面,使用 Java 写起来比较痛苦(个人感觉)。
    waitingChou
        2
    waitingChou  
       2023 年 5 月 28 日
    这个就看你抽象能力了。 听你的描述,场景比较典型。

    你需要抽象出相同的处理流程(比如,先获取文件类型,在进行对应的逻辑处理,逻辑处理里可以进一步细化),
    相似的处理逻辑(类似 都要取 A 文件 前 1-4 字节 来判断后续处理逻辑)

    引擎这东西其实很多业务需要的功能并不复杂,自己也可以简单写一个
    每个项目都有一个配置文件类似 {“protocol”:"A", "logic":"1"} ,需要根据业务自行设计
    解析文件的时候 进行判断

    if ( $config["protocol"] == 'A')
    // do sth A
    else ....

    当然优雅点你可以用策略或者模板的 设计模式。看你自己实现
    luozic
        3
    luozic  
       2023 年 5 月 28 日
    解析和存储都相对好做。 中间的计算如果比较复杂搞规则引擎还容易搞出别的问题
    MIUIOS
        4
    MIUIOS  
       2023 年 5 月 28 日
    你这上规则引擎反而更麻烦,听你的需求其实可以自己写一个简单点的规则就行了,把相同的操作抽象化,把哪些固定死的常量变成变量就行了
    akira
        5
    akira  
       2023 年 5 月 28 日
    zip 只是做为 压缩和打包的功能
    解析 别搞太多自定义的东西,基本上就通用了啊
    2828kakafa
        6
    2828kakafa  
       2023 年 5 月 29 日 via iPhone
    帮你问了下 gpt4

    规则引擎可能确实适用于你描述的这种场景。它可以帮助你管理和应用业务规则,而无需将这些规则硬编码到每个项目的代码中。其中一个好处是,业务规则可以独立于代码进行修改和维护。你可以使用一些开源规则引擎,例如 Drools ,它是一个基于 Java 的业务规则管理系统( BRMS )。

    将这些项目整合在一起的一个可能的方式是:

    1. 创建一个核心服务,它实现你的公共功能,比如解析 zip 文件和处理子文件。这个服务可以暴露 API 供其他服务调用

    2. 对于每个项目的个性化部分,你可以使用规则引擎来管理。你可以为每个项目编写一组规则,这些规则定义了如何处理每个项目的个性化内容。规则可以配置为解析特定的字段,进行特定的计算,以及确定存储方式等。

    3. 你可以创建一个配置页面,通过这个页面,你可以为每个项目配置规则。这个页面可以连接到规则引擎,让你能够添加、修改和删除规则。

    这种方式的优点是灵活性和可扩展性。如果有新的项目,你只需要为它编写一组新的规则,而不需要改动核心服务的代码。同时,因为规则是在页面上配置的,所以非开发人员也可以参与规则的创建和修改。

    然而,这种设计也有一些挑战。例如,你需要确保规则引擎的性能足够好,可以快速处理大量的规则。此外,你可能还需要提供一些工具或文档,来帮助用户理解如何编写和修改规则。
    2828kakafa
        7
    2828kakafa  
       2023 年 5 月 29 日 via iPhone
    当然,如果你觉得规则引擎过于复杂,那么也有一些简化的解决方案:

    1. **模块化设计**:对于公共功能(如 zip 文件解析、基本字段处理),你可以将它们设计为模块化的库或服务,所有项目都可以共享。

    2. **配置文件**:对于每个项目的个性化部分,你可以使用配置文件来描述。这个配置文件可以定义需要解析的特定字段,计算方式,存储方式等。

    3. **UI 界面**:对于配置文件的管理,你可以开发一个简单的用户界面,让非技术人员也可以配置规则。用户通过 UI 输入的配置信息可以自动转化为配置文件,被各个项目使用。

    这种方法的好处是简单易用。任何需要个性化处理的新项目,只需创建一份新的配置文件即可,无需编写新的代码。缺点是这种方法的灵活性较低,如果遇到非常复杂或者特殊的业务规则,可能就需要修改库或服务的代码来满足需求。

    值得注意的是,这种方法也需要一定的开发工作,包括开发公共库或服务,开发配置管理的 UI 界面,以及编写和维护配置文件等。因此,你需要根据你的具体需求和资源,来权衡哪种方法最合适。
    leegoo
        8
    leegoo  
    OP
       2023 年 5 月 29 日
    @vitovan 我这种场景是不是自己用设计模式会好一点,因为我之前没在项目中使用过规则引擎,所以不太知道里面的细节和实现难度。
    leegoo
        9
    leegoo  
    OP
       2023 年 5 月 29 日
    @waitingChou 那其实还是用设计模式弄会好一点是把
    leegoo
        10
    leegoo  
    OP
       2023 年 5 月 29 日
    @akira 0.0 ,解析那一部分是差不多通用的(这一部分已经有现成的工具类,后续要项目多合一这里相对比较好弄),只是在实际上在项目中。我们更多的是侧重自定义的那一块处理逻辑。所以我在想用什么方式可以更优雅的不同的子文件解析过程给优雅的接入进来
    ruanimal
        11
    ruanimal  
       2023 年 5 月 29 日
    @lidage 建议别问,v2 应该都有 gpt 账号吧
    vitovan
        12
    vitovan  
       2023 年 5 月 29 日
    @leegoo #8 我不知道怎么会好一点,但是建议直接开干,遇到问题再解决问题,不要被一些名词唬到了(比如:规则引擎、设计模式……等等)。
    leegoo
        13
    leegoo  
    OP
       2023 年 5 月 29 日
    -.- 动手之前还是要想清楚,毕竟这本来就属于重构了。如果设计的不好的话还不如分开写。感谢你的回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5752 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 02:37 PVG 10:37 LAX 18:37 JFK 21:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86