PDA

Просмотр полной версии : Коротко и не ясно.


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
Возможно путаю. Надо Котяру ждать, може он вспомнит.

dark256
06.10.2015, 20:14
Максимум краткости и минимум ясности - это регулярки....
Тут у них победа техническим нокаутом...

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, ты сейчас наговорил не депортацию с планеты, ты в курсе? ))

dark256
07.10.2015, 11:15
Палится кейс, ох палится..... Не ведает левая третья пара щупалец, что творит правая пятая.... :)))))

caseyryan
07.10.2015, 11:23
:D
http://www.moviewallpapers.ru/images/walls/cartoon/serials/1024x768/futurama_1024_020.jpg

etc
07.10.2015, 21:27
result = result || new SomeClass()
Слишком писать много!
result ||= new SomeClass()
:3

Лучше симпл:

if (!result) result = new SomeClass();

Zebestov
07.10.2015, 21:40
Тю, это может и не особо длинно, но до неприличия ясно! )

etc
07.10.2015, 21:46
Тю, это может и не особо длинно, но до неприличия ясно! )

Вот именно, а ясность куда важнее краткости. Вариант с || ещё куда ни шло, но выглядит не очень (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
про быитовые сдвиги нужно еще пофлеймить же!

dark256
08.10.2015, 11:11
2BEER||!2BEER

Zebestov
08.10.2015, 14:40
Проверка на нечетность val&1 вместо val%2, но то такое.

callme
09.10.2015, 10:11
кто побьет моё кунг-фу?
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
эмм… и?

callme
09.10.2015, 11:23
я пришел к этому подходу уже после твоего подхода

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/) этот код должен быть ;)

callme
09.10.2015, 11:30
я даже знаю где (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
09.10.2015, 11:56
callme, лучше расскажи, что твой код делает.

Если нужно создать новый объект, вызываем функцию someAction. Если уже есть готовый объект, то вызываем функцию someAction_optimized.

То есть отдельная функция на каждый случай.

Zebestov
09.10.2015, 12:11
И в чем прикол, если одна функция решает это в одну строку и даже вызов ее от этого не меняется (для совместимости или скорее для поддержания привычки плодить мусор).

callme
09.10.2015, 12:32
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;
}
}
Но сейчас на сайте с кодоляпами какая-то желчь, вроде "ха-ха-ха, посмотрите, какой он неуклюжий рукожоп! Ну же, тыкнем пальцем в него и посмеёмся!".
Давайте не забывать, что люди пишут плохой (хотя, моё зрение о "плохом" во многом изменилось) код не потому что они не могут писать хороший, а потому что они ещё просто не научились.

etc
10.10.2015, 14:28
С || и ||= чуть сложнее на первый взгляд и нужно знать что логический оператор "или" возвращает не логический тип 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 через конвертацию в строку и сверку с длинной.
Давайте не забывать, что люди пишут плохой (хотя, моё зрение о "плохом" во многом изменилось) код не потому что они не могут писать хороший, а потому что они ещё просто не научились.

Да, но такие ляпы как раньше все равно еще встречаются