- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道在业务逻辑代码中使用SQLALchemy声明性模型的最佳实践是什么。也许stackexchange.codereview可能是问这个问题的更好的地方,但是我不确定。
这是一些背景。
假设我有一堆类来做各种事情。它们中的大多数彼此之间几乎没有关系或根本没有关系,每个此类都有一百到数千行代码来执行与数据库几乎没有关系的工作。实际上,到目前为止,大多数类甚至都不知道数据库。我已经将实际信息存储在平面文件(csv,yaml等)中,并且只维护了序列号表和文档路径-数据库中的序列号映射。每个对象都通过从数据库中获取正确的路径(按序列号)来检索所需的文件,并从那里重建自身。到目前为止,这已经非常方便了,因为我的“模型”已经(而且仍然会继续)不只是流动性。
当我扩大数据库在当前代码库中的参与范围时,我似乎已经决定采用以下模型,将数据库位和业务逻辑分为两个完全独立的部分,并使用特定的函数调用(而不是继承或继承)将它们合并甚至组成。这是我现在拥有的那种代码的基本示例(伪代码质量):
module/db/models.py:
class Example(Base):
id = Column(...)
some_var = Column(...)
from .models import Example
def get_example_by_id(id, session):
return session.query(Example).filter_by(id=id).one()
def upsert_example(id=None, some_var=None, session):
if id is not None:
try:
example_obj = get_example_by_id(id, session)
example_obj.some_var = some_var
return
except:
pass
example_obj = Example(some_var=some_var)
session.add(example_obj)
session.flush()
from db import controller
class Example(object):
def __init__(self, id):
self._id = id
self._some_var = None
try:
self._load_from_db()
self._defined = True
except:
self._defined = False
def _load_from_db(self, session):
db_obj = controller.get_example_by_id(self._id, session)
self._some_var = db_obj.some_var
def create(some_var, session):
if self._defined is True:
raise Exception
self._some_var = some_var
self._sync_to_db(session)
def _sync_to_db(self, session):
controller.upsert_example(self._some_var, session)
@property
def some_var(self):
return self._some_var
...
最佳答案
我认为批评我们自己的设计是很自然的(至少对我而言),即使我们正在研究它们。您在这里拥有的结构对我来说似乎不错。它们是否合适的答案取决于您打算做什么。
如果将代码整合为厚实的模型,那么所有这些都将集中在一个地方,并且您的体系结构将更简单,但是,这也可能意味着您的业务逻辑将紧密地绑定(bind)到数据库中创建的模式。重新考虑数据库意味着重新考虑应用程序中其他大部分区域。
遵循此处提供的代码示例意味着将关注点分离,这些关注点具有负面影响,例如在更多位置放置更多行代码并增加了复杂性,但这也意味着耦合较松散。如果保持不变,那么如果您决定更改数据库架构或转移到另一种完全不同的存储形式,则麻烦将大大减少。由于您的业务逻辑类是一个普通的旧对象,因此它可以作为一个很好的分离状态容器。如果转移到其他地方,您仍然必须重新设计模型层以及可能的 Controller 部分,但是您的业务逻辑和UI层可能在很大程度上保持不变。
我认为真正的考验在于询问该应用程序的规模,以及您打算将其投入使用多长时间?如果我们正在寻找生命周期短的小型应用程序,那么除非您出于教育目的而这样做,否则增加了松散联轴器的复杂性,这是浪费。如果应用程序预计会变得很大或可以使用很多年,那么从长远来看,早期的复杂性投资应该以较低的拥有成本获得返回,因为对各个组件的更改应该更容易。
如果让您感觉更好,出于相同的原因,在使用ORM(例如 Entity Framework )和hybernate时,经常会看到POCO和POJO。
关于python - SQLAlchemy声明式: How to merge models and existing business logic classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34866439/
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 上个月关闭。
我正在 VHDL 中实现正交解码器,并提出了两种解决方案。 在方法 1 中,所有逻辑都放在一个对时钟和复位敏感的进程中。 在 Spartan-3A 上,这使用四个切片、七个 FF 和四个输入 LUT。
我现在在我的项目中使用 Logic-Apps。我认为这很好而且很容易!但是,在逻辑编码过程中很难调试。因为我无法在代码的中间点确认变量或状态。通常,开发人员可以在 Visual Studio 上执行程
我试图让一个方法仅在 unicode 字符的 char 值是数字、大写字母或小写字母时才采取操作。 if ((48=57)||(65=90)||(97=122) // only if numeral
所以我得到了我编写的代码示例。我的目标是打印存储在 ptr char 变量中的句子中的数字。所以代码的第一部分完成了这项工作。 #include #include void preg(char *
我有很多 JavaScript 遗留代码,我想重写所有松散的等式以使用严格的等式,即。 == 与 ===。但我常常不知道比较变量存储的是什么值。 在不知道这些值是什么的情况下,有没有办法重写这样的东西
我在尝试附加包 tidyselect 和尝试调用 tidyselect::any_function 时遇到此错误。 错误发生在 Rstudio 或类似的命令行中,在 RStudio 中它会在我输入时立
有什么方法可以在调用子逻辑应用时动态更新工作流: 正常工作流程配置如下: 我想要实现的目标如下,使用属性、变量任何更新运行时的工作流程,我尝试使用如下: 当我尝试按上述方式保存时,结果为错误:保存失败
有什么方法可以在调用子逻辑应用时动态更新工作流: 正常工作流程配置如下: 我想要实现的目标如下,使用属性、变量任何更新运行时的工作流程,我尝试使用如下: 当我尝试按上述方式保存时,结果为错误:保存失败
例如,考虑逻辑“用户只能编辑或删除该用户发表的评论”。 My Controller Actions会重复检查当前登录用户是否可以影响评论的逻辑。示例 [Authorize] public Action
在基于规则的专家系统中,知识库包含大量“if (template) then (action)”形式的规则。推理引擎选择与输入事实相匹配的规则。即那些条件部分与输入数据相匹配的规则被列入候选名单,并选
谁能解释一下这个分离逻辑的例子? 第一行和第二行有什么区别? 最佳答案 第一行说堆只包含一个小堆,因此存储中的引用 x 指向它,并且它包含值 4,4。 在 A 中为假,因为它忘记了 y 指向的小堆(它
我尝试了几天编写 NLTK 语法来将简单的法语句子转换为逻辑公式。我的问题可能与英语句子相似。我的目标是这个语法接受多个订单(家庭自动化)并将它们转换为逻辑公式。一些订单示例: 开灯: exists
我正在大学/学院学习自然演绎,作为我正式规范和验证计算机科学类(class)的一部分。 我觉得这很有趣,但是当我找到实际用途时,我会学得更好。 谁能向我解释除了用于正式验证代码位之外是否以及如何使用自
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
物理量子位和逻辑量子位有什么区别? 我希望有人能帮助我解决这个问题,我无法弄清楚到底有什么区别。 最好的,迪尔玛 最佳答案 逻辑量子位是可以用于编程的,它保存了 |0> 和 |1> 状态的叠加。它可以
我正在尝试学习如何使用 C++ 修改内存位置,并且在使用 MineSweeper 时,我注意到当内存中的时钟值为 1101004800 时,游戏进入了 20 秒。数字 1101529088 对应于游戏
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
首先介绍一些术语(取自here,第14页): 正程序是有错误的程序。 否定程序是没有错误的程序。 因此,程序有四种类型: 积极计划,分析为积极->真正积极(TP)。 积极计划,分析为否定->假否定(F
任何人都可以推荐可用于评估逻辑表达式的软件(最好是mac)或基于网络的工具吗? 例如,我希望能够快速测试两个表达式是否如下: $a = 'foo'; $b = 'bar'; $c = 'foo'; (
我是一名优秀的程序员,十分优秀!