![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Цитата:
Цитата:
|
|
|||||
|
Modus ponens
|
ИМО подход alexcon314 самый идеологически верный
Положение должно определятся функцией с входящим и возвращаемым значениями - таким образом мы предохраняем код от побочных эффектов таких как значения вне диапазона или запоминайия временного сотояния программы и дальнейшей (возможно неверной) попытки сделать выводы на основании этого состояния. Т.е. предположим, что есть третий фактор, который тоже может задать координату Х объекту, и для него нет правил ограничивающих диапазон в 0..100, тогда всякие попытки ограничить диапазон в этой процедуре на основании предыдущего состояния чреваты ошибкой.Кроме того, этото подход в дальнейшем позволит, например, легко реализовать нелинейное изменение значения (easing). В то время, ка в цикле вы умаетесь такое считать. Единственное "но" синус / косинус не соответсвуют линейному увеличению и уменьшению, которое бы было похоже на результаты получаемые в цикле. Еще есть "небольшая" проблема в том, что в AS не бывает ленивых вычислений нигде, кроме логических функций-операторов, и нет инстументов (типa yield) для того, чтобы можно было их имитировать. Поэтому и родилось вот это танго в турецком стиле ![]() 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); } } }
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 18.03.2011 в 19:59. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Цитата:
Цитата:
|
|
|||||
|
Modus ponens
|
Каким образом предохраняет: код становится immutable. Ты видишь в моем коде хоть одну переменную? Переменные, даже не столько они, сколько разрушающее присваивание являются самой частой причиной возникновения ошибок в программах, за исключением просто невнимательности. Переменные зачастую сокращают написание кода, и даже делают его более понятным компилятору, и, возможно более оптимальным (если компилятор такой, как в AS3, то и подавно). Но это "идеологически неправильный" путь, хотя, если посмотреть на мейнстрим языки - самый распространенный. В то же время PHP - пожалуй что самый распространенный язык для написания сайтов
![]() Т.е. непосредственно отвечая на вопрос: "Запоминать состояние все равно где-то придется." - нет, не обязательно, видишь же, что я ничего не запоминаю. В коде нет переменных - в принципе отсутсвует возможность "запомнить" что либо, и тем не менее задачу поставленную он решает ![]()
__________________
Hell is the possibility of sanity |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Олег, пожалуйста, опустись с небес на землю и перестань нести пургу типа "сколько разрушающее присваивание являются самой частой причиной возникновения ошибок в программах" (Самой частой причиной ошибок является качество содержимого головы)
Цитата:
Тут у кого то в подписи есть ссылка на тему "как не надо писать факториал" (у Котяры вроде). Почитай ее пожалуйста. |
|
|||||
|
Modus ponens
|
Нет, функция которая обеспечивает диапазон значений - не рекурсивна, так же как Math.cos()
Y-комбинатор, это функция, которая делает другую функцию рекурсивной находя "фиксированую точку". Но в данном случае она тут для того, чтобы заменить цикл. По-сути, ты тоже почти наверняка пользуешься похожими функциями, только редко туда заглядываешь - easing функции твинов всяких делают именно это - принимая позицию во времени возвращают значение изменяемого параметра, при этом ничего нигде не запоминая.И вообще я просто скопировал (не дословно, естественно, там рассматриваются другие ЯП) пример из замечательной книжки, которую я сейчас читаю: А. Филд, П. Харрисон "Функциональное программирование", в переводе которой учавстовало два кандидата техн. наук и один академик АЕН РСФСР. Кроме того, я же с самого начала написал, что с практической точки зрения, такое решение будет субоптимальным ввиду несовершенства синтаксиса языка и компилятора ![]() ЗЫ. Когда я говорил про качество програм, я имел в виду програмы написанные программистами, а не дятлами (сорри, просто у этой птицы должно быть что-то особенное в голове). У программистов там, ну по крайней мере, должен быть курс алгебры старших классов ![]()
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 18.03.2011 в 21:02. |
|
|||||
|
Регистрация: May 2010
Адрес: Украина, Донецкая обл., Харцызск
Сообщений: 13
|
Народ, а зачем в 100 попадать? какже проверка на "больше-меньше"? если так проверять, то можно с любым шагом, и 102 будут считаться за границей дозволенного, переключая шаг.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 06:09. |
|
|
« Предыдущая тема | Следующая тема » |
|
|