代码之家  ›  专栏  ›  技术社区  ›  Sonny Boy

公用事业类最佳实践?

oop
  •  5
  • Sonny Boy  · 技术社区  · 16 年前

    我们目前有一个Utilities类,它处理很多字符串格式、日期显示和类似的功能,是一个共享/静态类。

    这是做事情的“正确”方式还是我们应该在需要时实例化实用程序类?

    我们的主要目标是减少内存占用,但应用程序的性能也是一个考虑因素。

    另外,我们正在使用.net 2.0

    6 回复  |  直到 13 年前
        1
  •  3
  •   Jeffrey L Whitledge    16 年前

    如果类中有任何状态,那么最好用它创建对象。在对象依赖性和线程安全性方面,单例是一个难题。

    如果类中没有状态,那么选择是否使其成为静态将不会对内存占用产生明显影响。

        2
  •  4
  •   kopper    16 年前

    这是做事情的“正确”方式还是我们应该在需要时实例化实用程序类?

    从面向对象的角度来看,这取决于:-)

    为了 pure functions 在爪哇/C中应该使用静态方法。在C语言中,你也可以像其他人描述的那样尝试使用扩展方法。

    对于不是纯函数的实用程序方法(例如读取一些文件),您应该创建一个实例来提高可测试性(例如允许模拟)。

    不同的是,后者虽然不直接保持任何状态,但它们与一些拥有自己的、可能改变状态的外部组件通信。这种外部状态可能导致这个实用程序方法随着时间的推移返回不同的结果(对于相同的输入),这使得测试和推理变得更加困难。将纯函数和这种实用方法作为显式的实例方法来区分,是一个很好的设计原则。

    然而,在Java中,“模拟参数”通常需要进行反编译,因为它不允许模拟静态方法。

        3
  •  3
  •   Dan    16 年前

    如果您使用的是.net,您是否研究过使用扩展方法?我发现,如果使用得当,我甚至可能根本不需要一个实用程序类。

        4
  •  0
  •   Adam Ralph    16 年前

    这是.net吗?如果是,最好提供扩展方法。例如,如果您有一个格式化字符串的实用方法,请将其签名从

    public static string SpecialFormat(string text)
    

    public static string SpecialFormat(this string text)
    

    这边,那个 SpecialFormat 方法将更容易被发现,因为它将显示为字符串上的方法。

        5
  •  0
  •   Cory Petosky    16 年前

    如果您的语言支持它,请将这些函数作为包/命名空间/模块的一部分,而不是类的一部分。

    否则,类的静态方法就可以了。如果您的语言支持,则应该将类标记为final/closed/non-irtual/non-extensable。

    如果您的语言支持它,您可以考虑为那些函数接受的类型重新定义内置类/定义,但要注意命名空间冲突。在这种情况下,请按照您选择的语言的风格指南或事实标准来选择惯用方法。

        6
  •  0
  •   Drew Johnson    16 年前

    静态类可以满足您所描述的要求—只要注意以线程安全的方式共享任何共享状态(静态成员变量)。