Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
var turn = 0;
function turn_over() {
var text = document.getElementById('turn-over-in').value;
var first_letter = text.charAt(0).toLowerCase();
var last_letter = text.charAt(text.length-1).toUpperCase();
var new_text = first_letter + text.substr(1,text.length-2) + last_letter;
var text_array = new_text.split('');
var inside_out = text_array.reverse();
var turn_over_text = inside_out.join('');
document.getElementById('turn-over-out').value = turn_over_text;
<...>
А смысл? Во первых мой код универсальнее, он принимает строку на вход, а не инпут. Во вторых количество кода не изменилось, а читабельность ухудшилась. Надеюсь Вы не один из тех программистов, кто намеренно усложняет код, чтобы его коллега потом переписывал все с нуля ибо ЯННП )
Эх, ничего вы не понимаете...
Мои варианты такие же идиотские (но я хоть делал это сознательно для развлечения), как и reversed.replace(/^\w/, firstLetter); Там же уже был массив, что мешало в нем же и поменять регистр?
И, кстати, количество кода не осталось таким же, оно уменьшилось. В небытие ушли деструктивные присваивания и мутации. Более того, код выражает суть происходящего минимально доступными средствами (и при этом использует меньше слов, чем если бы использовал, как в вашем примере, не совсем подходящие инструменты).
>Мои варианты такие же идиотские
Ну а что еще могут предложить на ГК?
>Более того, код выражает суть происходящего минимально доступными средствами
Согласен, чистая рекурсия красивее.
Плюс Ваш код recurseAndIncapacitate("fUUU") выдает красивое "Uuuf", а его "UUUf"
>Почему - а потому, что стандарт писалии гении, не иначе.
Да копировали походу с жабы.
В языках с немутабельными (C#, Java, js) строками широко распространён такой алгоритм - скопируй в мутабельное, поменяй как тебе надо, и преврати обратно в строку.
Ну тут же ситуация немного другая. В Яве / Сишарпе навелосипедить reverse какой нужно - по производительности он будет такой же, как и встроеный, а в ж.скрипте ректально накажут. При этом интерфейс у разных коллекций разный. Не смотря на то, что методы "массива" применимы к строкам, напрямую их нельзя вызывать, кроме indexOf, slice, lastIndexOf (опять же, ректальное наказание за apply / call). Часть методов применимых к коллекциям возвращает копии, а часть мутирует. Особенно уебищны pop и shift которые возвращают длину "массива". Еще ни разу не видел, чтобы кто-то пользовался возвращаемыми значениями. Всякие map, filter, any и т.д. вызывают функции с ненужными аргументами и не применимы к больше чем одной коллекции одновременно.
Вобщем, хз. откуда они так копировали, но либо потеряли много по дороге, либо придумали лишнего.
>В Яве / Сишарпе навелосипедить reverse какой нужно - по производительности он будет такой же, как и встроеный
Не совсем. Встроенный обращается к массиву напрямую, а самописный через полиморфные методы (charAt, length) с проверками диапазоном.
Конечно --server заинлайнит методы, и уберет проверки, и тогда скорость будет такой же.
Но это только --server.
wtf? Если вышеприведенный код это питон, то я начну его учить только под страхом пыток. Абсолютно нечитабельная хрень, а если программист работает в команде, то читабельность кода не последняя вещь о которой стоит задумываться. Обратите внимание на код Java или C# и вы поймете о чем я говорю.
Вот это питон. Остальное - выхлоп интерактивной консольки. Что тут непонятного то, если знать что такое слайсы (ну кроме непривычного отрицательного шага, который редко кто юзает)?
Слайсы работают примерно так:
s[0] - нулевой символ строки (или элемент списка)
s[-2] - предпоследний символ строки
s[1:5] - символы с первого по четвертый (правая граница не включительно)
s[0:5:2] - 0 и 2 и 4 символы
> Concept Programming
> Syntactic Noise
Ну с этой точки зрения мусора в питоне на порядки меньше, чем в тех же шарпе и крестах (а тем более во всяких ruby). Так что мысль не понял, поясните 😉
Ок. Возможно это не совсем подходящий термин. Я о том, что код, который содержит несемантические элементы трудно читаем. Я могу спокойно прочитать незнакомый код на Java и примерно понять, что там делается - при этом я не знаю Java. Но когда я читаю код скажем на PHP, для меня многое может быть непонятно, из-за множества глобальных функций не привязанных ни к каким неймспейсам, да еще и с идентификаторами являющимися сокращениями аля Сишка. И тут дело даже не в языке программирования, а в стиле самого программиста. Но язык программирования (первый или тот который любимый) совершенно точно откладывает отпечаток как на стиле программирования, так и на образ мышления как программиста.
> Я о том, что код, который содержит несемантические элементы трудно читаем.
Ну все-таки не стоит судить о питоне по одной (к тому же очень редко встречающейся) строчке... Сам язык очень простой. Кроме этих слайсов и упоротого тернарника я там никаких синтаксических извращений не заметил. Нормальный код на питоне отлично читается.
> множества глобальных функций
Ну это точно не о питоне. Там этих встроенно-глобальных функций раз два и обчелся.
> PHP
А вот в php именование реально бесит. Например там есть забавная функция parse_str(), которая... парсит query string'и вида "foo=bar&baz=zzz&answer=42". В питоне с именованием на порядок лучше, но, к сожалению, дурацкие названия и сокращения тоже встречаются.
Какой павлин-мавлин, какие несемантические элементы? О какой семантике идет речь? (их как минимум есть три разных подхода). Шум не возможен в синтаксисе ЯП, т.как это просто очень не выгодно с точки зрения парсера. По крайней мере синтаксического шума в ЯП не бывает (иначе мы бы писали программы которые бы компилировались не всегда изза того, что компилятор не смог разобрать исходный текст).
>Я о том, что код, который содержит несемантические элементы трудно читаем.
Трудно объяснить сишко/крестоблядям что всякие значки, особенно когда в разных частях кода они значат СОВЕРШЕННО разное - плохо. Скобочки: каст и приоритет операторов, больше/меньше: крестошаблон, сдвиг, вывод в поток, и собственно сравнение, двоеточие: наследование, тернарник и неймспейс, & и *: указатели, ссылки и операции между числами. [] - массивы и лямбды. Про {} молчу - пиздец.
Вот неплохая подборочка от ЛишпГумно: http://govnokod.ru/12488 http://govnokod.ru/13344
иллюстрирующая апофеоз ебанутости сиплюструпа.
Плохо изучать, плохо читать, плохо гуглить что же это за тайные знаки.
Ну в пейсоне там действительно мало такого, [::] практически исключение. За это люблю старый-добрый жс (до ебанутых нововведений) - всяких разных значков там абсолютный минимум.
> split('').reverse().join(''),
> recursion
И запомните - самый эффективный код, зачастную самый простой http://jsperf.com/string-reverse-compare
Или тупая императивщина побеждает всегда:
var new_str = "";
for (var i = str.length - 1; i >= 0; i--) new_str += str.charAt(i);
return new_str;
Тупо до горя, даже без обменов - как бы написал я.
На больших строках это будет плохим вариантом изза большого количества сложений строк. Нормальная реализация join сначала выделит сколько нужно памяти и создаст строку один раз, вместо Н строк разного размера. Но это уже мелочи.
Жопа в том, что в ж.скрипте reverse деструктивный, и поэтому его нельзя применить к немутабельным строкам. Почему - а потому, что стандарт писалии гении, не иначе.
>в ж.скрипте reverse деструктивный, и поэтому его нельзя применить к немутабельным строкам. Почему - а потому, что стандарт писалии гении, не иначе.
На самом деле с точки байтоебства десруктивный реверс есть хорошо.
Мои варианты такие же идиотские (но я хоть делал это сознательно для развлечения), как и reversed.replace(/^\w/, firstLetter); Там же уже был массив, что мешало в нем же и поменять регистр?
И, кстати, количество кода не осталось таким же, оно уменьшилось. В небытие ушли деструктивные присваивания и мутации. Более того, код выражает суть происходящего минимально доступными средствами (и при этом использует меньше слов, чем если бы использовал, как в вашем примере, не совсем подходящие инструменты).
Ну а что еще могут предложить на ГК?
>Более того, код выражает суть происходящего минимально доступными средствами
Согласен, чистая рекурсия красивее.
Плюс Ваш код recurseAndIncapacitate("fUUU") выдает красивое "Uuuf", а его "UUUf"
Да копировали походу с жабы.
В языках с немутабельными (C#, Java, js) строками широко распространён такой алгоритм - скопируй в мутабельное, поменяй как тебе надо, и преврати обратно в строку.
Вобщем, хз. откуда они так копировали, но либо потеряли много по дороге, либо придумали лишнего.
Не совсем. Встроенный обращается к массиву напрямую, а самописный через полиморфные методы (charAt, length) с проверками диапазоном.
Конечно --server заинлайнит методы, и уберет проверки, и тогда скорость будет такой же.
Но это только --server.
Out[51]: u'Dsa'
Соснули все.
Слайсы работают примерно так:
s[0] - нулевой символ строки (или элемент списка)
s[-2] - предпоследний символ строки
s[1:5] - символы с первого по четвертый (правая граница не включительно)
s[0:5:2] - 0 и 2 и 4 символы
Ну или вот это http://martinfowler.com/bliki/SyntacticNoise.html
> Syntactic Noise
Ну с этой точки зрения мусора в питоне на порядки меньше, чем в тех же шарпе и крестах (а тем более во всяких ruby). Так что мысль не понял, поясните 😉
Ну все-таки не стоит судить о питоне по одной (к тому же очень редко встречающейся) строчке... Сам язык очень простой. Кроме этих слайсов и упоротого тернарника я там никаких синтаксических извращений не заметил. Нормальный код на питоне отлично читается.
> множества глобальных функций
Ну это точно не о питоне. Там этих встроенно-глобальных функций раз два и обчелся.
> PHP
А вот в php именование реально бесит. Например там есть забавная функция parse_str(), которая... парсит query string'и вида "foo=bar&baz=zzz&answer=42". В питоне с именованием на порядок лучше, но, к сожалению, дурацкие названия и сокращения тоже встречаются.
Трудно объяснить сишко/крестоблядям что всякие значки, особенно когда в разных частях кода они значат СОВЕРШЕННО разное - плохо. Скобочки: каст и приоритет операторов, больше/меньше: крестошаблон, сдвиг, вывод в поток, и собственно сравнение, двоеточие: наследование, тернарник и неймспейс, & и *: указатели, ссылки и операции между числами. [] - массивы и лямбды. Про {} молчу - пиздец.
Вот неплохая подборочка от ЛишпГумно:
http://govnokod.ru/12488
http://govnokod.ru/13344
иллюстрирующая апофеоз ебанутости сиплюструпа.
Плохо изучать, плохо читать, плохо гуглить что же это за тайные знаки.
Ну в пейсоне там действительно мало такого, [::] практически исключение.
За это люблю старый-добрый жс (до ебанутых нововведений) - всяких разных значков там абсолютный минимум.
> recursion
И запомните - самый эффективный код, зачастную самый простой
http://jsperf.com/string-reverse-compare
Или тупая императивщина побеждает всегда:
Тупо до горя, даже без обменов - как бы написал я.
Жопа в том, что в ж.скрипте reverse деструктивный, и поэтому его нельзя применить к немутабельным строкам. Почему - а потому, что стандарт писалии гении, не иначе.
На самом деле с точки байтоебства десруктивный реверс есть хорошо.