У моей девушки на HP Pavilion клавиатура с такой-же глянцевой подложкой и матовыми клавишами. Глянец покрывается пылью моментально, после чего клавиатура представляет собой ну уж очень неэстетичное зрелище.
Из того, что мне лично не нравится в это классе:
0. В NetBeans в отладчике не видно, что содержится в контейнере.
1. Слишком мало встроенных методов, при добавлении новых начинают возникать некоторые проблемы, приводящие к костылям:
/**
* Метод возвращает первый элемент контейнера
*
* @return mixed|null Первый элемент контейнера. Если контейнер пуст - null
*/
public function get_first()
{
foreach($this as $value)
{
return $value;
}
}
/**
* Метод возвращает последний элемент контейнера
*
* @return mixed|null Последний элемент контейнера. Если контейнер пуст - null
*/
public function get_last()
{
if ($this->count() == 0)
{
return;
}
$iterator = $this->getIterator();
// перейдем к последнему элементу
$iterator->seek($this->count() - 1);
return $iterator->current();
}
Замечу, что использование метода getArrayCopy() приводит к тормозам, в зависимости от размера контейнера.
2. Разработчики PHP не отходят от старых традиций. Метод, который стоило бы назвать push(), как в других языках, назвали append().
. Кроме того, вы вольны сами выбирать интерфейс объекта, что позволяет избавиться от legacy-кода SPL (который очень хорошо заметен в функциях работы со строками), и избавляетесь от одного из параметров вызова, который необходимо передавать в функцию.
Да, не сработает. Это я скопировал пример массива из статьи. С одномерными массивами работает. Ждем сокращенного синтаксиса для объявления массивов в PHP 5.4
Я бы хотел добавить пару комментариев к вашему коду:
Класс Iteratable:
public function __construct()
{
$this->_position = 0;
}
public function rewind()
{
$this->_position = 0;
}
Стоить заменить этот фрагмент на
public function __construct()
{
$this->rewind();
}
public function rewind()
{
$this->_position = 0;
}
Это обеспечит единый интерфейс для сброса итератора. Да и вообще, код избыточен (так как задано свойство protected $_position = 0;).
Класс ArrayAccessable
public function __construct($array = null)
{
if (!is_null($array)) {
$this->_container = $array;
}
}
Мне больше нравится следующий подход:
protected container;
public function __construct()
{
$argv = func_get_args();
$argc = func_num_args();
if (argc == 0)
{
$this->container = array();
return;
}
if ( $argc == 1
AND is_array(argv[0]))
{
$this->container = argv[0];
}
else
{
$this->container = argv;
}
}
Это позволяет использовать более красивое создание объекта:
// создадим контейнер из нескольких элементов
$arrayObject = new ArrayAccessable('a', 'b', 'c', 'd', 'e' => 'assoc');
// создадим контейнер из массива
$array = array('a', 'b', 'c', 'd', 'e' => 'assoc');
$arrayObject = new ArrayAccessable($array)
Единственный недостаток заключается в том, что функции типа array_pop() не будут с ним работать.
Я для себя эту проблему решил созданием методов, которые являются обертками над функциями для работы с массивами. Например:
/**
* Метод возвращает контейнер со списком всех ключей объекта
*
* @return Map Контейнер со списком ключей объекта
*/
public function get_keys()
{
return new self(array_keys($this->container));
}
Рекомендую Китайская проблема — эпизод 1208 (№ 175) сериала «South Park»/
Мне это не нравится. Все равно как Джордж Лукас и Стивен Спилберг изнасиловали Индиану Джонса. Вставки компьютерной графики очень сильно портят впечатление в переиздании. Лучше уже посмотреть этот рип, Full HD без шумов.
Странно вообще-то, исходники и тестовая сборка могуть быть с комментами, а перед заливкой на продакшн код можно автоматически прогонять через Google Closure Compiler, YUI Compressor и т.п. Код сразу будет сложнее реверсить.
Такой функционал есть в библиотеке WinBinder, она тоже для создания GUI-приложений на PHP, я до перехода на Linux с ее помощью пробовал писать десктопные приложения. Не знаю, что с ней сейчас, но возможность подключать сторонние библиотеки там была. На моей машине WinBinder падал при попытке выгрузить подключенную библиотеку из памяти, но импортированные функции работали нормально.
0. В NetBeans в отладчике не видно, что содержится в контейнере.
1. Слишком мало встроенных методов, при добавлении новых начинают возникать некоторые проблемы, приводящие к костылям: Замечу, что использование метода getArrayCopy() приводит к тормозам, в зависимости от размера контейнера.
2. Разработчики PHP не отходят от старых традиций. Метод, который стоило бы назвать push(), как в других языках, назвали append().
Класс Iteratable:
Стоить заменить этот фрагмент на
Это обеспечит единый интерфейс для сброса итератора. Да и вообще, код избыточен (так как задано свойство protected $_position = 0;).
Класс ArrayAccessable
Мне больше нравится следующий подход:
Это позволяет использовать более красивое создание объекта:
Я для себя эту проблему решил созданием методов, которые являются обертками над функциями для работы с массивами. Например:
Мне это не нравится. Все равно как Джордж Лукас и Стивен Спилберг изнасиловали Индиану Джонса. Вставки компьютерной графики очень сильно портят впечатление в переиздании. Лучше уже посмотреть этот рип, Full HD без шумов.
Антипаттерн «Magic numbers» же.
Почему бы не использовать константы класса?