1

(我可能想多了一件非常简单的事情,但尽管如此。)

我有一个带有公共属性的 GUI 控件,其中包含它的当前值。可以通过多种方式从内部更改该值 - 控件非常复杂,并且具有不同行为的子级。在每一次这样的变化中,都必须播放一个声音并且应该触发一个事件。

另一方面,它可以通过逻辑元件从外部改变;在这种情况下,应更新所有 GUI 组件,但不应播放声音。

所以,本质上,我需要使用两个 setter:一个用于内部,一个用于外部。实现这一点的最佳方法是什么,以便代码可读并且未来的维护者不会意外地将两者混淆?(显然,当他们应该使用 public 时,他们将无法使用 private setter,但反过来可能会令人困惑)。

(我目前正在使用 C#,但我认为这个问题没有任何特定于语言的内容,所以我省略了标签。)

4

2 回答 2

1

我假设您使用 MVVM 或 MVC 模型;这是拆分 GUI 和模型(逻辑元素)的最佳方式。

最好的方法是创建一个供外部使用的公共方法,它调用一个受保护的方法供内部使用。所有逻辑都在受保护的方法内。然而,通过传递一个布尔值来决定是否播放声音,例如:

public void Set(...)
{
    Set(..., False); // False -> No play
}

protected or private Set(..., play = True) // Default: play sound
{
    if (play)
    {
        // Play sound
    }

    // Normal set behavior
}

当然,它不会阻止从内部调用公共集......您可以将公共集更改为更具体的名称,如 SetWithoutSound,或者如果您不希望直接指定此“功能”,请在公共 Set 中明确注释私有 Set 应该用于内部使用。

于 2013-10-09T08:18:07.603 回答
0

我更喜欢有一个单一的setter方法和一个做某事(触发通知)并通过setter改变值的方法:

public void set(Type value)
{
    _member = value;
}
public/protected/private void changeAndNotify(Type value)
{
    set(value);
    playSound();
}

我更喜欢它,因为您有一个复杂的方法,它使用 setter 而不是使用复杂方法的 setter,这是一种更好的设计恕我直言。另外你没有条件检查哪个更清楚。

于 2013-10-09T14:38:22.450 回答