基于矩阵行和列索引调用唯一函数

时间:2011-12-28 08:07:57

标签: algorithm perl

基于矩阵行和列索引调用唯一函数

有三种观点

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个这样的观点。

2 个答案:

答案 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(...)