Черепичные окна с помощью Perl-скрипта - плохие идеи для вложенных массивов? - PullRequest
0 голосов
/ 21 марта 2011

Я пишу скрипт, который бы динамически отображал окна X11 в Perl.До сих пор я собираюсь использовать массив массивов, содержащих координаты окон, размеры и идентификаторы для хранения состояния мозаичных окон во время сеанса.Это хорошая идея или я должен организовать эту информацию любым другим способом?

Ответы [ 4 ]

1 голос
/ 21 марта 2011

Соответствующая структура зависит от того, как вы будете обращаться к структурам данных и обрабатывать их. Выбор правильной структуры является большой частью решения программы. Выберите неправильную структуру, и простая проблема может стать сложной. Структура настолько важна, что иногда вам нужно преобразовать существующую структуру в форму, более подходящую для той работы, которую вам нужно выполнить.

Вот два основных правила, которые помогут вам выбрать структурные элементы:

  1. Если вы хотите сохранить порядок, используйте массив.
  2. Если вам нужно много раз искать конкретные имена, идентификаторы или другую информацию, используйте хэш.

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

Если вы хотите выполнить несколько действий, таких как поиск окон по имени приложения или другие вещи, которые требуют много разных поисков, используйте хеш.

Если вам нужно выполнить много поисков по нескольким ключам, а также поддерживать порядок, вы можете создать несколько структур данных, которые указывают на одни и те же базовые ссылки.

my @foo = (
    { name => 'a', id => '321' },
    { name => 'b', id => '123' },
);

my %foo_by_name = map { $_{name} => $_ } @foo;
my %foo_by_id   = map { $_{id  } => $_ } @foo;

Если вам нужно манипулировать своей сложной коллекцией (добавлять и удалять элементы), рассмотрите возможность оборачивания различных структур в объект, что обеспечит согласованное управление всеми базовыми структурами.

0 голосов
/ 21 марта 2011

Принцип, которому я следую, таков: если важно поддерживать порядок элементов, используйте массив; в противном случае используйте хеш.

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

0 голосов
/ 21 марта 2011

Ну, стандартным представлением составных структур в Perl является (благословенный) хеш. Если у вас нет серьезных проблем с производительностью, было бы неплохо сгруппировать данные в хэши.

OTOH, массивы хороши для единообразных данных. Но когда у вас есть данные с уникальными идентификаторами (окна X-окна действительно имеют идентификаторы, верно?), Хеш снова становится более естественной структурой. Так вы просто говорите

do_something($windows->{$id}->{x});

а не

foreach (@$windows) { 
    if ($_->{id} == $id ) { 
        do_something($_->{x});
    }; 
}
0 голосов
/ 21 марта 2011

Массивы массивов, или массивов или хэшей, или хэшей хэшей, или хэшей массивов хэшей хэшей массивов замечательны в perl, и одна из причин, по которым обработка данных в perl настолько проста. Вам не нужно их бояться!

...