【问题标题】:Defensive programming against client code if I myself implement the client code and the Interface?如果我自己实现客户端代码和接口,则针对客户端代码进行防御性编程?
【发布时间】:2021-03-26 11:52:13
【问题描述】:

我正在用 Python 编写一个应用程序。在某个地方,我编写了一个由类组成的模型层,并且,其中任何一个,说:

class Orders:

有一个绑定方法,其签名是:

def delete(self, id=None, name=None):

我需要 id 或 name 不为 None。然后,这是我的问题:

由于我自己编写了模型层和客户端代码,大概是这样的:

model.Orders().delete(id=1234)

使用如下代码检查删除方法中的参数是一个好习惯:

if not any((id, name)):
    raise ValueError('Order Id or Order name must be provided')

?

我想,既然我写了这两个方面,我会一直调用delete方法提供一个参数,避免检查并节省大量代码。我预计模型层将达到 2 或 3 千行,连接数据库服务器。

我举了一个具体的例子,但我希望能回答一般情况。

【问题讨论】:

    标签: python design-patterns


    【解决方案1】:

    这是在herehere 讨论过的。

    不过,我要补充的是,由于 Python 默认不支持互斥参数,因此干净的方法是提供两个公共接口:delete_by_id、delete_by_name;这些调用私有方法_delete。这样,类用户的外观就很清楚了,并且很好地执行了参数,而在类内部,您可以重用代码。

    【讨论】:

    • 好的。我最好公开一个干净的界面,如果公司雇佣了另一个开发人员,对于 GUI 部分,他/她将针对这个模型编写客户端代码。
    【解决方案2】:

    在我看来,一般情况下,防止代码中的错误和误用始终是一种好习惯。确实可以节省大量编码,但价格是多少?在未来的某一天,您将使用此代码而不记得提供两个参数之一,并且您可能会在调试中浪费数小时。或者也许你可以开源你的代码,尝试使用它的人可能会遇到一些问题。

    【讨论】:

    • 我喜欢你的回答。也许在未来,公司会雇佣另一个开发人员(现在我一个人)来连接这个模型,所以,我最好像@miquelvir 建议的那样用“私有”_delete 方法编写一个干净的接口。
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多