【发布时间】:2013-06-07 12:47:59
【问题描述】:
假设我正在编写一个带有 Form 类的 webapp,而一个 Form 类可以有多个 Fields。
Field 本身就是一个抽象类。它包含一个抽象的validators 属性,它是一个方法列表,它将调用以确定该字段的内容是否有效。这些验证器由实例方法Field.run_validators(value)调用来调用
CharField 是一个Field 子类,它允许任意文本。这个字段总是有效的,只要给它一些非零长度的字符串。
EmailField 是具有附加要求的 CharField 子类。此字段仅在value 通过某种测试时有效。 (例如'@' in value)。
我的问题是:EmailField 是否破坏了相对于CharField 的 LSP?它应该是一个兄弟类吗?尽管Field 通过允许子类提供自己的validators 来定义可变性,但TextField 并没有明确扩展这种可变性。
我一直在努力寻找更多关于 LSP 的解释,但它们都重用了相同的 Rectangle/Square 示例。
给定:
def transmogulate(field):
"""field must be a TextField instance."""
assert isinstance(field, TextField)
instance.run_validators("hello")
使用CharField 时,transmogulate(my_text_field) 将毫无问题地运行。但是如果my_text_field 是EmailField 的一个实例,它总是会引发ValidationError。这是否违反了 LSP?还是我的推理完全倒退了? (这种情况经常发生)
您也可以愉快地想象run_validators() 返回False 而不是引发异常,如果这会以某种方式改变分析;我只是想让我的示例尽可能接近源材料。
【问题讨论】:
-
只要有效,谁在乎?
标签: python oop theory liskov-substitution-principle