我的对象命名

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

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

相关文章

C++一天一个程序(二)

#include #define NUMBER 4 int main() { std::cout << NUMBER << std::endl; } 或者 #include using namespaces std; int main() { cout << 4<< endl; } 注意: 第一段中NUMBER已经被定义&#xff0c;不可以在程序中再次赋值。建议不要用#define定义…

c++编写web服务_让我们编写一个文档样式的Web服务

c编写web服务您可能知道&#xff0c;我们可以使用四种主要的Web服务样式。 它们如下&#xff1a; 文件/文学 包装的文件/文学 RPC /编码 RPC /文字 当然&#xff0c;现在不建议使用RPC /编码样式。 如果您有兴趣&#xff0c;可以在此处找到这篇非常全面的文章&#xff0c;…

C++一天一个程序(三)

#include <stdio.h> class Trace { public:     Trace()  {noisy 0; }      void print(char* s)  { if (noisy)  printf("%s",s); }   void on()  { noisy 1; }      void off()   { noisy 0; }  private: int noisy;   };  C改…

Java 9:ServiceLoader

java.util.ServiceLoader类在运行时加载服务提供者/实现。 在编译时&#xff0c;ServiceLoader只需要知道Service接口。 借助Java9模块化&#xff0c;我们可以在运行时动态添加服务实现模块&#xff0c;而Application可以拥有新的实现&#xff0c;而不会影响任何事情&#xff0…

C++一天一个程序(四)

#include using namespace std; struct complex{  double real, imag;  complex(double 0.0, double 0.0); } complex&#xff1a;complex(double r, double i) {  real r; imag i; } inline ostream& operator<<(ostream &os, const complex &c) {…

C++一天一个程序(五)

(1)确定所求长方形的长和宽。 (2)确定计算长方形的周长和面积的公式并计算。 (3)输出计算结果。 (1)以面向过程程序设计思想编码。 #include using namespace std; void main(){ int perimeter,area; int length20,width10; perimeter2*(lengthwidth); arealength* width; cou…

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

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

一天一个C++程序(六)

数据类型转换应用示例。 #include using namespace std; int main() { int a,c,d,b322; float x,z,y4.56; char ch1‘d’,ch2; ay; xb; cch1; ch2b; zyb; dbch1; cout<<“a”<<a<<"\tx"<<x<<endl; cout<<“c”<<c<<…

早期更多失败– Java 8

快速失败或早期失败是一种软件工程概念&#xff0c;旨在通过在不应该发生的事情发生时立即停止执行来防止复杂问题的发生。 在之前的博客文章和演示中&#xff0c;我将详细介绍这种方法的优点&#xff0c;在此博客文章中&#xff0c;我将详细介绍Java 8中该思想的另一种用法。 …

C++一天一个程序(七)

#include using namespace std; int main() { cout<<“字符型 (char)所占字节数:”<<sizeof(char)<<endl; cout<<“无符号字符型(unsigned char)所占字节数:”<<sizeof( unsigned char)<<endl; cout<<“短整型( short int)所占字节数…

C++一天一个程序(八)

#include <iostream.h> void main() { int i,j,k; for(i1;i<6;i) { for(j1:j<6-i;j) cout<<" “; for(kl;k<: 2i- 1;k) cout<<"%"; cout<<endl; } for(i5;i>1;–) { for(j 1:j<6-i:j) cout<<" "; for(k…

url中传递对象参数_在URL参数中传递复杂对象

url中传递对象参数假设您想传递原始数据类型&#xff0c;例如复杂的Java对象 java.util.Data&#xff0c;java.lang.List&#xff0c;泛型类&#xff0c;数组以及通过URL参数所需的所有内容&#xff0c;以便在页面加载后在任何网页上预设默认值。 共同的任务&#xff1f; 是的…

C++两天一个程序(一)

#include  using namespace std;  main()   {    int  i 7;    int* ip &i;    int** ipp &ip;    cout << "Address " << ip << " contains " << *ip << endl;    cout << "A…

两个迭代器的故事

当您查看最受欢迎的Java面试问题时&#xff0c;可能会遇到有关快速故障和故障安全迭代器的问题&#xff1a; 故障快速迭代器和故障安全迭代器之间有什么区别&#xff1f; 简化的答案是&#xff1a; 如果在迭代过程中修改了集合&#xff0c;则快速失败迭代器将引发ConcurrentM…

数据库系统内部体系结构与外部体系结构

数据库系统的内部和外部体系结构 (1)内部体系结构模式&#xff1a;概念视图&#xff0c;概念级数据库&#xff0c;整个数据库的实际存储的抽象。一个数据库只有一个模式。 外模式&#xff1a;子模式&#xff0c;用户模式&#xff0c;最外层&#xff0c;是模式的子集&#xff0c…

三个世界及其有关概念

三个世界及其有关概念 数据库管理的对象(数据)存在于现实世界中&#xff0c;即现实世界中的事物及其各种联系。从现实世界的事物到存储到计算机的数据库中的数据,要数经历现实世界、信息世界和计机世界三个不同的世界,经历两级抽象和转换完成。 认识抽象&#xff0c;概念模型 1…

将文件拆分为流

上周&#xff0c;我讨论了类Pattern新的&#xff08;since 1.8&#xff09;方法splitAsStream可以处理字符序列&#xff0c;仅从流中读取该字符序列&#xff0c;并且不进行模式匹配以创建所有可能的元素并返回它作为流。 这种行为是流的本质&#xff0c;它是支持高性能应用程序…

数据模型

数据模型 现实世界中的事物及其联系,经过两级抽象和转换后形成了计算机世界中的数据及其联系,而数据模型就是用来描述数据及其联系的。 数据库中存放数据的结构是由数据模型决定的,数据模型是数据库的框架&#xff0c;是数据库系统的核心和基础。 数据模型是描述数据、数据联系…

activemq优先级_ActiveMQ消息优先级:工作原理

activemq优先级在邮件列表中 &#xff0c;通常会围绕ActiveMQ的消息优先级支持不断提出一些问题&#xff0c;以及有关观察到的行为和“真正支持什么”的好问题&#xff1f; 我希望可以帮助您了解幕后情况以及可以支持的优先级。 详细信息可能会有些麻烦。 如果您对这些细节不感…

移动通信

通信: 信源和信宿间信息的传输和交换构成了通信。 2)分类通信&#xff1a;固定通信&#xff0c;移动通信移动通信通信双方至少有-方在移动中(或者临时停留在某一非预定的位置 上)进行信息传输和交换。 这包括移动体(车辆、船舶、飞机和行人)和移动体之间的通信&#xff0c;移动…