首先,我最喜欢的语言是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中呢?
发布于 2012-04-04 04:11:01
如果它是Java,我应该实现一个类似的接口。但是为什么呢?
那么,您已经提供了一种将"this“与另一个实例进行比较的方法……如果你实现了Comparable,你就是在告诉系统的其余部分你支持这种能力,这样比较就可以用于排序,找到“最大”或“最小”值等。所有这些都是在对你的类型一无所知的例程中。
我的同事告诉我,在
中,为类的每个行为方面创建一个接口是一条经验法则。
对我来说,这听起来有点过火。(您的示例不是很好,因为Object上已经有toString()了。)不要随意创建没有目的的接口--如果你想让那些不需要知道你的具体类型,只需要知道它支持什么的代码使用这种行为,就可以创建它们。一个很好的例子就是可测试性--如果你写了一个" authenticator“类,那么你可以想象在你的产品代码中交换不同的身份验证器,或者在测试其他使用身份验证的组件时模拟/伪造这个身份验证器。
发布于 2012-04-04 04:31:58
实现Comparable的一个非常实际的原因是能够做如下事情
List<MyEntity> entities = // ( initialize and populate )
Collections.sort(entities);而不需要编写一行排序代码。
这说明了使用接口的基本原理,即允许其他人使用您的代码,并且(对您个人更有用)允许您的代码以可靠的方式使用其他人的代码。
至于“一个用于类的每个行为方面的接口”,这听起来有点过头了,或者可能有些过头了。您希望接口有意义,因此,例如,TelephoneThatIsAlsoAToaster接口很糟糕--您应该有两个接口:Telephone和Toaster。另一方面,你不应该有成群的接口Pluggable,Visible,HasButtons,Flammable……必要的详细程度将取决于应用程序。
https://stackoverflow.com/questions/10000578
复制相似问题