我的对象命名

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

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

汤姆和杰里-杰里的表哥,威廉·汉娜和约瑟夫·巴贝拉

然后是该接口的实现。 由于将来可能会有更多的实现,因此我主要根据封装的细节来命名对象。 因此,假设接口是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

netbeans 定制代码_将NetBeans代码模板弯曲到我的意愿

netbeans 定制代码任何阅读过我关于NetBeans的文章的人都知道&#xff0c;我真的很喜欢NetBeans的许多功能。 但是&#xff0c;最近&#xff0c;我发现自己对NetBeans特定功能的特定问题越来越恼火。 最终&#xff0c;它使我烦恼不已&#xff0c;促使我开始研究如何根据自己的喜…

Java 9概览

对于许多Java 9来说&#xff0c;它似乎是一个维护版本&#xff0c;它推动了不能在Java 8中实现的项目Jigsaw。但是&#xff0c;随着JDK中的新模块系统以及与之相关的许多内部更改&#xff0c;Java 9也带来了开发人员工具箱中一些很棒的新内容。 以下是重点内容&#xff1a; JS…

adf开发_了解ADF Faces clientComponent属性

adf开发我相信大多数ADF开发人员都知道ADF Faces属性clientComponent 。 在本文中&#xff0c;我将展示该属性实际上如何影响组件渲染以及它如何改变其行为。 让我们开始考虑一个非常简单的示例&#xff1a; <af:inputText label"Label 1" id"it1" /&g…

Picocli 2.0:事半功倍

介绍 Picocli是一个单文件命令行解析框架&#xff0c;它使您几乎不需要任何代码即可创建命令行应用程序。 使用Option或Parameters注释应用程序中的字段&#xff0c;picocli将分别使用命令行选项和位置参数填充这些字段。 例如&#xff1a; Command(name "Greet", …

移动通信—无线波传播

无线波传播 发射天线或自然辐射源所辐射的无线电波,通过自然条件下的媒质到达接受天线的过程称为无线电波传播。无线电波与可见光、X射线与γ射线-.样同属于电磁波,它们都是以电场和磁场为其特征的- -种电场震动。电磁波的频谱范围很宽,从几赫到3X 1023Hz(波长从几十兆米到10-9…

使用Dropwizard度量标准监视和测量无功应用

在上一篇文章中&#xff0c;我们创建了一个简单的索引代码&#xff0c;该代码可以对ElasticSearch进行数千个并发请求。 监视系统性能的唯一方法是老式的日志记录语句&#xff1a; .window(Duration.ofSeconds(1)) .flatMap(Flux::count) .subscribe(winSize -> log.debug(…

移动通信-多径效应,多普勒效应,菲涅尔区,阴影效应,快衰落,慢衰落

多径效应 信号从发射端到接收端常有许多时延不同、损耗各异的传输路径&#xff0c;可以是直射、反射或是绕射。无线电波的多径效应是指不同路径的相同信号在按收端叠加会增大或减小接收信号能量的现象。 时间色散 在无线通信中&#xff0c;无线电波从发射端到接收端会经过直射、…

四旋翼

更新2018/11 1系统设计 硬件总体框架&#xff08;认识四旋翼的基本组成&#xff09; 机架主要的两种&#xff08;x型控制更难&#xff0c;动作灵活&#xff09; 十字型,X字型 桨 7040,8045&#xff08;常用&#xff09;&#xff0c;前四位直径&#xff0c;后四位角度 正反螺旋…

hotspot线程模型_Linux上的HotSpot GC线程CPU占用空间

hotspot线程模型以下问题将测试您对Linux操作系统上运行的Java应用程序的垃圾收集和高CPU故障排除的知识。 当调查过多的GC和/或CPU利用率时&#xff0c;此故障排除技术尤其重要。 它将假定您无权使用高级监控工具&#xff0c;例如Compuware dynaTrace甚至JVisualVM。 将来将介…

数字信号处理实验一

补充2019/10/26 (1)序列的加、减、乘、除和乘方运算。输入A[1 2 3 4]&#xff0c;B[3 4 5 6]&#xff0c;起点n0&#xff0c;求CAB&#xff0c;DA-B&#xff0c;EA.*B&#xff0c;FA./B&#xff0c;GA.^B&#xff0c;并用stem语句画出A&#xff0c;B&#xff0c;C&#xff0c;D…

SRP是骗局

根据罗伯特马丁 &#xff08; Robert Martin&#xff09;的 《 清洁法 》&#xff08; Clean Code&#xff09; &#xff0c;“ 单一责任原则 ”意味着“一个阶级应该只有一个改变的理由”。 让我们尝试解密这个模糊的语句&#xff0c;看看它如何帮助我们设计更好的面向对象软件…

数字信号处理实验二

补2019/11/2 &#xff08;1&#xff09;编写函数如xsiAdd(x1,n1,x2,n2),实现两个序列x1和x2的相加&#xff0c;其中x1的下标为n1n1s:nlf&#xff0c;x2的下标为n2n2s:n2f。绘制出该函数的图形。设x1&#xff08;n&#xff09;n,0≦n1≦9,x2(n)n,4≦n2≦15。 &#xff08;2&…

apache camel_使用Apache Camel发布/订阅模式

apache camel发布/订阅是一种简单的消息传递模式&#xff0c;其中&#xff0c;发布者将消息发送到某个频道&#xff0c;而无需知道谁将接收消息。 然后&#xff0c;通道负责将消息的副本传递给每个订户。 此消息传递模型可以创建松耦合和可伸缩的系统。 这是一种非常常见的消息…

Java 9:JShell

JShell是Java 9中引入的新工具&#xff0c;用于评估在命令行上输入的Java语句。 它是Java平台上第一个正式的REPL&#xff08;读取-评估-打印循环&#xff09;实现&#xff0c;非常适合尝试Java代码而无需启动IDE或编写完整的程序&#xff01; 要运行JShell&#xff0c;只需在…

三句话介绍清楚滑动窗口协议/GBN/SR

滑动窗口协议、GBN、SR之间不得不说的故事 首先我们来介绍什么是滑动窗口协议 滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;属于TCP协议的一种应用&#xff0c;用于网络数据传输时的流量控制&#xff0c;以避免拥塞的发生。该协议允许发送方在停…

《计算机网络自顶向下》之重头戏迪杰斯特拉算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始&#xff0c;采用贪心算法的策略&…

新闻发布系统java ee_Java EE 7发布–反馈和新闻报道

新闻发布系统java eeJava EE 7已经存在了几天。 我们所有人都有机会观看直播活动或可用的重播 。 最后的MR版本完成了将其工作推向JCP的工作&#xff0c;基本上是一个总结。 是时候反思发生的事情和我对此的想法了。 启动活动中的社区参与 它不是一个大秘密。 即使Oracle的Jav…

在即将发布的Camel 2.21版本中改进了使用Apache Camel和ActiveMQ Artemis处理大型消息的功能...

从历史上看&#xff0c; Apache ActiveMQ消息代理最初是在大型消息以MB为单位而不是GB的情况下创建的&#xff0c;就像您今天所做的那样。 下一代代理Apache ActiveMQ Artemis&#xff08;或仅是Artemis&#xff09;则不是这种情况&#xff0c;后者对大消息有更好的支持。 因…

深入浅出组合逻辑电路(1)

定义&#xff1a;电路在任意时刻的输出仅由该时刻的输入信号决定&#xff0c;与之前的输入信号无关。 组合电路通常有一些逻辑门构成&#xff0c;许多具有典型功能的组合电路已经集成为商品电路。&#xff08;加法器&#xff0c;译码器等&#xff09; 分析步骤&#xff1a; …

深入浅出逻辑组合电路(2)

深入浅出逻辑组合电路&#xff08;2&#xff09; 门电路中的冒险现象 通常讨论逻辑电路时&#xff0c;只从抽象的逻辑角度进行描述&#xff0c;不考虑实际电路中必然存在的信 号传输时延和信号电平变化时刻对逻辑功能的影响。逻辑门的传输时延以及多个输入信号变 化时刻不同步…