当前位置: 首页 > 面试题库 >

具有所有静态方法的类有什么问题吗?

慕健
2023-03-14
问题内容

我正在进行代码审查,并遇到了一个使用所有静态方法的类。入口方法接受几个参数,然后开始调用其他静态方法,并传递入口方法接收到的所有或某些参数。

它不像具有大量不相关的实用程序功能的Math类。在我自己的常规编程中,我很少编写Resharper弹出并说“这可能是静态方法”的方法,而当我这样做时,它们往往是无用的实用方法。

这种模式有什么问题吗?如果类的状态保存在字段和属性中或使用参数在静态方法中传递,这是否只是个人选择的问题?

UPDATE :传递的特定状态是数据库的结果集。该类的责任是从数据库的结果集中填充excel电子表格模板。我不知道这有什么区别。


问题答案:

这种模式有什么问题吗?如果类的状态保存在字段和属性中或使用参数在静态方法中传递,这是否只是个人选择的问题?

从我个人的经验来看,我已经处理了100个具有非常深层对象层次结构的KLOC应用程序,所有内容都继承并覆盖了其他所有内容,所有内容都实现了六个接口,甚至这些接口都继承了六个接口,系统实现了每个书中的设计模式等

最终结果:一个真正的面向OOP的架构,具有如此多的间接级别,因此调试任何东西都需要数小时。我最近开始使用这样的系统工作,在我看来,学习曲线被描述为“一堵砖墙,然后是一座山”。

有时,过度狂热的OOP会导致类过于精细,以至于实际上造成了净危害。

相比之下,许多功能性编程语言,甚至是F#和OCaml(以及C#!)之类的OO语言,都鼓励扁平和浅层次的学习。这些语言的库通常具有以下属性:

  • 大多数对象是POCO,或具有最多一或两个继承级别,其中这些对象只不过是逻辑相关数据的容器而已。
  • 您可以使用模块(等同于静态类)来控制对象之间的交互,而不必彼此调用。
  • 模块倾向于作用于数量非常有限的数据类型,因此范围很窄。例如,“ OCaml列表”模块表示对列表的操作,“客户”模块可简化对客户的操作。尽管模块具有与类上的实例方法大致相同的功能,但是与基于模块的库的主要区别在于模块更加独立,不那么精细,并且对其他模块的依赖很少。
  • 通常不需要子类的对象重写方法,因为您可以将函数作为一流对象进行传递以进行专门化。
  • 尽管C#不支持此功能,但函子提供了一种对专业化模块进行子类化的方法。

大多数大型库往往比深度库更广泛,例如Win32 API,PHP库,Erlang
BIF,OCaml和Haskell库,数据库中的存储过程等。因此,这种编程风格经过了严格的测试,并且在现实中。

我认为,设计最佳的基于模块的API往往比设计最佳的OOP
API更容易使用。但是,编码风格在API设计中同样重要,因此,如果您团队中的其他所有人都在使用OOP,并且有人以完全不同的方式实现某些东西,那么您可能应该要求重写以更紧密地配合您的团队编码标准。



 类似资料:
  • 我知道这个问题有点简单,但我真的想知道为什么不去留档,假设我有这样的课。 } 两个静态方法都抛出一个错误,指出 修饰符“静态”仅允许在常量变量声明中使用 我知道医生说 这在Java语言规范部分§8.1.3中有描述 8.1.3内部类和封闭实例 但我的问题是,调用简单值或属性与调用静态方法(无论是公共方法还是私有方法)有什么区别?。为什么可以调用属性,但不能调用方法。 谢谢

  • 问题内容: 当其中的所有方法都是具体的时,有人在声明类抽象时有一些实际的编程情况吗? 问题答案: 好吧,您可能正在使用模板方法模式,其中存在多个都具有默认实现的覆盖点,但是组合的默认实现本身不合法-任何功能实现都必须是子类。 (是的,我不喜欢模板方法模式;)

  • 问题内容: 请参见下面的代码段: 代码1 代码2 这些代码段之间有什么区别?两者都15作为答案输出。 问题答案: 静态方法属于类本身,而非静态(aka实例)方法属于从该类生成的每个对象。如果你的方法执行的操作不依赖于其类的单个特征,请将其设置为静态(这将使程序的占用空间减小)。否则,它应该是非静态的。 例: 你可以像这样调用静态方法:。如果你使用method2尝试该操作,它将失败。但这将起作用:;

  • 相对来说,我是java的业余爱好者,一直使用类和对象调用静态变量和方法。当它们是静态的时,类和对象都可以使用它们。 为什么程序员不对类变量和方法都保持默认的静态?

  • 问题内容: 这是我的方法: 我把它放回去。该方法有什么问题? 问题答案: 您的条件应为i * i <= num 您未考虑数字9,因此9 <9将导致错误。但是您需要检查9。

  • 问题内容: 我知道创建一个非静态内部类对象需要一个外部类对象,而创建的非静态内部类对象会自动具有对该外部类对象的隐藏引用。但是为什么非静态内部类不能具有静态成员呢?Java设计人员只需要禁止在内部类的静态方法内访问非静态外部类字段,这样做会更有意义,不是吗? 如果在内部类中具有静态成员没有意义,那么为什么内部类可以通过继承具有静态成员的类来继承静态成员? 我也读了这篇文章。如前所述: 内部类可以继