Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 一个充满静态方法的类的设计考虑_Design Patterns_Static - Fatal编程技术网

Design patterns 一个充满静态方法的类的设计考虑

Design patterns 一个充满静态方法的类的设计考虑,design-patterns,static,Design Patterns,Static,作为一名Swing开发人员,我已经确定了许多我在布局组件时使用的模式。例如,我经常创建与JLabel关联的组件。我通常写: JPanel panel = new JPanel(new BorderLayout()); panel.add(label, BorderLayout.NORTH); panel.add(list, BorderLayout.CENTER); 我经常这样做,所以我决定创建一个包含常用布局习惯用法的类。那么我可以简单地说: JPanel panel = LayoutPatt

作为一名Swing开发人员,我已经确定了许多我在布局组件时使用的模式。例如,我经常创建与JLabel关联的组件。我通常写:

JPanel panel = new JPanel(new BorderLayout());
panel.add(label, BorderLayout.NORTH);
panel.add(list, BorderLayout.CENTER);
我经常这样做,所以我决定创建一个包含常用布局习惯用法的类。那么我可以简单地说:

JPanel panel = LayoutPatterns.createNorthLabeledPanel(label, list);
…这大大减少了我的打字量

所以,现在我有了一个包含大约20个静态方法的类。该类没有状态-所有上下文都是通过方法参数传入的

除了Java的数学类,我还没有看到任何完全由静态方法组成的类,也没有状态

一方面,这感觉不对。另一方面,我看不出有什么问题


这是一个可以使用的模式,还是一些表示代码气味的模式?如果将此模式应用于不同的域,我是否应该关注一类静态的多线程使用?如果您在产品质量代码中看到过这一点,您会犹豫吗?

我认为创建这样的类没有问题。如果该类在正常使用中有意义,因此您永远不需要实例化它的实例,那么为什么不让这些方法成为静态的呢


我自己也写过类似的代码。

只要事情不失控,纯静态实用程序类没有问题。如果放在那里的方法不需要任何状态,那么就没有理由实例化类


事实上,这种情况非常普遍,以至于在.Net中,扩展方法必须在静态类中,因为大多数情况下,实用程序函数是静态的,并试图扩展另一种类型的功能。

我认为您的方法没有任何问题,事实上,我一直在使用这些实用程序静态类。因为这个类没有任何状态,所以我认为在多线程环境中不会有问题。如果你关心这个类的大小,考虑根据某些类型的Swing组件来划分它。

< P>我认为这种东西通常有很差的代码气味。然而,我同意你的看法,我认为在这种情况下没有什么特别的错误

我认为你已经很好地解释和证明了你的设计

考虑一个可能的替代方案,也许您可以继承JPanel并创建NorthLabelJPanel(或者更好地创建一个包含JPanel的新类)。然而,我不确定这是否值得努力。我认为这样你的代码看起来会更复杂,即使这可能是更好的方式


我的2美分:)

我认为这里唯一的问题是一种语言,它迫使您创建一个类,其中-gasp-global函数是完全合适的。:-)

VB.NET和现在的C#甚至对静态类(VB称之为模块)提供了语言支持,因此您可以让编译器检查它们是否确实都是静态的。

就我个人而言,我更希望看到您描述的原始形式的代码。如果您想更改面板的布局,就不必搜索合适的方法或创建一个全新的方法来实现所需的功能,因此,一目了然地说出代码正在执行的操作将更容易,维护也更容易。此外,当您向组件添加更多属性时,静态方法的数量将以指数速度增长

在设计模式的世界中,我看到构建器模式应用于这样的情况,这似乎就是JavaAPI试图实现的

基本概述:

  • 创建一个简单的对象,很少或没有装饰
  • 向其添加对象/属性等,使其看起来像/做你想做的事情
  • 注意:美妙之处在于,在完成之前,你不知道最终结果会是什么样子,这给了你全方位的灵活性

    此外,我刚刚阅读了一篇关于扩展JPanel的回复。从设计的角度来看,记住尽可能地倾向于“有-有”关系而不是“是-有”关系。否则,您最终会得到一个非常扁平的类结构,它看起来与静态方法相同,并且会遇到与我上面描述的相同的陷阱

    话虽如此,我已经编写并使用了大量我称之为“服务”的类,这些类没有状态,只有静态方法(如您所述),它们使我免于编写(更重要的是,复制)许多基本例程。如果使用得当,它们会非常方便,但我倾向于只在非常基本(和常见)的例程中使用它们,例如格式化文本、复制数组、将浮点数组转换为双数组(在C++中),或者在标准库中可以找到的任何其他程序

    这实际上只取决于静态方法的“静态”程度。如果您不认为它们需要经常维护或更新,那么您可以将它们锁定在您所描述的范围内。但是,如果将来有机会重新分解,我认为您应该尽可能地保留它的灵活性,不幸的是,这意味着每次都要手动进行API调用


    祝你好运

    似乎每个项目迟早都会有一个静态实用程序类。对于您的特定示例,我可能会研究工厂模式。但是,如果你所做的有助于完成工作,并且不会让团队中的其他人感到困惑,那么我认为你所做的没有任何错误。

    我认为如果你在面向对象的环境中开发,你只有两个选择:

  • 使所有类方法都是静态的
  • 开发一个常规类并使用singleton模式

  • 回答得好,是的,班级规模的不断扩大是我关心的问题。我想知道有多大太大了。。。我猜当快速阅读API到