我有一个名为 SubmitRequest 的方法,它接受一个请求对象。它会填充一些其他值,例如DB生成的序列ID和提交日期。然后返回相同的对象。将它作为VOID方法保留是否更好?
Request request = JsonConvert.DeserializeObject<Request >(jsonFormData);
RequestManager frMan = new RequestManager();
//frMan.SubmitRequest updates the request object by updating some of its properties.
request = frMan.SubmitRequest(request);
return request;
在请求被修改时,void仍然有效:
frMan.SubmitRequest(request);
但这两种方式有什么优点或缺点吗?
答案 0 :(得分:6)
以这种方式写作是没有害处的。事实上,它是fluent interface的基础。
答案 1 :(得分:2)
我想说这里重要的是不要让你的代码混淆。
我会返回相同的对象......
public Request SubmitRequest(Request request)
或使用ref参数来表明您的意图...
public void SubmitRequest(ref Request request)
或者我猜你可以完全记录你的方法,这样就很明确了......
/// <summary>
/// This function will modify your request data!
/// </summary>
/// <param name="request">The request data to be submitted</param>
public void SubmitRequest(Request request)
答案 2 :(得分:1)
回到request
的作业表明SubmitRequest
可以返回不同的内容,比如说,它会返回一个与提交的请求有某种关联的新请求。
通常,您看到“返回对象”模式的情况是return this
以允许方法链接。
var result = request.SubmitTo(frMan).WaitForResult().GetResult();
答案 3 :(得分:1)
只要查看代码,我就会假设这就是发生的事情:
1)frMan提交传入的请求 2)frMan返回一个新请求
这不是您在问题文本中描述的步骤。
由于你正在操作Request对象,然后(可能是稍后用它做了什么),我会将请求对象传递给方法BY REFERENCE并返回void。这样我知道我只处理一个Request对象,而且它是同一个。另外,我将提供“SubmitRequest”,其中包含一个更逻辑定义的名称,该名称描述了您对请求对象所做的操作。
答案 4 :(得分:1)
我认为这很像构建器模式的一部分(例如,请参阅StringBuilder.Append
)。但是:
答案 5 :(得分:0)
如果你不需要对修改过的对象做任何事情,那么我就不会在方法调用中返回它。
在Command / Query范例中考虑这一点,SubmitRequest
看起来更像是一个命令,而不是一个查询,在这种情况下,返回一个值是不合理的。
答案 6 :(得分:0)
最好将其作为void方法。
当某些内容发生变化时,返回一个对象的想法是如此,但如果没有任何变化。然后数据没有被操纵,因此没有使用返回
的意义例如:
Object bar = new Object();
// this doesn't do anything. (it wont change the local scope of the object value)
foo(bar); // can be same as void.
//changes the value, but the method returns the same object... whats the point?
bar = foo(bar);
public Object foo(object bar)
{
return bar;
}
虽然从理论上讲,它不会造成任何伤害。
答案 7 :(得分:0)
该方法的调用者无法保证您返回的实例与它们提供的实例相同。当您返回void
时,您明确指出调用者可以确定他们在调用完成后正在处理同一个实例。
答案 8 :(得分:0)
以下列方式返回对象:
private SomeObject DoSomeStuff(SomeObject item)
{
// perform work on item and change values
return item;
}
而不是
private SomeObject DoSomeStuff( ref SomeObject item)
{
//perform work on item
}
根据我的理解,您将会产生轻微的性能损失,因为将创建并返回类型SomeObject
的新对象,让垃圾收集器整理原始对象。
如前所述,如果您要执行任何实例检查,那么这也会失败。
答案 9 :(得分:0)
如果要点
frMan.SubmitRequest(request);
是更新Request参数,那么这不应该是Request对象的属性而不是RequesManager的属性吗?像
这样的东西request.Submit();