【问题标题】:Interfaces: profit of using接口:使用的利润
【发布时间】:2012-04-17 12:55:56
【问题描述】:

首先,我的通用语言是 PHP,我正在考虑学习 Java。

所以让我把我的问题分成两个密切相关的部分。

这是第一部分。

假设我有一个域模型类。它有一些 getter、setter、一些查询方法等。有一天我想有可能比较它们。所以它看起来像:

class MyEntity extends AbstractEntity
{
    public function getId()
    {
        // get id property
    }

    public function setId($id)
    {
        // set id property
    }

    // plenty of other methods that set or retrieve data

    public function compareTo(MyEntity $anotherEntity)
    {
        // some compare logic
    }
}

如果是 Java,我应该实现一个 Comparable 接口。但为什么?多态性?可读性?或者是其他东西?如果是 PHP——我应该为自己创建Comparable 接口吗?

接下来就是第二部分了。

我的同事告诉我,Java 的经验法则是为类的每个行为方面创建接口。例如,如果我想将这个对象显示为一个字符串,我应该用类似implements Stringable 的东西来声明这个行为,如果是 PHP,Stringable 看起来像:

interface Stringable
{
    public function __toString();
}

这真的是经验法则吗?这种方法有什么好处?在 PHP 中值得吗?在 Java 中呢?

【问题讨论】:

  • 我认为这个问题似乎更适合programmers.stackexchange.com

标签: java php interface


【解决方案1】:

如果是 Java,我应该实现一个 Comparable 接口。但为什么?

嗯,您已经提供了一种将“this”与另一个实例进行比较的方法...如果您实现 Comparable,您就是在告诉系统的其余部分您支持该功能,以便比较可以用于排序,查找“最大”或“最小”值等......所有这些都在对您的类型一无所知的例程中。

我的同事告诉我,Java 的经验法则是为类的每个行为方面创建接口。

这对我来说听起来有些过火。 (您的示例不是一个好示例,因为在 Object 上已经有 toString()。)不要无缘无故地随机创建接口 - 但如果您希望不需要知道的代码使用该行为,请创建它们关于您的具体类型,仅关于它支持的内容。可测试性就是一个很好的例子——如果你写了一个“验证器”类,那么你可以想象或者在你的生产代码中交换不同的验证器或者模拟/伪造验证器您正在测试使用身份验证的其他组件。

【讨论】:

    【解决方案2】:

    实现Comparable 的一个非常实际的原因是能够做类似的事情

    List<MyEntity> entities = // ( initialize and populate )
    
    Collections.sort(entities);
    

    不用写一行排序代码。

    这说明了使用接口的基本理念,即允许其他人使用您的代码并且(对您个人更有用)允许您的代码以可靠的方式使用其他人的代码。

    至于“类的每个行为方面的接口”,这听起来有点矫枉过正,或者说可能有点矫枉过正。您希望接口有意义,因此,例如,TelephoneThatIsAlsoAToaster 接口不好——您应该有两个接口:TelephoneToaster。另一方面,你不应该有一大堆接口PluggableVisibleHasButtonsFlammable...等。 必要的详细程度取决于应用程序。

    【讨论】:

    • 嗯,所以从这个角度来看,PHP中的接口没有任何关系。
    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多