“通过引用”是糟糕的设计吗?
一般不会。您需要了解您的特定场景并问自己一个函数的作用。而且您需要正确定义您的编码风格,特别是如果您正在为他人编码(分发库)。
当您的函数返回多个输出时,通常会通过引用传递。ResultContainer
返回一个包含函数返回的所有信息的对象通常是个好主意。以以下 C# 示例为例:
bool isTokenValid(string token, out string username)
VS
AuthenticationResult isTokenValid(string token)
class AuthenticationResult {
public bool AuthenticationResult;
public string Username;
}
不同之处在于带有引用(在本例中为out
put)参数的方法清楚地强调了它只能用于验证令牌或可选地用于提取用户信息。因此,即使您有义务传递一个参数,如果您不需要它,您也可能会丢弃它。第二个示例代码更冗长。
当然如果你有这样的方法,第二种设计是更可取的
bool doSomething(object a, ref object b, ref object c, ref object d, ... ref object z);
因为您会将它们全部包装到一个容器中。
现在让我澄清一下:在 Java 和 C# 中,非原始类型始终作为克隆引用传递。这意味着object
s 不会自己克隆,而只会将对它们的引用克隆到堆栈中,然后您不能指望在返回后指向完全不同的对象。相反,您总是希望该方法修改对象的状态。否则你只是clone()
对象,瞧。
所以这里有诀窍:MutableInteger
或者更好的Holder
模式,是通过引用传递原始值的解决方案。
idl2java
当您的 IDL 具有引用参数时,CORBA 编译器当前使用它。
在您的具体情况下,我无法就设计的好坏回答您,因为您展示的方法太通用了。所以想想吧。就像输入一样,如果我对多媒体信息应用某种后处理功能,甚至像加密一样,我会使用引用传递。对我来说,以下看起来不错的设计
encrypt(x);
VS
x = encrypt(x);