Существует оператор for… range для итерации по массивам и слайсам, но вы не можете перебирать другие коллекции, потому что концепция итераторов отсутствует
Ну как же зачем?! Прогреть кэши перед входом пользователя на основной сайт, а не форму авторизации. Да, на одну страницу это слишком жирно, но зато после авторизации пользователь уже не будет ждать пока все скрипты загрузятся, особенно с медленным инетом, а сразу начнет поглощать контент.
Часто приходится использовать похожую организацию в своих проектах. Небольшое отличие: называю объекты не репозиторием (Repository), а хранилищем (Storage).
Хранилище организовано в виде интерфейса, примерно так:
interface StorageInterface {
public function add($item);
public function update($item);
public function delete($item);
public function getById($id);
public function getByIds(array $id);
}
Далее, следует реализации интерфейса под нужные базы данных, например:
class RedisStorage implements StorageInterface {
...
}
class MysqlStorage implements StorageInterface {
...
}
class MemoryStorage implements StorageInterface {
...
}
Реализации хранилищ баз данных оперируют с массивами/строками и ничего не знают о том, какие данные к ним приходят. Вся валидация и подготовка данных происходит выше.
Следующим слоем абстракции идет реализация хранилищ сущностей в нужных базах данных. Будь то User, News, Event, Point, etc…
class UsersRedisStorage extends RedisStorage {
public function add(User $item);
public function update(User $item);
public function delete(User $item);
}
class PointsMysqlStorage extends MysqlStorage {
public function add(Point $item);
public function update(Point $item);
public function delete(Point $item);
}
На этом слое, производится частичная валидация и подготовка данных. Кейсы вроде:
— База данных принимает фиксированное число полей для сущности, а на вход пришли только обязательные поля? Не беда, добавим недостающие поля со значениями по умолчанию.
— Хранилище базы данных работает с JSON? Сконвертируем и принятые данные и прокинем дальше.
Реализация сущностей проста. Это класс-обертка над данными (можно назвать стрктурой), которая имеет примерно такой интерфейс:
interface Entity {
public function get($field);
public function set($field, $value);
public function imort(array $data);
/**
* @return array
*/
public function export();
}
Хранилище сущностей принимает экземпляр сущности, делает экспорт данных и посылает их в реализацию базы данных. Примерно так:
class User implements Entity {
...
}
class UsersRedisStorage extends RedisStorage {
public function add(User $item) {
$userData = $item->export();
// Вот тут валидируем $userData
// Или переводим в json: $userData = json_encode($userData);
parent::add($userData);
}
public function getById($id) {
$userData = parent::getById($id);
$User = new User();
$User->import($userData);
return $User;
}
}
Вокруг хранилища сущностей можно обернуть какую-нибудь фабрику или фасад, например.
В итоге, система хранилищ получается очень гибкая. Быстро пишутся реализации хранения различных сущностей в различных базах данных.
Ещё есть хорошая вещь pix.am
Скрин в три клика. ctrl+win+r, сразу есть редактор изображения. Можно подрезать, написать комментарии и одним кликом послать на сервак.
С сайта можно удалять ненужные снимки. Очень удобный сервис!
Ещё мне нравится зажал правую кнопку провел влево, отпустил — назад. Зажал правую кнопку провел вправо, отпустил — вперед. Зажал, вверх отпустил — остановка загрузки страницы. Актуально с медленным инетом. Зажал, вниз — новая вкладка.
Нет, скорее просто multiplayer online role-playing game.
Цель проекта — получение опыта по работе с сетевыми приложениями (севрер — клиент).
В данный момент коммерческие цели не преследуются. Хотя, графику заказываем у художника и платим из своего кармана.
Честно говоря, в данный момент это не совсем игра, а скорее движок MORPG (именно MO, а не MMO).
Все началось в далеком 2008 году.
…
…
А данный момент игра переживает новый виток. Разрабатывается новый движок, с новыми возможностями…
Набор инструментов XNA был анонсирован 24 марта 2004 на Game Developers Conference.
Первый Community Technology Preview XNA Build был выпущен 14 марта 2006.
Первое упоминание о GTGE:
19 March 2004
GTGE Released: Golden T Game Engine (GTGE) initial released!
Java мне показался с более низким порогом вхождения, чем C++, а так же, я руководствовался чем-то сверхъестественным при выборе ЯП. В общем, Java мне показался более перспективным на данный момент. Если будут какие-то аргументы против, изменю свое мнение… Благо, время на разработку ничем не ограничено. Плюс масса опыта.
имеется ввиду
Хранилище организовано в виде интерфейса, примерно так:
Далее, следует реализации интерфейса под нужные базы данных, например:
Реализации хранилищ баз данных оперируют с массивами/строками и ничего не знают о том, какие данные к ним приходят. Вся валидация и подготовка данных происходит выше.
Следующим слоем абстракции идет реализация хранилищ сущностей в нужных базах данных. Будь то User, News, Event, Point, etc…
На этом слое, производится частичная валидация и подготовка данных. Кейсы вроде:
— База данных принимает фиксированное число полей для сущности, а на вход пришли только обязательные поля? Не беда, добавим недостающие поля со значениями по умолчанию.
— Хранилище базы данных работает с JSON? Сконвертируем и принятые данные и прокинем дальше.
Реализация сущностей проста. Это класс-обертка над данными (можно назвать стрктурой), которая имеет примерно такой интерфейс:
Хранилище сущностей принимает экземпляр сущности, делает экспорт данных и посылает их в реализацию базы данных. Примерно так:
Вокруг хранилища сущностей можно обернуть какую-нибудь фабрику или фасад, например.
В итоге, система хранилищ получается очень гибкая. Быстро пишутся реализации хранения различных сущностей в различных базах данных.
По-моему, она совершенно не ощущается…
Скрин в три клика. ctrl+win+r, сразу есть редактор изображения. Можно подрезать, написать комментарии и одним кликом послать на сервак.
С сайта можно удалять ненужные снимки. Очень удобный сервис!
Цель проекта — получение опыта по работе с сетевыми приложениями (севрер — клиент).
В данный момент коммерческие цели не преследуются. Хотя, графику заказываем у художника и платим из своего кармана.
Все началось в далеком 2008 году.
…
…
А данный момент игра переживает новый виток. Разрабатывается новый движок, с новыми возможностями…
Первое упоминание о GTGE:
Есть сомнения?