当一些属性应该从课堂内部以一种方式改变,而另一种方式从外部改变时,情况有什么好的模式?

时间:2013-10-09 08:10:18

标签: oop design-patterns

(我可能会过度思考一个非常简单的事情,但不过。)

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

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

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

(我目前正在使用C#,但我不认为这个问题有任何特定于语言的内容,因此我省略了该标记。)

2 个答案:

答案 0 :(得分: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,或者如果您不希望指定此“功能”直接,在公共场合做出明确的评论。私人套装应该用于内部使用。

答案 1 :(得分:0)

我更喜欢使用单个setter方法和执行某些操作的方法(触发通知)并通过setter更改值:

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

我更喜欢它,因为你有一个复杂的方法,它使用setter而不是setter,它使用复杂的方法,这是一个更好的设计imho。此外,您没有条件来检查哪个更清晰。