一个类全部都是静态方法有什么问题吗?

2023-12-31

我正在进行代码审查,发现一个使用所有静态方法的类。入口方法接受多个参数,然后开始调用其他静态方法,传递入口方法接收到的全部或部分参数。

它不像具有很大程度上不相关的实用函数的数学类。在我自己的正常编程中,我很少编写 Resharper 弹出并说“这可能是静态方法”的方法,当我这样做时,它们往往是无意识的实用方法。

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

UPDATE:正在传递的特定状态是来自数据库的结果集。该类的职责是根据数据库的结果集填充 Excel 电子表格模板。我不知道这是否有什么区别。


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

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

最终结果:一个真正的 OOP-tastic 架构,具有如此多的间接级别,以至于调试任何东西都需要几个小时。我最近开始使用这样的系统,其中的学习曲线对我来说是“一堵砖墙,后面是一座山”。

有时,过于热心的 OOP 会导致类变得如此精细,以至于实际上是一种净危害。

相比之下,许多函数式编程语言,甚至是面向对象的语言,如 F# 和 OCaml(以及 C#!),都鼓励扁平化和浅层的层次结构。这些语言的库往往具有以下属性:

  • 大多数对象都是 POCO,或者最多具有一到两级继承,其中对象只不过是逻辑相关数据的容器。
  • 您可以使用模块(相当于静态类)来控制对象之间的交互,而不是类之间相互调用。
  • 模块往往作用于非常有限的数据类型,因此范围很窄。例如,OCaml List 模块表示对列表的操作,Customer 模块便于对客户进行操作。虽然模块与类上的实例方法具有或多或少相同的功能,但与基于模块的库的主要区别在于,模块更加独立,粒度更小,并且往往对其他模块有很少的依赖性(如果有的话)。
  • 通常不需要子类对象重写方法,因为您可以将函数作为第一类对象传递以进行专门化。
  • 虽然C#不支持这个功能,functors https://stackoverflow.com/questions/2370240/would-you-please-explain-ocaml-functors-to-me/2374070#2374070提供一种对专用模块进行子类化的方法。

大多数大型库的广度往往大于深度,例如 Win32 API、PHP 库、Erlang BIF、OCaml 和 Haskell 库、数据库中的存储过程等。因此,这种编程风格是实战测试,并且似乎在以下环境中运行良好:现实世界。

在我看来,设计最好的基于模块的 API 往往比设计最好的 OOP API 更容易使用。然而,编码风格在 API 设计中同样重要,因此,如果团队中的其他人都在使用 OOP,并且有人以完全不同的风格实现某些内容,那么您可能应该要求重写以更紧密地匹配您的团队编码标准。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个类全部都是静态方法有什么问题吗? 的相关文章

  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • 在Java中多次读取System.in会导致IOException?

    我正在尝试创建一个小命令行游戏来强化我在过去几个月中在 Java 中学到的一些东西 我正在尝试创建一个名为 readInput 的方法 它返回一个我可以一次又一次调用的字符串 第一次它工作正常 但第二次它会导致 IO Exception 如
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • 从包含大量文件的目录中检索文件

    我的目录包含近 14 000 000 个 wav 格式的音频样本 所有普通存储 没有子目录 我想循环浏览文件 但是当我使用DirectoryInfo GetFiles 在该文件夹上 整个应用程序冻结了几分钟 可以用另一种方式完成吗 也许读取
  • 为什么WCF中不允许方法重载?

    假设这是一个ServiceContract ServiceContract public interface MyService OperationContract int Sum int x int y OperationContract
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • 使用 Runtime.getRuntime().exec() 进行重定向不起作用

    我需要从程序执行命令 命令行是可以的 我在终端试了一下 但是在程序中不行 我从我的代码中添加一个副本 File dir new File videos String children dir list if children null Ei
  • 如何在java 1.8中从org.jboss.jca.adapters.jdbc.jdk8.WrappedConnectionJDK8转换为oracle.jdbc.OracleConnection

    如何在 java 1 8 中从 org jboss jca adapters jdbc jdk8 WrappedConnectionJDK8 转换为 oracle jdbc OracleConnection 目前我正在这样使用并得到以下异常
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标
  • 我找不到 IntelliJ 快捷方式

    我使用 vim 一段时间 我知道有一个 intellij vim 插件 我很好奇内置的 IntelliJ 文本导航存在什么 如何打开实时模板来创建模板 如何查看以 tr 开头的现有模板列表 如何进行全局搜索并在当前文档中进行搜索 然后转到下
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • WKWebview注入cookie头导致重定向循环

    我试图将我单独获取的会话cookie注入到WKWebview请求中 结果证明这是相当痛苦的 我设法使用注入会话cookie这个解决方案 https stackoverflow com questions 26573137 can i set
  • PCM -> AAC(编码器) -> PCM(解码器)实时且正确优化

    我正在尝试实施 AudioRecord MIC gt PCM gt AAC Encoder AAC gt PCM Decode gt AudioTrack SPEAKER with MediaCodec在 Android 4 1 API16
  • 如何在MySQL中进行批量插入

    我有 1 多条记录需要输入到表中 在查询中执行此操作的最佳方法是什么 我应该创建一个循环并每次迭代插入一条记录吗 或者 还有更好的方法 来自MySQL手册 http dev mysql com doc refman 5 7 en inser
  • Azure 管理 REST API - “身份验证失败。‘授权’标头以无效格式提供。”

    我拼命尝试将 2 个经典存储帐户从旧的 MSDN 订阅移动到 MPN 订阅 但我一直遇到困难 因为仅通过 REST API 支持这些帐户的移动 我已按照此处的说明启用了 API https azure microsoft com en us
  • Eclipse 是否有排列类文件的功能?

    Eclipse 有很多功能 我想知道这个功能是否存在 或者是否存在任何捷径 我想将我的类数据排列到该流程中的变量 构造函数 方法中 从上到下 进一步细化我想按访问级别 pub private protected 和类型 void 或返回的方
  • 使用 GSON 获取 JSON 键名

    我有一个 JSON 数组 其中包含如下对象 bjones fname Betty lname Jones password ababab level manager 我的 User 类有一个用户名 需要使用 JSON 对象的密钥 我如何获取
  • 添加不属于模型一部分的自定义表单字段 (Django)

    我在管理网站上注册了一个模型 它的字段之一是长字符串表达式 我想将自定义表单字段添加到管理员中此模型的添加 更新页面 根据这些字段的值 我将构建长字符串表达式并将其保存在相关的模型字段中 我怎样才能做到这一点 我正在从符号构建数学或字符串表
  • 在elasticbeanstalk中设置NODE_ENV变量

    我创建了一个名为 elasticbeanstalk environment config其中包含以下内容 option settings option name NODE ENV value development 我还将 process
  • 具有多个可选参数的 Spring Data MongoDB AND/OR 查询

    我正在尝试执行具有两个以上可选参数的查询 但没有得到任何结果 对于2个参数我遵循了这个问题的答案spring data mongo 可选查询参数 https stackoverflow com questions 11613464 spri
  • 带有断路器的 Kafka Consumer,使用 Resilience4j 重试模式

    我需要一些帮助来了解如何使用 Spring boot Kafka Resilence4J 提出解决方案 以实现来自 Kafka Consumer 的微服务调用 假设如果微服务关闭 那么我需要使用断路器模式通知我的 Kafka 消费者停止获取
  • 使用 Solr 配置 Tika

    我正在寻找将丰富类型文档 Pdf Doc rtf txt 索引到 Solr 中 我找到了 Tika 作为解决方案 我在网上咆哮 但没有找到任何文档 链接来使其与 ExtractingRequestHandler 一起使用 任何人都可以提供通
  • 为什么对原型的编辑不起作用?

    我想向函数构造函数 类 的原型添加一个常量 但它返回为未定义 为什么 function myClass document ready function myClass prototype age 22 window alert myClas
  • 当在 QTableWidget 中拖动一行时,如何找出它被拖动的行索引 FROM 和 TO?

    我试图保持一些数组数据与 QTableWidget 的内容同步 我想启用拖放重新排序 在表中移动项目 而不是复制 但我不清楚当触发放置事件时 我如何找出该项目是从哪个索引拖动的 因此 我无法知道要在正在同步的列表中移动哪个对象 如何获取被拖
  • Android sqlite更新行

    我试图更新表中的一行 但更新功能似乎没有响应 我的功能一切正常 还是我哪里出了问题 public int editChild int id String name String dob int gender double weight do
  • 缩小的 js 文件中的变量名称重复

    我最近在产品部署中遇到了问题 这是一个 net 项目 问题是我的一个 js 文件中有一行代码 for const work in worklist 部署后 该js文件被缩小 代码更改为 for n in n 我通过将 const 更改为 v
  • 为什么我无法在 Solaris 10 上构建加载 Socket.so 的 Perl 模块?

    我正在尝试构建 Convert ASN1 模块 但在此过程中出现错误 我在 Solaris 10 上使用 Perl 5 12 0 perl Makefile PL运行没有问题 同样的make 但是 进行测试 会引发此错误 IMO 中最关键的
  • Primeng 按钮不显示标签

    我的 angular4 应用程序中有 primeng 按钮 按钮的标签未显示 按钮显示很小 没有标签 div div
  • 仅使用 WebRTC 发送报价

    我想创建类似聊天轮盘赌的东西 有两个同龄人 两个对等方都向信令服务器发送 SDP Offer 要求其与某人建立连接 信令服务器使用对等点 A 的提议将其作为答复发送给对等点 B 反之亦然 两个对等方都可以在不使用 createAnswer
  • jQuery、ajax 和 jsonp 的问题

    我正在使用 jsonp 和 ajax 访问另一台服务器上的 Web 服务 这是 jQuery ajax type GET url wsurl callback dataType jsonp crossDomain true error fu
  • 一个类全部都是静态方法有什么问题吗?

    我正在进行代码审查 发现一个使用所有静态方法的类 入口方法接受多个参数 然后开始调用其他静态方法 传递入口方法接收到的全部或部分参数 它不像具有很大程度上不相关的实用函数的数学类 在我自己的正常编程中 我很少编写 Resharper 弹出并