4

我正在用 Java 开发一个应用程序,它管理银行贷款的数据库。我在应用程序开发方面有一些经验,我有一个可能很愚蠢的问题,但这是我一直在谈论的问题,因为我一直在学习开发语言并且从未得到令人信服的答案。

在我的程序中,我有许多类和方法,我将它们用作通用工具。例如,我有一个 Excel 写作类,一个文件读/写类,一个以各种方式操作字符串的类,一个以我的默认格式显示对话框/消息的类,一个用于特定数学函数的类(如数学)等。

我无法将这些类想象成真实的东西(就像类/对象一样),但它们作为工具箱出现在我的脑海中。这就是我将它们设为静态的原因。以这种方式我写例如

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++的数学不是同样的情况和静态的吗?我与许多同事和编码朋友讨论过它,他们中的大多数人说我必须创建一个对象,因为这就是面向对象编程的全部内容。

我理解他们在另一种情况下所说的话:在业余时间,我一直在使用 VB.net 开发纸牌游戏。在那里我有游戏、玩家、甲板、手的课程。我在每个班级中制作的物品很多,因为我有很多游戏、玩家、套牌、手牌。它们可以被想象成真实的东西。当您开发游戏时,情况就大不相同了。游戏的开发更加面向对象,因为它包含真实的事物

我想知道,我在这里是不是大错特错了?我想深入了解 oop 的含义。我还想听听静态类的用途。

谢谢

4

3 回答 3

2

不,至少在我看来,在这种情况下,只包含静态成员函数的类是不正确的。第二个 ExcelWriter 类会更好。无论如何,您将 Excel 输出的文件句柄存储在哪里?我希望不在静态变量中?这是此类数据成员的主要候选人。

在这种情况下,请尝试将对象视为表示您正在写入的输出流。将来,您可能希望同时打开两个输出流,这对于您的“工具箱”类是不可能的。

有时,仅包含静态成员函数的类可用作对相关函数进行分组的一种方式,但这很少见,通常意味着可以围绕包含数据的对象重新设计类。例如,静态成员函数可用作为类提供不同构造函数的一种方式。

于 2010-12-23T10:56:13.923 回答
2

静态类和函数只能用于中性函数和计算。只有当你只需要得到某事的答案时。

当您从字面上考虑您正在做什么和使用什么时,OOP 设计非常容易。例如,在您的情况下,您使用了“myExcelWriter”这个词,它是一个 excel 作家。所以,如果它是某物,它就是一个对象。这意味着它需要一个实例。

总是只描述你对自己所做的事情,如果你正在做的事情可以用名词来描述,那么它就是一个对象。如果它是形容词,它是属性或类成员。如果是动词,就是方法。如果它是副词,则它是传递给函数的属性或变量。

静态类是包含独立函数的工具,只对输入变量进行一些计算。(同样Math,它只计算 2 个数字)

类中的静态函数是用于该类对象的工具,这些对象不需要实例的状态即可工作。(喜欢Int.Parse()

OOP 更接近于真正的语言 IMO,这就是为什么以这种方式编程更直观的原因。

于 2010-12-24T16:40:31.993 回答
1

不必代表真实世界的事物。如果您使用它们使您的程序更容易理解,那么您做对了。

也就是说,一个类应该同时具有数据和方法。您的 excel 和文件类对我来说似乎不错,但要警惕只有方法而没有数据的类。

于 2010-12-23T10:48:17.900 回答