0

使用组合时,如果对象不属于接口类型,则应显式抛出异常。

一个例子是:

$myObject = new MyConcreteTypeA();

现在,我的界面是MyInterface.

那么,我是否应该检查$myObject 的类型以确保它MyInterface在使用之前实现,如果没有则抛出错误?

IE

if (! ($myObject instanceof MyInterface)) {
    throw new Exception('Invalid type');
}

或者这只是粗鲁?

4

2 回答 2

1

那么,我是否应该在使用前检查它的类型$myObject以确保它实现MyInterface,如果没有则抛出错误?或者这只是粗鲁?

如果您已经竭尽全力创建接口,并且期望对象的事物也期望它们实现该接口,那么是的,您绝对应该检查并抱怨。

将您的方法与鸭子类型进行对比。在批评部分,它谈到了两种不相关的方法之间的混淆。我将调整他们的示例,使其适用于 PHP 而不是 Python*:

您可以轻松地创建一个名为 Finger 的类,该类期望实现该press()方法的类对其执行操作。但是,名为 Trousers 的类也可能实现该press()方法。使用 Duck Typing,为了防止奇怪的、难以检测的错误,开发人员需要了解该方法的每个潜在用途press(),即使它在概念上与他或她正在处理的内容无关。

如果您只在尝试处理裤子时才处理它们是绝对关键的那么press()您必须进行检查。如果您的代码不关心被press()编辑的内容,只要它确实press()编辑,那么您可以丢弃您的支票。

* 原始示例使用属性和方法。Python 中的属性和方法共享相同的命名空间。尝试将属性用作方法会更加灾难性,但不适用于 PHP。

于 2012-12-17T18:34:11.907 回答
-1

PHP 不仅是动态类型的,而且是弱类型的。您通过检查$myObject实现给定接口所做的事情以某种方式补充了该语言中缺乏更结构化的类型系统的情况。如果您想这样做,您可以,但是您可能需要考虑一些问题:

  • 您所做的检查将在运行时执行,因此您不会从动态类型转换为静态类型。换句话说,如果您的检查失败,它仍然会在运行时失败。
  • 如果您想与该理念保持一致,则可能需要在整个代码中添加此类检查。然后,您可能会考虑转向防御性编程风格(注意:我注意到这种风格的粉丝)。
  • 您可能还想考虑PHP 类型提示
  • 通过进行这种检查,您将违反 PHP 类型哲学,这几乎是鸭子类型

从我的角度来看,在整个代码中采用同质的工作模式很重要,因此仅将一些分散的instanceofis_a放在某些方法中并不是一个好习惯。如果您觉得 PHP 类型系统对您来说不够好/不够安全,您可能需要考虑:

  • 如果可以,请切换到另一种类型系统使您更舒适的语言(例如 Java 或 C#)。
  • 依靠额外的工具,比如结合PHPUnitValidators [*] 来让你对你的代码更有信心。

高温高压

[*] 免责声明:我在 Quanbit Research 工作。

于 2012-12-17T19:03:23.377 回答