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