基于矩阵行和列索引调用唯一函数
有三种观点
ViewA
ViewB
ViewC
用户可以从ViewX
切换到ViewY
。有一种不同的方式可以从X和Y切换。例如从A切换到B是通过一种方式,而从B切换到A将是通过某种不同的方式。
我正在尝试为它编写泛型函数。据我所知,这三种观点共有6种组合(A-B,A-C,B-A,B-C,C-A,C-B)
ViewA ViewB ViewC
ViewA X 2 3
ViewB 4 X 6
ViewC 7 8 X
我在想,我会将特定功能注册到给定的动作。例如如果移动是从ViewA到ViewB,那么我将函数SwitchViewA_to_viewB()
注册到第二个索引。
请告诉我们是否可以采取其他更好的方法来实现它。这只是三个视图的一个例子。在我的实际案例中,我有近10个这样的观点。
答案 0 :(得分:3)
它被称为调度表。
my %switchers = (
ViewA => { ViewB => \&SwitchViewA_to_viewB,
ViewC => \&SwitchViewA_to_viewC, },
ViewB => { ViewA => \&SwitchViewB_to_viewA,
ViewC => \&SwitchViewB_to_viewC, },
ViewC => { ViewA => \&SwitchViewC_to_viewA,
ViewB => \&SwitchViewC_to_viewB, },
);
$switchers{$from}{$to}->()
if $from ne $to;
或
my %switchers = (
"ViewA-ViewB" => \&SwitchViewA_to_viewB,
"ViewA-ViewC" => \&SwitchViewA_to_viewC,
"ViewB-ViewA" => \&SwitchViewB_to_viewA,
"ViewB-ViewC" => \&SwitchViewB_to_viewC,
"ViewC-ViewA" => \&SwitchViewC_to_viewA,
"ViewC-ViewB" => \&SwitchViewC_to_viewB,
);
$switchers{"$from-$to"}->()
if $from ne $to;
请注意,您可以通过在parens中传递参数来传递函数(像往常一样)。
如果您有10个视图,则表示您有90个功能。
你确定这是你想要解决这个问题的方法吗?您应该考虑一种不需要知道先前视图的方法。也许每个视图可以有两个函数。一个叫做激活视图,另一个叫停用它。
然后你只需要20个函数而不是90个。添加第11个视图只需要编写2个函数而不是20个。
答案 1 :(得分:1)
在Java中,你可以创建“功能”对象,将它们存储在一个集合中(例如地图的地图),为你拥有的组合获得相应的一个并执行。
功能界面,实际功能实现:
interface SwitchViewFunction() {
void switchView(View from, View to);
}
在您的视图中切换代码:
Map<View,Map<View,SwitchViewFunction>> map = ...;
map.get(from).get(to).switchView(from, to);
请注意,在上面的代码中没有任何检查(例如,对于null等),这些都留给您作为例外。
另请注意,要使用View
作为关键字,它应该合理实施hashCode()
和equals(...)
。