静态类是正确的方式吗?

4
我正在开发一款Java应用程序,用于管理银行贷款的数据库。我在应用程序开发方面有一些经验,但我有一个问题,可能很愚蠢,但自从我学习编程语言以来,我一直在讨论这个问题,却没有得到令人信服的答案。
在我的程序中,我有许多类和方法,它们是我用作通用工具的。例如,我有一个用于Excel写入的类,一个用于文件读写的类,一个以各种方式操作字符串的类,一个以我的默认格式显示对话框/消息的类,一个用于特定数学函数(如Math)的类等等。
我无法将这些类想象成真正的东西(如类/对象所指的),但它们在我的脑海中像工具箱一样。这就是为什么我将它们设为静态的原因。以这种方式编写,例如:
excelWriter.create("C:\temp.xls");
excelWriter.append("mydata1\tmydata2\nmydata3\tmydata4");
excelWriter.close();

相比于
ExcelWriter myExcelWriter;
myExcelWriter.create("C:\temp.xls");
myExcelWriter.append("mydata1\tmydata2\nmydata3\tmydata4");
myExcelWriter.close();

这更适合我,因为我认为工具箱就像是一直在那里为我服务的东西,我不需要每次想使用它时都创建一个对象。难道C++的Math也不是同样的情况吗?静态的也是这样吧?
我已经和许多同事和编程朋友讨论过这个问题,他们中的大部分都说我必须创建一个对象,因为这就是面向对象编程的全部内容。
我理解他们在另一个上下文中所说的话: 在我的业余时间里,我正在使用VB.net开发一款纸牌游戏。我有游戏、玩家、牌堆、手牌等类。我从每个类中制作了许多对象,因为我有很多游戏、玩家、牌堆和手牌。它们可以被想象成真实的东西。当你开发游戏时,这是特别不同的。开发游戏更加面向对象,因为它包含真实的东西。
我想知道,我是不是在这里犯了什么错误? 我想听听关于面向对象编程的深入见解。 我也想知道静态类的用途。
谢谢
3个回答

2
不,仅包含静态成员函数的类在这种情况下不是正确的选择,至少在我看来是这样。第二个ExcelWriter类会更好。无论如何,您将Excel输出的文件句柄存储在哪里?希望不是在静态变量中?这是该类的数据成员的一个主要候选项。
在这种情况下,请尝试将对象视为表示正在写入的输出流。将来,您可能希望同时打开两个输出流,但使用“工具箱”类将无法实现此目标。
有时,仅包含静态成员函数的类可以作为分组相关函数的一种方式,但这很少见,并且通常意味着该类可以围绕包含数据的对象进行重新设计。例如,静态成员函数可以作为拥有不同构造函数的类的一种方式。

你就在这里。文件句柄应该存储在类中,所以我必须创建一个对象。错误的例子。打开两个输出流的重点也非常好。 - Stefanos Kargas

2
静态类和函数只应用于中性函数和计算。仅在需要获取某些答案时使用。
当您思考和实际使用时,面向对象设计非常容易。例如,在您的例子中,您使用了单词“myExcelWriter”,这是一个Excel编写器。因此,如果它是一种东西,那么它就是一个对象。这意味着它需要一个实例。
始终只向自己描述你正在做的事情,如果你所做的事情可以用名词描述,那么它就是一个对象。如果是形容词,则为属性或类成员。如果是动词,则为方法。如果是副词,则为属性或传递给函数的变量。
静态类是包含独立函数的工具,并且仅使用输入变量进行某些计算(就像 Math 一样,只计算2个数字)。
类中的静态函数是用于该类的对象的工具,不需要实例状态即可工作。(例如 Int.Parse())
在我看来,面向对象编程更接近真实语言,这就是为什么以这种方式编程更直观的原因。

1

类不一定要代表现实世界中的事物。如果你使用它们使得程序更易于理解,那么你就做对了。

话虽如此,一个类应该同时具有数据和方法。你的 Excel 和文件类看起来很好,但要注意那些只有方法而没有数据的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接