За последние 24 часа нас посетили 16677 программистов и 1679 роботов. Сейчас ищут 879 программистов ...

Оцените тестовое задание при устройстве на работу

Тема в разделе "Прочие вопросы по PHP", создана пользователем cherkashin-vova, 30 янв 2009.

  1. cherkashin-vova

    cherkashin-vova Активный пользователь

    С нами с:
    30 янв 2009
    Сообщения:
    4
    Симпатии:
    0
    Всем добрый вечер! Кризис коснулся всех, меняю работу, прохожу собеседование. 3 задания выполнил без труда. Последнее задание показываю на суд общественности:
    ---------------
    Реализовать класс Collection, который бы хранил в виде ассоциативного массива набор данных. Предполагается, что у данного класса есть всего два метода set(name, value) и get(name). Также, помимо этого, нужно реализовать класс CollectionIterator и интерфейс Iterator в соответствии с паттерном Iterator. После создания вышеперечисленного нужно сделать какой-нибудь пример, показывающий работу данных классов.
    ---------------
    С паттерном итератор в индексированном массиве все абсолютно понятно, но в ассоциативном массиве, я даже представить не могу его реализацию. Ведь в нем данные не упорядочены и доступ к ним осуществляются по ключам. В данном задание как мне кажется, создается объект типа Collection, вносим туда несколько значений с определенными ключами. Каким образом класс CollectionIterator может узнать о том, под какими ключами хранятся объекты, не говоря уже об их последовательности. Что кто по этому поводу думает, может кто то знает как это возможно сделать?
     
  2. cherkashin-vova

    cherkashin-vova Активный пользователь

    С нами с:
    30 янв 2009
    Сообщения:
    4
    Симпатии:
    0
    флоппик я думаю это не совсем то, мне нужно написать свою реализацию итератора для аасоциативного массива. А в примере по ссылке используется функциия getIterator().
     
  3. http://www.php.net/~helly/php/ext/spl/

    ну так там видно, как он работает. Почитай. Тебе нужно, что бы он интерфейс Seekable реализовал. Это обычно реализуется заведением внутренним указателем на текущую позицию в коллекции, и методы для его перемещения.
     
  4. cherkashin-vova

    cherkashin-vova Активный пользователь

    С нами с:
    30 янв 2009
    Сообщения:
    4
    Симпатии:
    0
    Маленькое дополнение:
    Дело в том, что в данном задание как я понял, массив хранится в классе Collection, с полем доступа private. У этого класса два метода set(name, value) и get(name), по условию. Т.е. из класса CollectionIterator я не могу обратится к массиву, я могу лишь получить значение по определенному ключу, о которых класс CollectionIterator не имеет ни какого представления.
     
  5. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    удалил. сорри, не так понял задание
     
  6. cherkashin-vova

    cherkashin-vova Активный пользователь

    С нами с:
    30 янв 2009
    Сообщения:
    4
    Симпатии:
    0
    Как мне кажется никаие стандартные интерфейсы мне не помогут, доступ к массиву я не имею, могу лишь только обратится по двум методам, get и set.
    Вообщем походу задание я провалю или его реализация с данными условиями невозможна.

    Вот код класса Collection:
    PHP:
    1.  
    2. class Collection
    3.     {        
    4.         private $list;        
    5.         function __construct() {
    6.             $this->list = array();
    7.         }
    8.          
    9.         function set($name,$value){
    10.             $this->list[$name]=$value;
    11.         }    
    12.              
    13.         function get($name)        {
    14.             return $this->list[$name];
    15.         }                        
    16.     }
    17.  
     
  7. cherkashin-vova,
    Ну так подумай о том, что бы итератор унаследовать от массива - ты и получишь доступ к его данным.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    OMG, доступ к массиву через класс!!
     
  9. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    cherkashin-vova
    Насколько я понял, CollectionIterator должен наследовать Collection и методы next, prev, seek, current. Через соответствующие функции next, prev, reset и current. А доступ к самому массиву в любом случае нужен, и наследование здесь самый правильный подход.
    Еще вариант взять готовый ArrayObject и ArrayIterator :)


    Это называется абстракция. И то, что сейчас, в текущей реализации, данные хранятся в массиве вовсе не значит, что потом они будут хранится также. И если об этом не подумать заранее, то потом придется бегать по коду, включая все модули, ломать устоявшийся API (почему не устанавливается модуль, почему не работает, а у меня выдает ошибку, вот ведь идиоты эти разработчики…) и еще куча проблем.
     
  10. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2. <?php
    3.  
    4. interface Collection extends Iterator {
    5.     public function add( $o );
    6.    
    7.     public function get( $index );
    8.    
    9.     public function set( $index, $o );
    10.    
    11.     public function remove( $index );
    12.    
    13.     public function size( );
    14. }
    15.  
    16.  
    17.  
    18. class ArrayList implements Collection
    19. {
    20.     private $data = array();
    21.    
    22.     public function __construct(array $array=array()) {
    23.         $this->data = array_values($array);
    24.     }
    25.    
    26.     /** Methods that implements from Iterator */
    27.     public function current() {
    28.         return current($this->data);
    29.     }
    30.  
    31.     public function key() {
    32.         return key($this->data);
    33.     }
    34.  
    35.     public function next() {
    36.         next($this->data);
    37.     }
    38.    
    39.     public function rewind()
    40.     {
    41.         reset($this->data);
    42.     }
    43.  
    44.     public function valid()
    45.     {
    46.         return (current($this->data) !== false);
    47.     }
    48.     /* /Methods from Iretatar */
    49.    
    50.    
    51.     /** Methods from Collection */
    52.     public function add($o) {
    53.         $this->data[] = $o;
    54.     }
    55.  
    56.     public function get( $index ) {
    57.         return isset($this->data[$index])?$this->data[$index]:null;
    58.     }
    59.    
    60.     public function size() {
    61.         return count($this->data);
    62.     }
    63.    
    64.     public function toArray() {
    65.         return $this->data;
    66.     }
    67.    
    68.     public function remove( $index ) {
    69.         if (isset($this->data[$index])) {
    70.             unset($this->data[$index]);
    71.         }
    72.     }
    73.    
    74.     public function set( $index, $o ) {
    75.         $this->data[(int)$index] = $o;
    76.     }
    77. }
    возможно даж работает