Показать сообщение отдельно
Старый 13.03.2013, 12:13
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
что же скажут профи про опыт использования методов (forEach\every\some\map\filter)!
forEach самый бесполезный. Его можно использовать только для применения какого-то действия к объекту.
Но нужен метод doSomething(item). Обычно проще цикл написать.
Для накапливания како-го то значения - бессмысленно - придется либо делать анонимки, либо выносить состояние в поле класса, когда оно могло бы быть переменной.

Остальные - не использую, т.к. не сильно упрощают код - там же функции делать надо, не анонимки же использовать.

Я в as3 использовал другую и, в общем-то, одну самопальную функцию:
Код AS3:
public function find(foreachable:Object, filter:Function/*(Object):bool*/, criterions:Array/*of (Object):int*/,  defaultValue:Object):*
Например для AI надо выбрать противника, который имеет меньше всего здоровья, но если найдется несколько человек с одинаково низким здоровьем - надо выбрать какого по ближе (поэтому criterion возвращает int, чтобы == имело смысл):
Код AS3:
_invertDistance_unit = selfUnit;
var enemy:Enemy = find(enemies, isCanAttack, [getInvertHealth, getInvertDistance]);
_invertDistance_unit = null;
...
private function getInvertHealth(enemy:Enemy):int
{
    return -enemy.Health;
}
private function getInvertDistance(enemy:Enemy):int
{
    return -_invertDistance_unit.GetDistanceTo(enemy);
}
Если без функций - получится неслабый союз цикла и ифов, в котором легко накосячить. И читалось бы тяжело.
Это действительно, несмотря на создание кучи мелких функций драматически уменьшало объёмы кода и увеличивало читабельность. Но применялось только в специфических частях игры.