Java 命令对象集合的名称

Java 命令对象集合的名称,java,oop,naming-conventions,Java,Oop,Naming Conventions,我正在开发一个命令处理程序,其中每个命令都可以无限期地包含子命令。所有命令都由“CommandManager”在根级别进行管理,它接受用户输入,解析选项,然后找到正确的命令并将输入传递给它。由于CommandManager和Command都有类似的获取和存储指定命令的方法,而且这两个类都非常混乱,我想找出查找命令并将其存储到公共超类中的逻辑,但是,我想不出一个描述性名称来调用它 我之所以尝试使CommandMagager和命令都扩展另一个类,是因为命令管理器的行为类似于根级别的命令。命令实际上并

我正在开发一个命令处理程序,其中每个命令都可以无限期地包含子命令。所有命令都由“CommandManager”在根级别进行管理,它接受用户输入,解析选项,然后找到正确的命令并将输入传递给它。由于CommandManager和Command都有类似的获取和存储指定命令的方法,而且这两个类都非常混乱,我想找出查找命令并将其存储到公共超类中的逻辑,但是,我想不出一个描述性名称来调用它

我之所以尝试使CommandMagager和命令都扩展另一个类,是因为命令管理器的行为类似于根级别的命令。命令实际上并不包含任何处理命令的逻辑,它们只是提供了一种用特定名称注册和检索命令的方法


是否有任何通用惯例可以帮助我找到一个名称,或者这是看待问题的错误方式?

是的,关于这一点有一些规则,不是一成不变的,只是通过经验和模仿而成为公认的最佳实践的一种实践

概述
  • 明确责任
  • 使用驼峰案例
  • 命名对象,而不是类
  • 使用名词
  • 避免使用诸如
    Info
    Processor
    Manager
    之类的词
  • 如果有对象,请使用单数
  • 实用程序类使用复数形式
  • 在抽象基类前面加上
    abstract
  • Impl
    作为隐藏实现类的后缀
  • 不要在
    接口
    名称前面加
    I
  • 正确使用设计模式名称
  • 在名称前面加上它们的专门化
  • 正确使用数据结构名称
细节 明确责任 重要的是,这个名字很好地反映了责任。名称应传达其意图

命名对象,而不是类 使用单个对象时,请使用外观良好的名称。命名对象,而不是类

用例 将CamelCase用于Java类型的名称

使用名词 用名词表示物体。如果宾语代表一个动作,把动词变成名词。如果宾语代表一个属性,把形容词变成名词。例如,如果动作是
compile()
,如果是主动动作,请使用
Compiler
;如果是被动能力,请使用
compileable
。如果动作是
run()
,如果是主动动作,请使用
Runner
,如果是被动异能,请使用
Runnable

避免使用诸如
Info
Processor
Manager
在大多数情况下,它们只是“我不知道该怎么称呼这个”的同义词(罗伯特·C·马丁)。这本身就是“我不知道这东西在做什么”或“这东西在做不止一件事”的症状。这就是为什么当我们看到这样的名字时,我们常常理所当然地感到重构的冲动

如果有对象,请使用单数 类名通常是单数的,特别是当您可以获得单个类的多个对象时。我们喜欢为这些对象集合的变量名保留复数形式

好榜样
JButton按钮;
列表按钮;
坏榜样
Properties
是一个不好的类名,因为它是复数的,尽管存在对象。我们喜欢调用
列表
jButtons
。那么,如何调用
列表
-
属性
<代码>属性
<代码>属性

实用程序类使用复数 如果一个类只包含静态方法,而这些静态方法的唯一目的是为另一种类型提供实用方法,那么它就是一个实用类

好例子
集合
SPIFilter
数组
执行器
文件系统
文件
路径

在抽象基类前面加上
abstract
接口
Foo
的抽象基实现通常称为
AbstractFoo

示例:
AbstractAction
AbstractList
AbstractMap
AbstractQueue
等等

确保此名称是用户几乎看不到的名称,
AbstractSomething
是实现者/扩展者的好名称,而不是用户的好名称。只有在没有更好的名字时才选择这个名字

Impl
为接口或抽象类
Foo
提供默认实现的类有时称为
FooImpl

确保用户从未看到此名称。从来没有。它只对实现者有好处,对其他人没有好处。像
XyzImpl
这样的名称不能对用户可见。只有在没有更好的名字时才选择这个名字

不要在
接口
名称前加
I
OO语言中类型的用途通常是封装和隐藏对象。类型是
接口
枚举
还是
@接口
注释都是该类型的详细信息。只有两种情况需要了解有关类型的这些详细信息:当您想要扩展类型时,以及当您想要创建该类型的对象时。这些用例是类型用例的少数。在接口名称前面加上
I
,大声声明实际上应该隐藏的实现细节,违反了这一原则

interface
s的名称前面放一个
I
,就像使用匈牙利符号一样。匈牙利符号只有在您工作的环境中才有意义,在这种环境中,跟踪您类型的这些物理方面是至关重要的。(就这一点而言,现在在C中甚至不需要它!)

此外,你知道
JButton button;
List<JButton> buttons;
Command
    CompositeCommand
    SimpleCommand
Command
    CompositeCommand
        RootCommand
    SimpleCommand
Command
    CompositeCommand
        Subcommand
        RootCommand
    SimpleCommand