命名对象实体对象_我的对象命名

命名对象实体对象

这是最常见的辩论之一。 大多数人对此主题有自己的见解,却没人能真正说出哪个是正确的。 我当然不能,但是尽管如此,我还是决定与大家分享我的想法,投入两美分,也许对某人会有帮助。

当我创建一个新类时,我要做的第一件事就是设计其接口(如您所知,我相信任何对象都必须实现至少一个接口)。 接口的名称通常反映对象什么,而不是对象的作用或其他对象应使用的对象。 在极少数情况下,我认为形容词是合适的,其中之一是Iterable

汤姆和杰里–杰里的表哥,威廉·汉娜(William Hanna)和约瑟夫·巴贝拉(Joseph Barbera)

然后是该接口的实现。 由于将来可能会有更多实现,因此我主要根据封装的细节来命名对象。 因此,假设接口是HttpRequest ,那么如果遵循该接口的第一个对象使用ApacheHttpClient,则其名称可能是ApacheRequest 。 然后,可能会有另一个实现,与另一个http客户端(可能是jcabi-http)一起工作 ,在这种情况下,名称将为JcabiRequest

到目前为止,还算不错,也许没有什么新鲜的,但是这里有个要注意的地方:根据模式的不同,我自己的类的名称不一定一定有意义。 例如,在我的一个项目中的某处,您将看到以下类:

/**
 * Decorator which adds some HTTP headers on the decorated request.
 */
public final class HttpHeaders implements HttpRequest {
    //...
}

它本身看起来并不自然,对吧? 好吧,应该很清楚,这种类型的请求永远都不应该“单独”使用。 它的构造函数甚至不允许它,因为它应该包装另一个HttpRequest ,或者另一个包装器,或者一个具体的请求。 你能想到一个更好的名字吗? 我相信,在命名一个类时,我们还必须考虑如何使用它,在何种上下文或模式下使用-如果将所有这些名称放在一起时这些名称有意义,那么您就可以了。 添加无用的名词只会导致噪音。

HttpHeaders的用法如下:

Map<String, String> headers = ...;
    HttpRequest request = new HttpHeaders (
        new Get(URI.create(...)),
        headers
    );

此外,我讨厌无用的后缀。 让我们以最光荣的例子为例:“工厂”。 您是否注意到,当一个对象负责创建其他对象时,不再重要了吗? 上下文,业务,领域,什么都没有! 该不良对象的名称必须带有后缀“ Factory”,否则代码将无法工作。

我的代码中确实有工厂对象,但是“ factory”一词在任何地方都没有。 该项目是一个聊天机器人,最顶级的抽象之一是“知识”,机器人知道该怎么做。 知识的每种实现都会创建代表它的步骤树–机器人需要执行一个或多个步骤才能执行任何命令。 我所谓的“知识”实际上是一个工厂对象,因为它会创建其他对象(这些步骤)。 汇编代码如下所示:

final Conversation talk = new Conversation(
        new Hello(
            new RunScript(
                new Confused()
            )
        )
    );
    talk.start(command);

ConversationHelloRunScriptConfused都实现了Knowledge并且它们以级联机制一起工作,以便找到要执行的正确步骤。 上面的代码片段翻译为以下单词:“对话开始,机器人可以说'你好',为您运行一些脚本,如果它不理解命令,可能会感到困惑”。

现在,这里是相同的代码片段,但具有更常见的命名:

final StepsFactory factory = new ConversationFactory(
        new HelloFactory(
            new RunScriptFactory(
                new ConfusedFactory()
            )
        )
    );
    factory.getSteps(command);

哪一个更好? 它们都将以相同的方式工作,这仅与可读性有关。 对我而言,这就像是完成的建筑物还是周围仍然有建筑脚手架的建筑物–没有人想知道房屋的建造方式,所使用的所有脚手架和仪器,这并不重要。 取而代之的是,每个人都渴望看到最终的构造,并且他们应该了解它的作用,而不要弄清楚实现它的目的。

另一个命名示例:

Log log = new WebLog(
    new LogFile("/comdor/ActionLogs", this.id),
    "https://webapps.amihaiemil.com"
);

为什么选择WebLog ? 因为封装的日志最终将在Web UI上呈现给用户。 调用log.address() ,字符串“ https://webapps.amihaiemil.com”将与文件名连接在一起以形成有效的URL。 这是WebLog类,您还可以看到Log类型的封装变量(将显示给用户)被命名为“ onServer”,因为它是最终从中获取的日志文件。服务器。

这几乎就是我如何处理命名的想法。 而且,当然,我总是写JavaDocs(如果没有它们,Maven Central甚至不允许您发布任何内容),因此,如果名称不够好,它上面的JavaDoc总是会为您提供帮助。 你怎么看? 您使用什么命名约定?

翻译自: https://www.javacodegeeks.com/2018/01/take-object-naming.html

命名对象实体对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值