考虑具有许多产品的生产计划应用程序。每个产品都有一个InventoryControlType上的InventoryControl对象列表。根据我们为生产计划运行的算法,我们需要访问给定产品的不同类型的InventoryControl对象。这很好用。但是,今天我需要在InventoryControl中引入一个包含InventoryControlType的字段,因为我们的算法深入了解InventoryControlType。
但是,我觉得我做错了,因为看起来我正在重复数据。
这个设计看起来不错吗?有任何改进的想法吗?
class Product{
Dictionary<InventoryControlType, InventoryControl> InventoryControls;
GetInventoryControl(InventoryControlType type){
return InventoryControls[type];
}
}
class InventoryControl{
InventoryControlType controlType;
float limit;
float cost;
...
CalculateCost(){...}
GetConstraint(){...}
}
答案 0 :(得分:6)
我觉得你很好。使用对象的唯一属性作为关键字是完全正常的(至少在我的经验中) - 无论是Dictionary
,DataTable
,还是你有什么。
例如,在我自己的工作中,我们的主要项目有一个名为Product
的类,其中包含一个名为Symbol
的属性,并且应用程序维护一个名为Dictionary
的{{1}} Products
{1}}对象的Product
属性作为其关键字。
以这种方式思考:如果你有一个带有两个表的数据库,而一个表通过键引用另一个表中的行,那么你可能觉得你在复制数据是因为你有相同的数字(钥匙)在两个地方。但这不是重复;这是一个参考。这同样适用于您的场景。
答案 1 :(得分:2)
我没有看到任何内在错误。它复制了一条信息,但情况确实需要它。您可以使用普通集合而不是字典 - 但是因为您的主要目标是根据其InventoryControlType找到一条信息,使用此实现,字典似乎最正确。
答案 2 :(得分:2)
我认为Dictionary<TKey, TValue>
用例绝对没问题。
很多时候,Dictionary对象总是会从值对象中获得某种冗余信息,其中最常见的是ID,例如Dictionary<int, SomeObject>
其中int将是从SomeObject.Id获取的值 - 它在这方面是有意义的,并且它与您的用例完全相同。
答案 3 :(得分:2)
这实际上取决于字典应该有多大,因为对于非常大量的数据,我认为使用密钥在字典上查找可能会更快。但是,如果您没有大量数据,则可以使用Linq和通用列表。例如:
class Product{
List<InventoryControl> InventoryControls;
GetInventoryControl(InventoryControlType type){
return InventoryControls.First(x => x.ControlType == type);
}
我建议运行一些单元测试基准来查看是否需要字典。