[请益] 如何有效益的维护data loader

楼主: tinasfishs (Tina)   2022-11-22 01:03:07
如题
目前做的project架构长这样
Loader1 Loader2 Loader3 ........... Loader30
Area 1
Area 2
Area 3
....
....
Area 10
就是同一个Loader 会算出结果给不同Area的人
有分成前端跟后端,前后端都是我维护 (前端 .Net Framework java script MVC,会
用到一点 jquery,其他大多套套件用现成的物件再加工,后端就纯C#
query DB用的工具是公版的不用自己写,就负责input 要打的SQL跟DB,然
后output datatable或是对DB做insert/delete/update....)
Loader每支老板认知都不算很大所以也是一人包办XD
Loader每支的逻辑也类似:
Start
作者: neo5277 (I am an agent of chaos)   2022-11-22 01:29:00
我看到1=1了耶...也不要用*
作者: peter98 (新兵)   2022-11-22 01:32:00
把条件弄成dynamic 不要hardcoded 设定好权限 让个别user可以选要加什么条件在filter里 我做过这个 很难写难在一堆无聊人士搞audit 设定权限他们也不懂
作者: neo5277 (I am an agent of chaos)   2022-11-22 01:34:00
辛苦啦,我是建议你让sql参数化单纯一点,把条件的东西搬去c#用策略模式做然后多使用虚拟类别,多的kpi用接口去加这样你sql就相对单纯现在这样笔数多捞起来会很慢吧...然后你sql要板控的话可以加一个sql,专案在方案里最终还是sp化接参数再透过策略选择呼叫那一种就好好维护,改起来也快,而且会好阅读很多吧
作者: airtsubasa (伪学姊)   2022-11-22 06:52:00
1=1是为了 后面串条件方便吧 应该是后面可能不会出现条件
作者: play714 (play)   2022-11-22 08:39:00
不太懂分那么多支loader 的原因为何?
作者: CRPKT (crpkt)   2022-11-22 09:22:00
先把上游资料转成同样格式,query 的部分再跟着 area 版控现在这样维护成本就是 loader 与 area 数量乘开把东西拆到让维护成本变成加法是唯一的活路
作者: enthos (影斯作业系统)   2022-11-22 09:32:00
https://github.com/pardeike/Harmony/wikiGame Live patch:做多种MOD让使用者自行订阅
作者: giacch   2022-11-22 11:41:00
Loader1.GetSQLText(Area1), Loader2.GetSQLText(Area1)
作者: wulouise (在线上!=在电脑前)   2022-11-22 12:08:00
query可以独立分开放在档案里读吧?
作者: sniper2824 (月夜)   2022-11-22 12:35:00
JavaScript 为什么你要分开写
作者: brucetu (sec)   2022-11-22 17:12:00
你做好一版 马上把所有可能被影响的loader/area重跑 比对实际被影响的资料是否符合你预期 先建立这样的系统避免改A坏B没发现 再来谈重构会发生改a坏b表示你有共用的code却允许共用的其中一个需求端任意更改 这当然不正常, 如果一种东西会被多个需求端各自提需求修改 那这种东西不论有多相似 都应该建立单独的class你的整个重构会很复杂不是你一人一两个月就能完成 一定要先建立确保不会改A坏B的机制你这正常的架构就是要先定义原始资料类别有哪些, 聚合资料的filter有哪些你的loader程式应该要给每个最终报表有适当的命名 同时有文件纪录每个报表会有哪些单位查看每一支报表由哪些资料源以及哪些filter算出中间的结果以及最终报表 要有文件当有人跟你说 他要增加采计AA类别 你就去查程式 采计AA类别这个行为是哪一支filter在处理, 有其他单位用到吗?如果没有 那大概就是直接修改这支filter 最终报表就会是他要的结果 也不影响别的单位. 如果有其他单位用到 你可能需要拆分成两支filter给两个单位使用 或是你的这个filter可以吃参数 那就是两个area吃不同config即可. 最重要是不管你的架构如何 改完就是要测试确保没有动到不该动的东西 这就是测试的覆蓋率的重要性最后建议 直接换工作
作者: jellyfishuan (风雪漫天)   2022-11-22 17:58:00
不太懂 老板听你这样解释之后还是认为是你的问题吗通常这样看你叙述下来就知道是架构问题了吧?
作者: f821027 (蛋饼)   2022-11-22 18:43:00
SQL WHERE 用 python 的 f-string 把 list 传进去,这样只要更新这个list就好
作者: bills1987 (土ㄅ)   2022-11-22 21:02:00
像是水流一样,资料一站一站往下流,就很好追踪!可能会变动的地方可以另开TABLE存放参考物件AA ,BB...后续就算新增参考,也只需更动参考TABLE内容,MAIN SQL部分只要写好关联,后续就不用一直改
楼主: tinasfishs (Tina)   2022-11-22 23:58:00
已经有参数化,loader唯一有设计的就是把同一支loader的可能10几、20几支SQL摆在同一个class,然后用return string的方式去return SQL,只是除了用class的壳包住&部分用参数之外就没做其他的了。参数有的带了6-7个结果还是没办法把SQL拆到自由度完全释放我的确很想by Area去把SQL list拆出来,但是可能和其他公司不同,SQL除了摆在公司共用的SQL池以外就是只有hard code一法,SQL池只是储存string跟参数位置,假设要把本来是hard code的条件改成带参数,就是原本C#里面call SQL池的地方要改。例如string SQL=sql pool(type,gender)要改成SQL=sqlpool(type,gender,age)就要重新上code,不能自行维护一份txt档就好感觉前人在这样的infra环境下,选择hard code或是摆SQL pool需要的effort是差不多的,为了快速完成,也不会去选择把TABLE里每个字段都拆出来写成class…table跟table我觉得关联性很差,常常出现10几个column的table,我数据库不强不知道这算不算是架构不好的象征QQ但大家的建议都很棒,我会多寻找机会点的!谢谢
作者: giacch   2022-11-23 00:55:00
sql = "" +(age != null ? "" +"\n and age = @age" +"" : "") +"";蓝色的if可以写成上面哪样, 字串一直串不想整个Code重上, 可以拆成不同project (dll)若你将所有C# Code都写在一个cs档,就可以实现维护一份text参数太多可以考虑用一个物件来放(type, class or Dictionary<string, object> args)
作者: hanshsu (小肉呆)   2022-11-23 11:16:00
c# call sqlpool interface 改成传 object 就可以解决改来改去的问题?
作者: giacch   2022-11-23 11:28:00
楼上是讲我吗? "实现维护一份text"那一行只是玩笑话不太懂楼上的意思
作者: lazarus1121 (...)   2022-11-23 12:10:00
另外花点时间写一支自己理解后的模组?然后两边比较结果,久了没问题就能把旧的取代
作者: qss05 (minami)   2022-11-24 22:53:00
如果你会很常异动逻辑,通常会把核心做成view有需要再筛选吧,这样就从数据库改就好,子查询也可以做成function放在数据库
作者: ck237 (白色小鸡)   2022-11-25 01:09:00
这个架构也太神奇了吧?
作者: jack0204 (Jarbar王朝)   2022-11-26 09:11:00
为啥不从程式去处理要用SQL去处理?

Links booklink

Contact Us: admin [ a t ] ucptt.com