(我可能会过度思考一个非常简单的事情,但不过。)
我有一个GUI控件,其公共属性包含它的当前值。可以通过各种方式从内部更改值 - 控件非常复杂,并且还具有不同行为的子项。在每一次这样的改变中,必须发出声音并且应该发射一个事件。
另一方面,它可以通过逻辑元件从外部改变;在这种情况下,应更新所有GUI组件,但不应播放声音。
所以,基本上,我需要使用两个setter:一个用于内部使用,一个用于外部。实现这一点的最佳方法是什么,以便代码可读,未来的维护者不会意外地混淆这两者? (显然,当他们应该使用公共电视时,他们将无法使用私人制定者,但反过来可能会让人感到困惑。)
(我目前正在使用C#,但我不认为这个问题有任何特定于语言的内容,因此我省略了该标记。)
答案 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。此外,您没有条件来检查哪个更清晰。