我已经完成了图像加载/缓存系统的许多试错版本。作为Delphi,我对面向对象编程一直很熟悉。但自从我开始实现一些多线程以来,我一直在想,也许这个系统应该在过程的基础上工作。
原因是这些进程会被踢到线程池中,进行图像的脏加载/保存,并释放自己。当我可以只使用过程/函数、记录、事件和图形时,我一直在尝试将这些线程化进程封装在对象中。当它都在一个单元中时,不需要将其全部封装在一个类中。。。正确的
现在我问的一个主要原因是,这个系统是在单元的底部初始化的。当使用OmniThreadLibrary(OTL)时,它已经有了自己的初始化线程池,我甚至不需要初始化我的线程池。
那么,哪种方法更适合这个系统——封装在对象中,或者只是单元中的函数,为什么?有没有多线程的例子,不在对象内部包装任何东西,而是在单元中包装?
如果你有一个单身汉,那么这归结为个人偏好的问题。以下是我的一些想法:
- 如果您的代码库的其余部分使用OOP,那么使用过程可能会使此代码看起来和感觉都很奇怪
- 如果使用OOP,则可以使用属性、默认属性和数组属性。这样可以使您的界面更加可用
- 将您的功能放入一个类中会为您提供额外的名称空间级别。你可能会感激,也可能不会感激
- 如果您需要在全局范围内维护大量状态,那么您可能会将其打包为一个记录。您将拥有对这个全局记录实例进行操作的函数。在这一点上,用对象语法编写的代码读起来会更好
归根结底,这并不重要,你必须选择最适合你项目的。
OOP并不意味着您需要为所有内容创建新对象。您也可以简单地从现有对象继承。(就像OTL的任何线程对象)
无论如何,我并不热衷于在任何地方引入OO,但在您的文本中,我看不出为什么需要程序化。
无论如何,这都不是一个是/否的决定。
我倾向于使用不属于类的函数和过程,当它们所做的工作与任何状态无关时,以及当它们打算单独使用和重用时,例如在它们自己的实用程序单元中的实用程序字符串函数。您可能会发现您需要"图像实用程序函数",并且它们不需要在类中。
如果你的函数只在后台线程的上下文中运行,那么它可能属于TThread子代,如果它不被前台调用,那么它可以是私有的,这使得OOP及其范围隐藏功能非常适合线程编程。
我的经验法则是:如果你不能以某种真正的方式将其作为一个独立的函数/过程,那么就不要回到非OOP过程。
有些人非常喜欢OOP,所以他们避免使用非OOP函数和过程,并喜欢为所有内容都使用类包装器。我称之为"Java代码气味"。但是没有理由避免OOP。这只是一个工具。在有意义的地方使用它。