Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   переключение счетчика, а как делаете вы? (http://www.flasher.ru/forum/showthread.php?t=152488)

iNils 18.03.2011 16:02

Цитата:

Сообщение от silin (Сообщение 981570)
>>Иначе будет значение 102, вместо 100.
попасть в 100 стартуя из 0 с шагом 3 вообще мудрено
тока если дробить каждый шаг
Код AS3:

private var _step:Number = 1;
private function test(event:Event):void 
{
        for (var i:int = 0; i < 3; i++)
                if ((x += _step) == 100 || x == 0) _step *= -1;
}


_step = 3 и все, будет 99, а потом 102

Цитата:

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

in4core 18.03.2011 16:24

Цитата:

Меньше строк, это все через запятую писать?
Нет конечно ))) я думаю ты понял о чем я, типа примера силина

wvxvw 18.03.2011 19:18

ИМО подход alexcon314 самый идеологически верный :) Положение должно определятся функцией с входящим и возвращаемым значениями - таким образом мы предохраняем код от побочных эффектов таких как значения вне диапазона или запоминайия временного сотояния программы и дальнейшей (возможно неверной) попытки сделать выводы на основании этого состояния. Т.е. предположим, что есть третий фактор, который тоже может задать координату Х объекту, и для него нет правил ограничивающих диапазон в 0..100, тогда всякие попытки ограничить диапазон в этой процедуре на основании предыдущего состояния чреваты ошибкой.
Кроме того, этото подход в дальнейшем позволит, например, легко реализовать нелинейное изменение значения (easing). В то время, ка в цикле вы умаетесь такое считать. Единственное "но" синус / косинус не соответсвуют линейному увеличению и уменьшению, которое бы было похоже на результаты получаемые в цикле. Еще есть "небольшая" проблема в том, что в AS не бывает ленивых вычислений нигде, кроме логических функций-операторов, и нет инстументов (типa yield) для того, чтобы можно было их имитировать.
Поэтому и родилось вот это танго в турецком стиле :)
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class TestRange extends Sprite
        {
                private static const STEP:int = 10;
                private static const INTERVAL:int = 10;
 
                public function TestRange()
                {
                        super();
                        this.yCombinator(200, this.sign, 10);
                }
 
                private function handler(value:int):void
                {
                        trace("result:", value);
                }
 
                private function increment(value:int, mod:int):int
                {
                        this.handler(value - STEP)
                        return value + STEP * mod;
                }
 
                private function sign(value:int, position:int):int
                {
                        return this.increment(value, 1 - (int((position % (INTERVAL << 1)) >= INTERVAL) << 1));
                }
 
                private function yCombinator(times:int, what:Function, initial:int):int
                {
                        return what(times > 0 ? this.yCombinator(times - 1, what, initial) : initial, times);
                }
        }
}


iNils 18.03.2011 19:46

Цитата:

ИМО подход alexcon314 самый идеологически верный
Совсем наоборот. Это пример того, как банальную задачу из мухи превращают в слона. Хотя тут и сама постановка задачи виновата.

Цитата:

Положение должно определятся функцией с входящим и возвращаемым значениями - таким образом мы предохраняем код от побочных эффектов таких как значения вне диапазона или запоминайия временного сотояния программы
Каким образом это предохраняет? Запоминать состояние все равно где-то придется.

wvxvw 18.03.2011 19:56

Каким образом предохраняет: код становится immutable. Ты видишь в моем коде хоть одну переменную? Переменные, даже не столько они, сколько разрушающее присваивание являются самой частой причиной возникновения ошибок в программах, за исключением просто невнимательности. Переменные зачастую сокращают написание кода, и даже делают его более понятным компилятору, и, возможно более оптимальным (если компилятор такой, как в AS3, то и подавно). Но это "идеологически неправильный" путь, хотя, если посмотреть на мейнстрим языки - самый распространенный. В то же время PHP - пожалуй что самый распространенный язык для написания сайтов :)

Т.е. непосредственно отвечая на вопрос: "Запоминать состояние все равно где-то придется." - нет, не обязательно, видишь же, что я ничего не запоминаю. В коде нет переменных - в принципе отсутсвует возможность "запомнить" что либо, и тем не менее задачу поставленную он решает :)

iNils 18.03.2011 20:18

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

Цитата:

нет, не обязательно, видишь же, что я ничего не запоминаю
С таким же успехом ты можешь вообще исключить данный код, потому что он бесполезен. У тебя рекурсия, поэтому не надо ничего запомнить (хотя значения в памяти хранится, все равно запоминается). А исходя из первого поста можно догадаться, что x это координата объекта, поэтому обработка рекурсией ничего на даст. Для визуального изменения координат объекта, нужен временной вызов и хранить состояние тебе все равно где-то придется.

Тут у кого то в подписи есть ссылка на тему "как не надо писать факториал" (у Котяры вроде). Почитай ее пожалуйста.

wvxvw 18.03.2011 20:56

Нет, функция которая обеспечивает диапазон значений - не рекурсивна, так же как Math.cos() :) Y-комбинатор, это функция, которая делает другую функцию рекурсивной находя "фиксированую точку". Но в данном случае она тут для того, чтобы заменить цикл. По-сути, ты тоже почти наверняка пользуешься похожими функциями, только редко туда заглядываешь - easing функции твинов всяких делают именно это - принимая позицию во времени возвращают значение изменяемого параметра, при этом ничего нигде не запоминая.
И вообще я просто скопировал (не дословно, естественно, там рассматриваются другие ЯП) пример из замечательной книжки, которую я сейчас читаю: А. Филд, П. Харрисон "Функциональное программирование", в переводе которой учавстовало два кандидата техн. наук и один академик АЕН РСФСР.
Кроме того, я же с самого начала написал, что с практической точки зрения, такое решение будет субоптимальным ввиду несовершенства синтаксиса языка и компилятора :)

ЗЫ. Когда я говорил про качество програм, я имел в виду програмы написанные программистами, а не дятлами (сорри, просто у этой птицы должно быть что-то особенное в голове). У программистов там, ну по крайней мере, должен быть курс алгебры старших классов :)

NeonSelf 20.03.2011 01:31

Народ, а зачем в 100 попадать? какже проверка на "больше-меньше"? если так проверять, то можно с любым шагом, и 102 будут считаться за границей дозволенного, переключая шаг.


Часовой пояс GMT +4, время: 03:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.