在实现类中使用设计模式名称是个好主意吗?[关闭]


28

最近我碰到有大量的中等大蟒蛇的代码库来了MyClassAbstractFactoryMyClassManagerMyClassProxyMyClassAdapter等类。

一方面,这些名称指示我研究和学习相应的模式,但它们并不能很好地描述班级的工作方式

此外,他们似乎落在单词的列表禁止内编程:variableprocess_available_informationdataamountcompute:过于宽泛的名字,不给我们介绍一下什么功能不能单独使用

那么应该存在CommunicationManager还是宁愿PortListener?或者,也许我根本不理解问题...?


如果你熟悉的模式做什么,然后在图案名称是一个体面的描述,但只是在图案名称是一个坏主意,最好是有一个MyClassFactory,一个FooAdapter等
棘轮怪胎

编辑了问题以表明这些类不仅被称为“ AbstractFactory”,而且那里也存在一些描述性的词。
Vorac

1
...他们是认真地将其称为a Fctory而不是Factory,还是仅仅是拼写错误?
Izkata

@Izkata,哈哈,我不好。但是,有适配器和适配器!
Vorac 2013年

Answers:


47
  • AbstractFactory确实是一个糟糕的名字选择。有没有办法知道什么是此工厂创建的,而当你再找找它创建一个实体Animal公司,您永远也找不到的名字对应的工厂。

  • AnimalAbstractFactory也不是明智的选择,因为在大多数语言中,签名中的关键字将是多余abstract的。

    话虽这么说,但有很多很好的理由(以注释突出显示)确实包含Abstract在名称中:不仅在几个上下文中您没有完整的签名,而且还只有名称,而且还要保留AnimalFactory接口可能是一个明智的选择(除非,不幸的是,语言/框架的约定是将前缀为I)。

  • AnimalCreationUtility这也是一个不好的选择:如果这是工厂,则使那些将要阅读代码并将其称为工厂的人变得更容易。

  • abstract AnimalFactory还可以 它没有冗余,很明显,它一个抽象工厂,将动物的创作委托给它的子代。

所以是的,包括设计模式的名称是一个好主意,但是它应该只是名称的一部分,而不应该与签名的其他部分重复。


2
为什么这比在显眼位置写注释更好?“在此模块中,我们实现了MVC。原因:...模型:...视图:...控制器:...结构图:... API :。 ..”。
Vorac 2013年

37
@Vorac:拥有清晰的名字总是比依靠评论更好。
阿森尼·穆曾科

2
@Vorac迟早有人会添加一个新类而不更新该突出注释(甚至不知道其存在)。忽略整个应用程序中始终使用的命名约定要困难得多。
Konrad Morawski 2013年

2
浏览项目解决方案时,是否将打开每个类文件以查找其作用?不。这就是为什么使用描述性名称类/文件始终是一个更好的主意的原因。
矩阵

2
我想不同意第二点:我认为AnimalAbstractFactory是一个不错的选择,因为即使在类声明中它是多余的,但在子类声明中还是很有用的:LionFactory扩展了AnimalAbstractFactory,我认为,是一个很好的信息。
伊戈尔2013年

11

取决于具体示例。命名类* Builder几乎总是可以最好地使用Builder模式,而Singleton通常不需要这样命名。

如果您没有在类名中添加模式名称,即使您这样做,通常也应该在类中添加注释,以说明它实现了特定的模式。


3
一致性在这里很关键,因为一旦只调用了一些工厂...Factory,如果一个类的命名违反了该约定,那么意识到一个类是一个工厂就变得很麻烦。
Konrad Morawski 2013年

10

在类中使用模式名称的全部目的是使您易于理解该类的功能。如果您将类命名为AnimalFactory,则很明显该类将创建Animal实例。如果您的类的名称包含模式的名称,并且没有描述它的作用,则说明您选择了错误的模式或错误地实现了该模式。


1

我认为它可以很好地工作。例如:

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
这如何回答所提问题?根据我的阅读,您的“示例”仅显示对类名和代码注释的无用重复
gnat 2013年

注释是为了证明每个类的目的,以防某些类名不明显。通过查看这些内容,我立即知道我有执行某项操作的命令,返回数据的查询,为现有异常记录机制添加其他行为的装饰器以及创建帐户过滤器的工厂。我认为您对类名的描述越多,其他人越容易阅读您的代码。如果您使用的是设计模式,请这样说-归根结底,拥有设计模式的全部目的是使其他人更轻松地阅读您的代码
CodeART
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.