【问题标题】:internal relationship between properties属性之间的内部关系
【发布时间】:2011-07-21 17:18:30
【问题描述】:

我的问题涉及属性之间的关系和级联效应,我想知道这方面的最佳做法是什么。

我有一个包含不同长度数字列表的类。编辑列表时,有时用户更喜欢设置 TargetSum,以便程序强制列表始终添加到此总和。我通过以编程方式设置列表中的最后一个元素来实现这一点,使得列表总和 = TargetSum。例如,如果用户选择 UseTargetSum,然后设置 TargetSum = 10,然后创建一个长度为 4 的列表,并为前 3 个元素输入 1、4、2,则最终元素以编程方式固定为 3。用户不能自己更改最终元素。

我通过处理所有必要的事件在后台执行此操作,例如列表元素值更改、列表长度更改和 UseTargetSum 选项更改。对于每个事件触发器,它都会重新计算最后一个元素的值。

它可以工作,但是在加载保存的数据时出现了错误。如果通过顺序添加元素来加载列表,则处理程序会修改每个条目。例如,当输入第一个值 1 时,处理程序会说“刚刚添加了一个值,总和应该是 10,当前只有一个元素,所以它需要是 10”。所以第一个元素在幕后变成了 10。当下一次添加第二个元素时,处理程序会说“刚刚添加了一个值 4,但第一个元素已经是 10,所以它应该为零。”在加载结束时,最终列表读取 10,0,0,0 而不是 1,4,2,3。

我知道可以重新安排加载过程,以便获得正确的列表。例如,在加载所有数据之前,我可以避免启用 TargetSum 事件处理程序。该列表将首先创建为 1,4,2,3,然后处理程序不会更改任何内容。

但是这种经历让我怀疑我是否正在为其他偷偷摸摸的副作用打开大门。看来您应该能够加载数据而不必过多担心隐式排序。在类属性之间产生“级联”效应似乎也很不寻常。有没有更被接受的方法?

我正在考虑的另一种选择是仅在 UI 表单中强制执行 TargetSum。即,当您知道是用户进行更改时,则强制执行 TargetSum,否则不理会核心类逻辑。这样数据库负载等就不会受到影响。但我想没有普遍执法的缺点是通过一些不可预见的复杂性打开了错误金额的大门。

【问题讨论】:

  • 我尝试让 Set Properties 调用其他 Set Properties,但它甚至在我的应用程序完成加载之前导致了无限循环。我称这个错误为“爱尔兰塞特犬”(犬种,不是公民),因为他们很友好但不是很聪明。必须改为在 Set 属性中使用直接实例变量访问。

标签: c# vb.net design-patterns class-design


【解决方案1】:

首先,我将 TargetSum 设为类中的整数属性。接下来,您需要扩展管理列表的功能,以便在对该列表中的值进行任何操作之前加载所有值。

【讨论】:

  • 我可以尝试一下,虽然我认为我正在使用没有 AddRange 的绑定列表,但这个障碍可能很容易克服。我知道存在可能的解决方案;我只是想确保这种方法是洁净和可维护的。下载时必须使用其他方法设置某些属性对我来说似乎很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2019-05-31
  • 2012-09-03
  • 2015-05-08
相关资源
最近更新 更多