![]() |
1
8
没有最佳实践。 不过,您应该做的首要事情是确保在任何给定的时间都清楚谁负责销毁对象,即使在发生异常时也是如此。 函数创建一个新实例并返回它没有错。这样的函数是一个函数 factory . 您可以像对待类的构造函数一样对待它,因此您应该确保它的行为类似于构造函数:要么返回有效对象,要么抛出异常。它从不返回空引用。
从函数到调用方,但前提是它能够完全执行。如果由于异常而必须提前离开,则会释放对象,因为调用方无法释放对象本身。(由于异常而终止的函数没有返回值。)调用者将这样使用它:
如果在中有异常
不 释放对象。调用方不会向其调用的函数授予所有权责任,特别是当它计划在函数返回后使用对象时。 |
![]() |
2
4
假设您的方法用解析文件的结果填充TStringList。 是让该函数创建TStringList,还是创建它并作为引用传递?
|
![]() |
3
3
让调用者创建对象并将其作为参数传递是一种常见的Delphi习惯用法。请注意,您不必声明它
这避免了关于谁必须释放对象的混淆。请注意,如果您有一系列方法调用,那么跟踪需要释放的对象很快就会变得非常复杂。
如果您希望您的方法创建对象,我会在函数名中显式显示它,比如
|
![]() |
4
2
所以我的函数通常的签名是
或
|
![]() |
5
1
但是,只有在调用者知道要返回的项的确切类型而不是超类型时,这才可能实现。例如:
在这种情况下,我发现在我调用的工厂函数的名称中包含单词“Create”或其他指示符是很有帮助的。 |
![]() |
6
-3
我经常使用这个结构
这样,我既可以将其用作带有传入引用的过程,也可以将其用作创建实例本身的函数。 |