Просмотр полной версии : Коротко и не ясно.
Bletraut
03.10.2015, 13:37
Собственно интересно посмотреть на решение некоторых вопросов в программировании как можно более коротким способом, а именно в одну строку. ХД
Например, сеттер альфы в одну строку
public function set alpha(n:Number):void { _alpha = (n < 0) ? 0 : (n > 1) ? 1 : n; }
Решение задачи по программированию (https://server.179.ru/tasks/olymp/017.html#g_t017)
for (var i:int = 1, c:int = 1; i <= n; ++i, c += (Number("0." + i) <= Number("0." + k)) ? 1 : 0 ) if (i == n) trace(c);
Делитесь своими решениями ХД
caseyryan
03.10.2015, 14:07
И что в этом особеного? Беспонтовая запись. Такой галимотьи лучше всегда избегать. Это хорошо для каких-нибудь тестов на знание языка (или даже скорее на логику мышления), но для рабочих проектов - это ужасно
Вот здесь (https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CBwQFjAAahUKEwjgu7CBiKbIAhWFqnIKHTfrDIs&url=https%3A%2F%2Fwww.ibm.com%2Fdeveloperworks%2Fcommunity%2Ffiles%2Fbasic%2Fanonymous%2Fapi%2Flibrary%2Fea668ff3-015f-4ae9-a1fa-478605150423%2Fdocument%2F6d5777a7-8d07-4a66-87d5-dd5c33b12300%2Fmedia%2FApress.Oracle.Certified.Professional.Java.SE.7.Programmer.Exams.pdf&usg=AFQjCNEQTEPTgQsvDXTlcvCnMVOtRWrr3A&sig2=vTyMLVcq2TJ_wNsejr72Ow&cad=rja) таких примеров хоть завались
Bletraut
03.10.2015, 14:13
Так я и не говорю, что это в реальных проектах используется. Просто интересно как ещё можно с кодом извратиться.
Zebestov
03.10.2015, 14:48
function someAction(someArg:*, result:SomeClass = null):SomeClass {
result = result || new SomeClass(); // < вот такая запись у меня повсеместено
// вычисления, результат которых необходимо вернуть
// в виде экземпляра класса SomeClass
// ...
return result;
}
caseyryan
03.10.2015, 15:09
function someAction(someArg:*, result:SomeClass = null):SomeClass {
result = result || new SomeClass(); // < вот такая запись у меня повсеместено
// вычисления, результат которых необходимо вернуть
// в виде экземпляра класса SomeClass
// ...
return result;
}
Я даже знаю чем это навеяно :D
Zebestov
03.10.2015, 15:16
Ну, у меня это началось с ковирания Starling-а :) а потом плотно вошло в мою жизнь!
Bletraut
03.10.2015, 15:34
function someAction(someArg:*, result:SomeClass = null):SomeClass {
result = result || new SomeClass(); // < вот такая запись у меня повсеместено
// вычисления, результат которых необходимо вернуть
// в виде экземпляра класса SomeClass
// ...
return result;
}
И как это работает? В чем суть?
Zebestov
03.10.2015, 15:37
Что именно? Это это запись типа "если аргумент result зашел как null, придется создать его, чтобы было что возвращать". В противном случае мы работаем с тем объектом, который нам предоставили. Это порой здорово экономит время.
Добавлено через 3 минуты
Ну и всякое такое прочее в одну строку и коротко, вроде такого:
isDragging && update(); // Обновляем сцену, если в настоящий момент происходит таскание объекта
isDragging || move(); // Если таскание объекта не происходит, двигаем его программно
ZackMercury
03.10.2015, 15:56
Zebestov, а так нельзя, чтоли?
function someAction(someArg:*, result:SomeClass = new SomeClass()):SomeClass {
// вычисления, результат которых необходимо вернуть
// в виде экземпляра класса SomeClass
// ...
return result;
}
UPD: скомпилил, нельзя)
caseyryan
03.10.2015, 16:04
Zebestov, а так нельзя, чтоли?
function someAction(someArg:*, result:SomeClass = new SomeClass()):SomeClass {
// вычисления, результат которых необходимо вернуть
// в виде экземпляра класса SomeClass
// ...
return result;
}
Ну во-первых такая конструкция даже не скомпилируется. А во-вторых какой в ней смысл?
У Вадима там при передаче объекта используется он, а при передаче null, создается новый. Зачем создавать новый при любых условиях?
ZackMercury
03.10.2015, 16:05
caseyryan, не при любых условиях. В скобках указываются значения по умолчанию.
например
function f(something:int = 4, something2:int = 65):int
{
...
}
caseyryan
03.10.2015, 16:07
1) Это работает только для примитивных типов
2) Если значением по умолчанию у тебя каждый раз при вызове функции будет новый объект, то именно создание нового при любых условиях и получается
Zebestov
03.10.2015, 16:09
Нене, caseyryan, !еслибыонобыловозможно!, то таки создавалось бы только тогда, когда аргумент опущен. Но фигушки :)
caseyryan
03.10.2015, 16:12
то таки создавалось бы только тогда
А, ну да. Это я тупанул малость
Psycho Tiger
04.10.2015, 12:11
result = result || new SomeClass()
Слишком писать много!
result ||= new SomeClass()
:3
Zebestov
04.10.2015, 12:13
Чота Котяра говорил, что такая запись глючила (а може я путаю).
caseyryan
04.10.2015, 13:24
Я такую запись в синглтонах использую. Ни разу еще не глюканула
Zebestov
04.10.2015, 13:30
Возможно путаю. Надо Котяру ждать, може он вспомнит.
Максимум краткости и минимум ясности - это регулярки....
Тут у них победа техническим нокаутом...
caseyryan
06.10.2015, 20:20
Ну, минимум ясности там только если ты в них ничего не понимаешь. А если понимаешь, то все логично и ясно
Zebestov
06.10.2015, 20:23
Ой всё! Людям, которые с налёту понимают регулярки, необходимо сдавать тесты на неинопланетность :)
caseyryan
06.10.2015, 20:32
Ну не с налета, но их реально можно понять довольно просто) У Фриддла в книжке сразу было написано как их надо читать.
Zebestov
06.10.2015, 20:38
caseyryan, ты сейчас наговорил не депортацию с планеты, ты в курсе? ))
Палится кейс, ох палится..... Не ведает левая третья пара щупалец, что творит правая пятая.... :)))))
caseyryan
07.10.2015, 11:23
:D
http://www.moviewallpapers.ru/images/walls/cartoon/serials/1024x768/futurama_1024_020.jpg
result = result || new SomeClass()
Слишком писать много!
result ||= new SomeClass()
:3
Лучше симпл:
if (!result) result = new SomeClass();
Zebestov
07.10.2015, 21:40
Тю, это может и не особо длинно, но до неприличия ясно! )
Тю, это может и не особо длинно, но до неприличия ясно! )
Вот именно, а ясность куда важнее краткости. Вариант с || ещё куда ни шло, но выглядит не очень (result = result), а с ||= вообще не у всех в мозгу сходу распознаётся.
Zebestov
07.10.2015, 21:57
Ну, это уже дело привычки, спорить не стану. Другое дело, что можно и так (но это будет уже почти if и не так элегантно):
result || (result = new SomeClass());
Psycho Tiger
08.10.2015, 09:08
Вот именно, а ясность куда важнее краткости. Вариант с || ещё куда ни шло, но выглядит не очень (result = result), а с ||= вообще не у всех в мозгу сходу распознаётся.
Ну, тогда и if(!result) лучше избегать.
Лучше вот так
if (result == false)
и привести к одному типу, на всякий
if (Boolean(result) == false)
Выглядит откровенно плохо. Потому что if (!result) устоявшееся выражение и среднестатистический кодер понимает, что оно значит. С || и ||= чуть сложнее на первый взгляд и нужно знать что логический оператор "или" возвращает не логический тип Boolean по многим заблуждениям (вот тут то все и валятся!), но это настолько устоявшееся выражение в других языках (особенно с теми, у которых есть statement modifiers), что мне удивительно его игнорирование здесь.
alexcon314
08.10.2015, 10:12
про быитовые сдвиги нужно еще пофлеймить же!
Zebestov
08.10.2015, 14:40
Проверка на нечетность val&1 вместо val%2, но то такое.
кто побьет моё кунг-фу?
function someAction(someArg:*):SomeClass {
return someAction_optimized( someArg, new SomeClass() );
}
function someAction_optimized(someArg:*, result:SomeClass):SomeClass {
// ...
return result;
}
Zebestov
09.10.2015, 11:11
эмм… и?
я пришел к этому подходу уже после твоего подхода
Zebestov
09.10.2015, 11:27
Може я туплю, но я не могу понять, в чем фишка (
caseyryan
09.10.2015, 11:27
кто побьет моё кунг-фу?
function someAction(someArg:*):SomeClass {
return someAction_optimized( someArg, new SomeClass() );
}
function someAction_optimized(someArg:*, result:SomeClass):SomeClass {
// ...
return result;
}
я даже знаю где (http://govnokod.ru/) этот код должен быть ;)
я даже знаю где (http://govnokod.ru/) этот код должен быть ;)
аргументируй
Zebestov
09.10.2015, 11:33
callme, лучше расскажи, что твой код делает.
caseyryan
09.10.2015, 11:34
Тут и аргументировать нечего) Из этой темы 99% кода должно быть на том же сайте) Какое-то совершенно нелепое действие с двумя функциями, ради решения простейшей задачи. Вместо этого можно было просто написать
if (!someArg) someArg = new SomeClass();
Zebestov
09.10.2015, 11:54
И все же я не понял, что делает код, представленный callme.
callme, лучше расскажи, что твой код делает.
Если нужно создать новый объект, вызываем функцию someAction. Если уже есть готовый объект, то вызываем функцию someAction_optimized.
То есть отдельная функция на каждый случай.
Zebestov
09.10.2015, 12:11
И в чем прикол, если одна функция решает это в одну строку и даже вызов ее от этого не меняется (для совместимости или скорее для поддержания привычки плодить мусор).
Zebestov, я сам так тоже не пишу, но почему — не знаю — строго по полочкам причины не расставлены.
Zebestov
09.10.2015, 12:49
Не, я не про привычки. Передавать в метод/функцию в качестве необязательного аргумента объект, в который пишется результат работы класса в некоторых задачах дает существенный прирост производительности. А как побочный эффект — еще и мусора меньше, что тоже позволяет реже видеть "подрывы" не вовремя отработавшего GC.
Psycho Tiger
09.10.2015, 16:57
я даже знаю где (http://govnokod.ru/) этот код должен быть ;)
Гм, раньше там было смешно. Ну, проверка на Boolean через конвертацию в строку и сверку с длинной. Порой делая ревью кода у индусов смеюсь, когда у них что-то вроде этого:
for (var i = 0; i < 3; i++){
switch(i){
case 0:
....
break;
case 1:
...
break;
case 2:
...
break;
}
}
Но сейчас на сайте с кодоляпами какая-то желчь, вроде "ха-ха-ха, посмотрите, какой он неуклюжий рукожоп! Ну же, тыкнем пальцем в него и посмеёмся!".
Давайте не забывать, что люди пишут плохой (хотя, моё зрение о "плохом" во многом изменилось) код не потому что они не могут писать хороший, а потому что они ещё просто не научились.
С || и ||= чуть сложнее на первый взгляд и нужно знать что логический оператор "или" возвращает не логический тип Boolean по многим заблуждениям (вот тут то все и валятся!), но это настолько устоявшееся выражение в других языках (особенно с теми, у которых есть statement modifiers), что мне удивительно его игнорирование здесь.
Слушай, чем ближе к основам, тем проще. ||= разраб встречает далеко не сразу и значительно реже, чем if (!foo).
Psycho Tiger
10.10.2015, 14:58
Слушай, чем ближе к основам, тем проще. ||= разраб встречает далеко не сразу и значительно реже, чем if (!foo).
Да, твоя позиция понятная и вполне правильная, но у меня другая (тоже правильная). Сейчас объясню.
Я за использование всех возможностей языка, если они не вредят. В чем польза ||= против if? Её банально проще читать, в ней нельзя ошибиться и даже код получается короче.
if (!foo) foo = new Foo();
Что видит программист? Условие. Он смотрит на условие, он смотрит на отрицание, смотрит на правую часть выражения и сравнивает переменные. Он обязан это сделать читая код. Когда пишешь код – здесь можно ошибиться опечаткой, особенно если язык не требует явного введения переменных.
if (!polo5) polos = new Polos();
Пример, бесспорно, дурацкий. Суть в том, что внутри if может быть что-то другое и это другое требует проверки программистом при чтении/дебаге.
Оператор ||= же делает только одну из всех возможных функций: инициирует переменную значением, если она ещё не инициирована. Больше она ничего делать не может. Здесь нельзя опечататься в условии или как-то напортачить, здесь короткая запись, здесь нет повторения имени переменной – а это DRY, это хорошо.
Операторы и есть основа языка. Использование их в угоду явному ветвлению кода и есть простота. То, что разрабы встречают это реже не повод не использовать инструмент, который лучше. Из за таких маленьких улучшений код становится легче и проще.
caseyryan
11.10.2015, 14:18
Гм, раньше там было смешно. Ну, проверка на Boolean через конвертацию в строку и сверку с длинной.
Давайте не забывать, что люди пишут плохой (хотя, моё зрение о "плохом" во многом изменилось) код не потому что они не могут писать хороший, а потому что они ещё просто не научились.
Да, но такие ляпы как раньше все равно еще встречаются
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.