Вызов уникальной функции на основе строки матрицы и индекса col - PullRequest
2 голосов
/ 28 декабря 2011

Вызов уникальной функции на основе индекса строки и столбца матрицы

Существует три вида

ViewA
ViewB
ViewC

, которые пользователь может переключить с ViewX на ViewY.Существует другой способ переключения с X на Y. Например, переключение с A на B осуществляется одним способом, а с B на A - другим способом.

Я пытаюсь написать для него универсальную функцию,Как я понимаю, эти три вида составляют в общей сложности 6 комбинаций (AB, AC, BA, BC, CA, CB)

           ViewA    ViewB   ViewC
    ViewA    X         2        3
    ViewB    4         X        6
    ViewC    7         8        X

Что я думаю, что я зарегистрирую определенную функцию для данного хода.Например, если перейти от ViewA к ViewB, я зарегистрирую функцию SwitchViewA_to_viewB() во втором индексе.

Пожалуйста, дайте мне знать, если у нас может быть какой-то другой лучший подход для достижения этого.Это всего лишь пример с тремя взглядами.В моем случае у меня есть почти 10 таких просмотров.

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Она называется таблицей диспетчеризации.

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;

Обратите внимание, что вы можете передавать аргументы функции, передавая их в скобках (как обычно).


Если у вас есть 10 представлений, это значит, что у вас есть 90 функций.

Вы уверены, что именно так вы хотите подойти к этой проблеме?Возможно, вам следует рассмотреть подход, который не требует знания предыдущего представления.Возможно, вы можете иметь две функции для просмотра.Один из них вызывается для активации представления, а другой - для его деактивации.

Тогда вам нужно всего лишь 20 функций вместо 90. А для добавления одиннадцатого представления потребуется только 2 функции вместо 20.

1 голос
/ 28 декабря 2011

В Java вы можете создавать «функциональные» объекты, хранить их в коллекции (например, карту карт), получать соответствующую для вашей комбинации комбинацию и выполнять.

Интерфейс функций, актуальные функцииреализовать это:

interface SwitchViewFunction() {
  void switchView(View from, View to);
}

С вашей точки зрения код переключения:

Map<View,Map<View,SwitchViewFunction>> map = ...;

map.get(from).get(to).switchView(from, to); 

Обратите внимание, что в приведенном выше коде нет проверок (например, для нуля и т. д.), они оставляютсяупражнения для вас.

Также обратите внимание, что для использования View в качестве ключа необходимо иметь разумные реализации hashCode() и equals(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...