关于项目结构的一些比较细碎的问题

是这样的,我在写一个数据库查询结果展示表格的自定义列的功能,语言是python+pyside6+peewee
首先我在数据库查询模块里写了一个类,用来记录和返回每个列需要哪些数据库字段,然后在界面类里又定义了一个类(对不起没用Controller),里面定义了每个列从数据库查询数据转化为展示数据的函数,这样通过传递列名,数据库那边就知道要查哪些字段,然后返回给界面,界面根据列名抽取函数,用函数去计算每个列要展示的数据。
我的问题是,这实际上是在两个位置定义了列所需数据的信息(列名-涉及的数据库字段、列名-如何计算列展示数据)也就是说如果以后我要加新的列了,我不得不在两个地方去分别加这个列的相关信息,我猜应该有更加合理的项目结构,望各位老师能提供一个思路。
或者也可以不按照我的思路来,如何正确的实现一个【自定义列】功能

化列为行,靠一个通用表,列为:
tableid,rowid,fieldid,value

对已有的T1、T2、T3表,展示自定义列C=T1.a*T2.b+T3.c这样?
我会考虑只在计算函数里定义涉及字段和算法,数据库查询模块只提供通用的多表多字段批量获取方法,由计算函数来调用获取数据并计算。

也就是查数据库时取所有可能涉及的字段,对吗?

数据库查询模块需要实现一个通用接口,传入表和字段列表,返回对应的数据。
计算函数控制具体的逻辑,把需要的表和字段作为参数传给数据库查询模块,一次性获取所需的数据,然后计算返回。
比如我上面举的例子,那计算函数里调用数据库查询接口就会类似如下:

def calc_column_C():
    data = DB.get_data(['T1.a', 'T2.b', 'T3.c']) # 取数
    return (data[0] * data[1] + data[2])  # 计算

其实,为啥要再抽象一层数据库查询层呢?直接在计算函数里调数据库查询不行么?

def calc_column_C(id):
    a = T1.get(T1.id=id).a
    b = T2.get(T2.id=id).b
    c = T3.get(T3.id=id).c
    return (a * b + c)

我就是担心如果在qt类里写数据库查询代码,又会把代码结构搞乱,但是这种查询代码应该只会用到一两次,可能只写在这里也无妨?

不会呀,把计算函数单独抽出来做模块,qt界面直接调用这个模块就好。
反正涉及到自定义的最好就在一个地方实现,修改起来方便。

感谢,我继续尝试一下

1 Like

再打扰一下,请问如何学习工程化的软件开发,现在是只知道语法,代码到处乱写,有推荐的书或者课程吗?

《设计模式(Design Patterns)》之类的?
还有多看多写多改多思
其实小程序或者不会持续改进的那种只要能用就行,怎么方便怎么写 :grin:

世界的本质是草台班子……

1 Like