如果可以提高代码的清晰度,那么调用一个没有效果的函数是否更好?


60

我的程序(iOS应用程序)中有三个视图。它们中只有一个同时处于活动状态,因此我关闭了其中两个的可见性,并在用户按下按钮时切换可见性。视图被初始化为可见,因此我在显示主视图之前在代码中设置了可见性。

我可以

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

对于其中两个视图,但现在未解决第三个视图(应在应用程序开始时显示的视图)。我把

[view3 setAlpha:1.0f];

在前两个视图之后,因为我认为这很清楚,实际上存在三个视图,而不是看到代码时可​​能会想到的两个视图。其他程序员如何做到这一点?纯粹是偏爱还是有一些约定?

如果调用非常繁琐,那么最好不要在不需要时调用它,但是我想知道像我的示例这样的小事情。

Answers:


134

您有一个不变式:

只有一个视图(3个视图)处于活动状态(并且可见)。

然后,我建议您提供一个功能,以一次切换所有视图的活动和可见性:

[setActiveView viewID:2]

该功能将:

  • 检查视图是否已经处于活动状态,避免不必要的工作
  • 将视图设置为活动且可见
  • 将其他2个视图设置为不活动和不可见

原始调用有很多优点setVisibility

  • 友好的:不必要地调用它不会造成性能问题
  • 防御性的:它的单个参数很难修改,setVisibility但是很难记住值的范围是,0.0f - 1.0f并且必须将其设置为1.0f
  • 有弹性:下一个家伙不会偶然忘记其中一种观点
  • 适应性强:添加/删除视图不需要仔细检查所有应用程序代码来查找开关在哪里,只需更新一个功能(此功能)

理想情况下,为了帮助强制执行不变式,其他任何函数都不能弄乱此设置...


很棒的建议。我将使用当前示例进行此操作。但是,当不可能/不需要这种设计时该怎么办?还是您当场决定最好的处理方式是什么?
凯文

4
@凯文:这真的取决于。有时您可以通过遍历一个集合来解决问题,有时不能,但是关键原则是避免重复并使其易于保存不变式。为了使事情正常运行,需要记住的“手动”操作越多,则事情正常运行的机会就越少。我不想在这里含糊不清,但是有太多不同的情况,恐怕“通用”规则只会使您误入歧途。
Matthieu M.

23
“易于保存不变式”是一个值得记住的通用规则。
古斯多

1
@Tonny:我不知道是否鼓励使用全局变量是“正确的做法”,但是确实,如果您确切知道之前哪个是活动的,则只需要更新两个视图即可。另一种解决方案是让每个视图记住其可见性,并且setVisibility如果可见性已经是所要求的,则不执行任何操作,从而降低了责任。
Matthieu M.

1
@MatthieuM。我写得很仓促,但实际上也是我的意思。如果您知道以前的状态,则最多只需更新2个视图。如何记住那个状态是另一回事;-)。至于降低责任:如果没有提供视图类,则需要将类包装在另一个对象中,只是添加该属性。这是一个干净的解决方案,但可能有点过大。
托尼

12

替代主意:如果您的目标是防止由于人们忘记了三个视图而只对其中两个视图执行某项操作而导致错误发生,而这三个视图实际上应该与所有视图一起使用,那么请创建一个使它无法忘记的函数:

setViewVisibilities(0.0f, 0.0f, 1.0f)

现在您有了更强大的功能- 编译时的保证不会遗忘。如果忘记了一个参数,编译器会大吼大叫。这比注释或不必要的代码有用得多,因为它会创建一个严格的命名协议来强制执行您关心的属性。

对于view3不需要更改可见性的情况,您可以添加一些行为,在这些行为中传递诸如-1.0或的特殊值nil表示“根本不更改视图可见性”。这避免了不必要地设置可见性的问题。


9
如果OP最多可以容纳10个以上的视图,则每个视图的参数将变得无法维护。您关于编译时错误的观点是正确的,但是不幸的是,这是一个非常难以维护的解决方案。
克里斯·西里菲斯

3
@ChrisCirefice:如果视图数量增加,则可以创建某种“ ViewState”对象/类,以强制执行此不变式。然后使用它进行切换等。在如此众多的视图中,某种管理器对象可能还是有意义的。
sleske

8

我认为最好添加一条注释来解释该呼叫是不必要的(以及原因)。

(也许,不需要呼叫或您需要对此进行注释的事实可能是代码的味道)


1
@Niall如果可能的话,断言甚至比注释更好。
200_success 2015年

9
注释不是无法维护和无法读取代码的解决方案
dj18

2
@Kevin,或者您可以编写完全可读的代码而无需注释。
2015年

1
@@@@@@@@@@@@@@注释不只是解释代码的作用.......
凯文

2
@Kevin我想​​说永远不应该存在注释来解释代码的作用,而应该解释为什么这样做。在这种情况下,重构通常可以传达意图,而无需注释(听起来像扬的观点)。
RJFalconer

4

在这种情况下,@ Mattieu M.有正确的解决方案。

在更普遍的情况下,那里是没有类似的变换,你要问自己:是否有任何机会,未来的程序员可能会搞砸?

答案通常是。这意味着,是的,您应该添加呼叫。也许框架的某些将来版本以所有视图关闭而不是打开开始。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.