2011-08-24 81 views
3

我有一个类StreamCopyOperation它为我提供了诸如复制操作的平均速度和其他信息。我的所有参数是否应该在构造函数中?

现在我有一个构造函数,它看起来像

​​

和方法

public void CopyStream() 
{ 
    //Copy the streams, send the progress updates, etc... 
} 

现在我不知道是不是所有的参数应该在构造函数或流应该传递在这样的方法:

public void CopyStream(Stream source, Stream target) 
{ 
    //Copy the streams, send the progress updates, etc... 
} 

和构造函数只获取缓冲区大小和更新间隔已过。 或者,也许一切都应该在CopyStream方法。

有没有像最佳实践或这只是一个设计决定?

+0

也许像构造函数需要在源和CopyStream需要在目的地? –

+0

我不会有一个名为StreamCopyOperation的类,名字本身告诉你,这应该是一个方法,而不是一个类。你可以有一个实用程序类,它具有将一个流复制到另一个流的方法。 – Icarus

回答

4

我认为这是一个基于设计决定后,你如何期望类将被使用。

如果它是一个使用一次类型的类的话,也许所有的参数应该被传递到构造函数,然后你设置任何其他属性,然后调用CopyStream(不带参数)。

但是,如果你指望流参数改变,那么不把它们传递到构造函数和有值传送到CopyStream方法。

最后,如果它真的是更多的一次使用类的类,那么也许你应该认为这个类是一个static类,而CopyStream是静态的 - 为你节省了一行代码并使得类更多地是一个类助手类的类。

希望这会有所帮助!

+0

同意这一切都取决于操作对象的使用和生命周期。说得好! – Reddog

+0

@Reddog - 谢谢! –

0

如果您将在类范围内使用那些Stream(例如其他方法),最好将它们作为构造函数参数传递并将它们分配给在类的作用域中声明的变量,否则无需将它们传递给构造函数并推荐使用第二个CopyStream方法。

希望得到这个帮助。

0

我几乎认为它是一个设计决定。

如果CopyStreamOperator的单个实例没有被重用于多个源和/或目标,我可能会在构造函数中传递所有必需的值以创建一个知道它需要知道的所有对象的对象。然后可以验证输入值以确保操作员不会处于无效状态。

然后将无参数CopyStream()方法重命名为Run()Execute()

1

这实际上取决于您如何使用CopyStream。它会被频繁使用吗?这会建议使用CopyStream方法的方法参数。如果它被设计为一次性调用,那么在启动类型的新实例时使用构造函数参数。

0

我会考虑使用默认值,不是那么必要的细节,并提供属性的类的那些细节设置或获取它们的值:

private const int DEF_BUFFER = 100; 
private const int DEF_INTERVAL = 10; 

public StreamCopyOperation(Stream source, Stream target) 
{ 
    //Initialize values 
    this.BufferSize = DEF_BUFFER; 
    this.UpdateInterval = DEF_INTERVAL; 
} 

public int BufferSize { get; set;} // or use a private member inside, if needed 

public int UpdateInterval { get; set;} // or use a private member inside, if needed 
2

在我看来,这将取决于StreamCopyOperation对象的生命周期...

特别地,由于流对象通常是(总是?)一次性并绑定到一些系统资源,我想保持他们尽可能少的时间,所以我会考虑采取参数化的方法。

如果StreamCopyOperation仅与流自身的生命周期绑定,那么第一种方法是适当的。但是如果你想让操作对象保持更长的时间(例如,因为它连接到UI),那么我将使用参数化函数的方法,并进入更多的静态“辅助类”。

+0

+1,以考虑流是IDisposable。没有考虑到这一点。 –

0

我的设计指南是只要求用户提供构造函数构造实例所必需的东西。也许用户不需要进度更新。也许用户在构建实例和连接进度事件时还没有两个流。

当然,您可以提供方便的构造函数重载(或可选参数),以便在更多情况下使用您的类更容易(但这些可以推迟到“构造方法”,例如TimeSpan.FromMinutes(5))。但请记住,构造函数旨在简单地创建并初始化您的类型及其所有子系统,以使其处于可用的一致状态,随时可以执行用户的出价。

当然,异常是不可变的类型,您必须在构造过程中指定所有参数。通常不可变类型相当简单,所以这不是问题。如果它们更复杂,并且构造函数参数的数量增长失控,则可以使用可变的“初始化符指示符”对象,该对象包含如何初始化不可变对象的所有不同配置,但更容易使用,因为它具有可变属性。

相关问题