使用ref改变部分不可变类的方法设计

时间:2011-08-10 02:04:30

标签: c# .net design-patterns architecture

在我的项目中,我有一个标题类,表示系统内部信息的全局唯一键,例如它属于谁,它存在的时间等等。在同一个标​​题类中我也有字段用于特定于给定数据实例的信息,例如谁创建了此版本的信息,何时创建,是否需要将新数据保存到数据库等等。

以下是将一些信息存入数据传输类并将其查询回来的示例。

var header = new IntvlDataHeader(
       datapoint: Guid.NewGuid(),
       element: Guid.NewGuid(),
       intervalUtc: DateTime.Now.Date);

package.StockData_Decimal(header, 5m);

decimal cloneData;
package.TryGetData_Decimal(ref header, out cloneData);

// header now refers to a different object, that could have different flags/information

注意我是如何使TryGetData_Decimal通过引用传递头变量的。 IntvlDataHeader是一个类,如果在TryGetData中找到数据,则引用将更改为指向具有特定实例信息的IntvlDataHeader的新实例,并具有相同的唯一密钥信息。

将一个键与实例特定信息组合在一起并使用ref参数作为一个坏的设计进出?分裂另一个类的努力是否会有两个参数和没有参考参数更好或避免任何潜在的问题?

方法的签名是public bool TryGetData_Decimal(ref IntvlDataHeader header, out decimal data)

1 个答案:

答案 0 :(得分:2)

我认为,如果您传入的TryGetData_Decimal参数将在方法退出时指向新实例,则ref的命名会产生误导。对我来说,TryGetData_Decimal听起来像是许多值类型的TryParse方法的变体(其中包含解析值的out参数 - 类似于cloneData参数)。< / p>

我想我不确定为什么头对象必须指向一个新实例,所以我不确定我是否可以推荐一个设计。如果这就是你需要做的,我认为如果你的TryGetData_XXX方法有这样的签名可能会更具可读性:

IntvlDataHeader ExtractValueAndGetNewInstance_Decimal(IntvlDataHeader header, out decimal cloneData)

传入标头,但方法退出时不会更改。该方法返回新实例,如果需要,可以使用它。我不会更改cloneData - 我认为只要不过度使用out参数就可以了。

我也尝试将方法的名称更改为更有意义的内容。

我希望这会有所帮助。