Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 什么';当某些属性应该从类内部以一种方式更改,而从外部以另一种方式更改时,这是一种很好的模式吗?_Oop_Design Patterns - Fatal编程技术网

Oop 什么';当某些属性应该从类内部以一种方式更改,而从外部以另一种方式更改时,这是一种很好的模式吗?

Oop 什么';当某些属性应该从类内部以一种方式更改,而从外部以另一种方式更改时,这是一种很好的模式吗?,oop,design-patterns,Oop,Design Patterns,(我可能对一件相当简单的事情想得太多了,但无论如何。) 我有一个GUI控件,它的公共属性包含它的当前值。该值可以通过多种方式从内部进行更改-控件非常复杂,并且具有不同行为的子控件。在每一次这样的变化中,都必须播放一个声音,并启动一个事件 另一方面,它可以通过逻辑元件从外部改变;在这种情况下,应更新所有GUI组件,但不应播放声音 所以,本质上,我需要使用两个setter:一个用于内部,一个用于外部。实现这一点的最佳方法是什么,这样代码才具有可读性,未来的维护人员不会意外地混淆这两者?(显然,当他们

(我可能对一件相当简单的事情想得太多了,但无论如何。)

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

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

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


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

我假设您使用的是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,或者如果您不希望如此直接地指定此“功能”,请在公共集中明确说明私有集应用于内部使用。

我假设您使用的是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,或者如果您不希望如此直接地指定此“功能”,请在公共集中明确说明私有集应用于内部使用。

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

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

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

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

public void set(Type value)
{
    _member = value;
}
public/protected/private void changeAndNotify(Type value)
{
    set(value);
    playSound();
}
我更喜欢它,因为您有一个使用setter的复杂方法,而不是使用复杂方法的setter,这是一个更好的设计imho。此外,你没有条件检查,这使它更清楚