【问题标题】:Is it good practice to use an Interface with constants as a start for a polymorphic behaviour of classes?使用带有常量的接口作为类多态行为的开始是一种好习惯吗?
【发布时间】:2014-09-20 05:34:55
【问题描述】:

Stack Overflow 上的一些人认为这可能是一个好的实现吗?

例如,我有一个名为 RequestInterface 的接口,它有 5 个常量:

interface RequestInterface {
    const GET = 1;
    const POST = 2;
    const PUT = 3;
    const DELETE = 4;
    const HEAD = 5;

    public function getType();
    // ... some other methods declarations
}

然后对于每个常量都有一个实现该接口的类,例如PostRequest:

class PostRequest implements RequestInterface {
     public function getType() {
          return RequestInterface::POST
     }
}

PUT 请求:

class PutRequest implements RequestInterface {
     public function getType() {
          return RequestInterface::PUT
     }
}

对于其他类也是如此。

我知道在接口中使用常量被某些人认为是反模式,但是您对我所做的示例有何看法?对于这种情况,还有什么可能更好的解决方案?

编辑:@pid 你建议我使用 get_class() 或 is_a() 函数,例如如果我有另一个使用该 RequestInterface 的类,我可以摆脱这些常量并简单地使用 instanceof 来确定 RequestInterface 的类型?

// inside another class which uses a RequestInterface
public function someMethod(RequestInterface $request) {
    if ($request instanceof PostRequest) {
       // Request is a post...
    }
}

【问题讨论】:

  • 我不认为 static 数据 - 例如。常量 - 应该与多态性(以及扩展,接口)有关。根本没有添加任何好处(尤其是这里),而像return HttpVerb::POST 这样的东西对我来说更清楚(并且通过将静态数据从接口分离到它自己的类型/容器中来获得)。
  • 类型已经通过类命名。您可以使用类名作为标识符。
  • 请看这个问题,它非常适合您的问题stackoverflow.com/questions/5350672/…
  • @ins0 是的,这是一个非常相似的问题,但在我看来,在这种情况下,没有人提出可能的解决方法或可能的替代方案......你怎么看?
  • @user2864740 所以你是说你会创建另一种类型,例如包含这些常量的 HttpVerb 抽象类或接口,然后在 RequestInterface 实现中使用它们?

标签: php interface constants


【解决方案1】:

考虑接口定义最有可能暴露给客户端应用程序。您不想在该文件中包含实现细节。客户端程序员想要查看您的接口定义并只看重要的内容,即文档中已描述其含义的 API 契约。

常量的实际值并不重要。实际上,通过将其放在接口定义中来公开它会使常量的使用无效...忽略实际值以支持助记符/拟声词(拟声词... =>听起来就是这样,不需要文档/解释立即理解)。

【讨论】:

  • 感谢您的解释,无论如何您认为我的示例中可能有什么问题,并且可以通过更具可扩展性的解决方案来改进?您将如何处理您的项目中的此类问题?
  • feela 的评论The type is already named through the class. You can use the class name as identifier. 很有用。您根本不需要常量,您可以使用get_class() 推断与实际类型的差异。所以你不需要gettype()。在这种特殊情况下,一切似乎都消失了,因为您使用的是范式而不是笨拙的解决方法。要测试实例,您可以使用is_a
  • 好吧,如果我在另一个类中有一个使用 RequstInterface 作为类型提示的方法,我应该使用 instanceof 指令恢复请求的类型吗?请检查我的编辑。
  • 是和不是。你写的代码是正确的,但是你违背了界面的意思。作为契约,接口将具有方法。您的接口使用者不应区分 if/switch 实际类型,而只需使用接口的方法。这样你code against an abstraction(界面)。看看这里如何利用多态性和接口:stackoverflow.com/questions/2697783/…
  • 您在这里混合了一些概念。接口是语言结构。您在那里看到的是工厂模式,它告诉您如何最好地使用这些语言结构来获得所需的功能。它们并不相互排斥,相反,通过将接口与实现内在函数清晰分离来提升该模式。与往常一样,在某些情况下,模式可能会过冲。但如果不是,它非常有帮助。在模式变得有意义之前,您需要学习 SOLID 原则,因此您应该学习语言结构 => SOLID => 模式。
猜你喜欢
  • 2016-06-01
  • 2019-01-12
  • 2015-09-02
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多