- 1
switch (Strings.nullToEmpty(value)) { ... }
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+114
switch (Strings.nullToEmpty(value)) { ... }
Жабовский string switch не умеет в null. Приходится так.
guest 04.06.2013 18:59 # −10
anonimb84a2f6fd141 05.06.2013 23:42 # +6
anonimb84a2f6fd141 05.06.2013 23:43 # +9
guest 08.06.2013 22:10 # +11
Lure Of Chaos 05.06.2013 09:23 # −12
tirinox 05.06.2013 12:59 # −11
someone 05.06.2013 13:10 # −15
Всё, что работает с хэш-кодами, считает, что хэш-код null равен 0.
Lure Of Chaos 05.06.2013 13:12 # −14
someone 05.06.2013 13:15 # −14
Lure Of Chaos 05.06.2013 13:18 # −12
govnomonad 05.06.2013 15:21 # −14
Lure Of Chaos 05.06.2013 15:45 # −12
govnomonad 05.06.2013 16:09 # −13
а как переопределять сравнение объектов? Все равно помимо статики QObject.equals(Object) необходим
Lure Of Chaos 05.06.2013 16:10 # −14
govnomonad 05.06.2013 16:11 # −13
someone 05.06.2013 17:49 # −14
Похожий подход используется в Python. Там есть глобальные функции str и repr, которые для классов дёргают переопределяемые методы __str__ и __repr__ соответственно.
anonimb84a2f6fd141 05.06.2013 23:43 # +12
Мистер Хэнки 06.06.2013 09:34 # −14
bormand 06.06.2013 09:44 # −8
А вот я с ним согласен. Не надо делать кумира из ооп. Некоторые алгоритмы намного лучше смотрятся как функции, чем как статик методы говноутилитарного класса.
roman-kashitsyn 06.06.2013 09:53 # −10
someone 06.06.2013 14:09 # −13
roman-kashitsyn 06.06.2013 14:13 # −13
В c++ такую функцию:
1. можно перегрузить в другом заголовочном файле
2. передавать по указателю в алгоритмы и функции высшего порядка
someone 06.06.2013 14:26 # −13
Перегрузка - это, наоборот, зло. Есть полиморфизм и интерфейсы. Перегрузка - источник труднообнаруживаемых багов.
> передавать по указателю в алгоритмы и функции высшего порядка
Дождитесь Java 8 с лямбдами. А пока есть интерфейсы и анонимные классы.
roman-kashitsyn 06.06.2013 14:34 # −9
Видимо, вы просто никогда не писали шаблоны.
> Дождитесь Java 8 с лямбдами
Но в сишке передавать указатели на функции можно уже больше сорока лет, почему я должен ждать до 2015 года?
А java 8 позволит автоматически конвертировать тысячи уже написанных статических методов в замыкания?
wvxvw 06.06.2013 16:15 # −12
3.14159265 06.06.2013 17:11 # −12
Это фактически ничего не изменит.
Просто чуть меньше писать. Будет больше функцианального говна, в тех местах где громоздкость не давала развернуться буйной фантазии.
There is no silver bullet, Neo.
> в сишке передавать указатели на функции можно уже больше сорока лет
Архиверно.
guest 21.06.2013 16:34 # 0
anonimb84a2f6fd141 06.06.2013 19:40 # +8
Хахахаха, еще 10 лет подождать? :DDDDDDDDDDDDDDDDD
>почему я должен ждать до 2015 года?
Потому, что ява. Ты еще спроси, когда лямбды появятся.
roman-kashitsyn 06.06.2013 19:49 # −12
3.14159265 06.06.2013 20:30 # −13
А причем тут питон?
>Довольно часто я предпочитаю жабу питону
Чего так? И в каком смылсе, "предпочитаю". Жаба ведь тоже далеко не идеальный язык.
Пилить скрипты на питоне - самое то. Тут я предпочитаю питон башу и пёрлу. Смо по себе сравнение динамикм с классической статикой - некорректно.
А так, ну по-просту, тормознутость - его основная проблема.
roman-kashitsyn 06.06.2013 23:58 # −10
Написал на питоне скрипт за полдня, который в несколько потоков заливает данные. И ещё полдня, @**a, пытался завести его на сервере без интернета и с устаревшей версией питона, взывая к virtualenv, buildout и божьей силе.
В итоге плюнул, написал за теже полдня аналог на жабе, собрал убержар, профит.
3.14159265 07.06.2013 12:25 # −12
> пытался завести его на сервере без интернета и с устаревшей версией питона
/me кстати недавно сталкивался с той же проблемой.
ЧСХ решил тоже жабой :)
roman-kashitsyn 07.06.2013 12:42 # −12
guest 07.06.2013 12:50 # +13
wvxvw 05.06.2013 19:19 # −14
Да, так вот, там методы можно специализировать на null, т.е. если сильно хочется nil с чем-то сравнить, то можно:
вот так, например.
3.14159265 05.06.2013 13:03 # −12
Не нужен.
Lure Of Chaos 05.06.2013 13:08 # −12
3.14159265 05.06.2013 13:28 # −14
Хеш-мапы точно так же были сделаны. Еще 15 лет назад.
Такое горбатое сишкоблядское рудиментарное убожество как switch не исправят никакие строки. Только могила, только хардкор.
Lure Of Chaos 05.06.2013 13:29 # −13
3.14159265 05.06.2013 13:35 # −14
А вот чтоб решить действительно нужные, насущные проблемы: сделать грамотные строки, разбитые на страницы по 4К и решить проблему +=, буферов и subString() на больших строках. Это не.
Ради разминки рекомендую подумать, сколько раз нужно скопировать данные туда-сюда чтобы максимально эффективно считать InputStream в строку?
Lure Of Chaos 05.06.2013 13:37 # −13
или наоборот. в любом случае, они тырят друг от друга. и это хорошо.
> чтобы максимально эффективно считать InputStream в строку
зависит от размера буффера.
3.14159265 05.06.2013 13:39 # −14
Любой разумный для универсального использования. Главное - максимально эффективно.
Lure Of Chaos 05.06.2013 13:40 # −14
3.14159265 05.06.2013 13:42 # −14
Даю подсказку - эти буфера по 1024 аппендятся в StringBuffer, который потихоньку удваивается копированием.
После чего содержимое буфера опять-таки копируется! В новую строку.
Lure Of Chaos 05.06.2013 13:45 # −13
обычно хватает такой.
скажем, для реализации таких протоколов, как HTTP или IRC
длинные данные, как правило, бинарные, для них нужен чистый стрим.
3.14159265 05.06.2013 13:48 # −14
Далеко ходить не буду: размер данной страницы - 55 Кбайт.
> для них нужен чистый стрим.
И сильно со стримом что-либо сделаешь? Регэкс там наложить или найти чего.
Еще раз вопрос:
>сколько раз нужно скопировать данные туда-сюда
anonimb84a2f6fd141 05.06.2013 23:47 # +8
someone 05.06.2013 13:49 # −14
Если просто из потока читаем - начинаем с буфера любого "разумного" размера и при каждом чтении увеличиваем размер вдвое, число перераспределений памяти O(log(len(stream))) + 1.
Кстати, шок, хоррор, срочно в номер: StringBuilder так и делает.
3.14159265 05.06.2013 13:54 # −14
Спасибо кеп.
Выше об этом сказано:
http://govnokod.ru/13102#comment179590
В целом же получаем. Как минимум 3 копирования:
1. в массив char[]/byte[]
2. в StringBuilder
3. в String.
А можно-то было обойтись всего одним! То бишь по-прежнему основным двигателем прогресса остаются не сахарные технологии, типа свичей по строкам, а алгоритмы.
someone 05.06.2013 14:02 # −14
Хотя, конечно, это недоработка, что StringBuilder не умеет сам эффективно читать из потока. Тут бы пригодился метод, умеющий передавать Reader.read сразу слайс внутреннего массива StringBuilder.
(Именно Reader. Если мы читаем из InputStream, то byte[] в char[] всё равно кому-то придётся перекодировать.)
Lure Of Chaos 05.06.2013 14:50 # −13
3.14159265 05.06.2013 14:59 # −11
Но проблема как раз в том что StringReader неэффективен.
Он содержит внутри себя оный StringBuilder.
someone 05.06.2013 18:00 # −13
> а зачем StringBuilderу уметь читать из потока? для этого есть вполне эффективные Readerы
Reader'у нужен массив, в который он будет писать прочитанные символы. Массив приходится выделять самостоятельно и делать StringBuilder.append, а это операция копирования. Было бы более удобно, если бы можно было скормить Reader'у напрямую внутренний массив StringBuilder'а с нужным смещением.
Как, например, в MFC CString есть операция GetBuffer, хотя вообще, конечно, MFC - тот ещё ужас.
anonimb84a2f6fd141 05.06.2013 23:48 # +7
bormand 05.06.2013 14:02 # −11
А если это сокет или пайп? Самый эффективный способ, это как выше написал 3.14159265, паровозик из буферов по N байт.
3.14159265 05.06.2013 14:06 # −13
И ведь все эти идеи древнее, придуманы в 70-х или того раньше. Зато хотим бесполезные свичи по строкам.
anonimb84a2f6fd141 05.06.2013 23:50 # +5
someone 05.06.2013 13:39 # −13
Прикажете писать портянку из if("текст".equals(str)), которая к тому же медленнее свича?
> сделать грамотные строки, разбитые на страницы по 4К
Создаём тыщу строк по одному символу, и привет, внутренняя фрагментация. Типичная строка в типичном приложении гораздо короче 4K.
Раньше такая проблема была из-за "оптимизации" substring, когда маленький substring от большой строки держал в памяти всю большую строку. Сейчас это убрали.
3.14159265 05.06.2013 13:40 # −14
Будет тысяча строк с массивом на один символ.
Lure Of Chaos 05.06.2013 13:41 # −13
вообще, это очень холиварный вопрос.
я лично думаю, что так сделали, потому что редко кого интересует реализация виртуальной машины, и делают обычно все примитивно. грустно, но факт
3.14159265 05.06.2013 13:46 # −13
Хорошая годная была оптимизация. Раньше substring был O(1) - явное следствие COW.
И весь старый код заточен на это.
Теперь же начиная с богомерзкой 7-й явы O(N).
ИМХО, сделали еще бОльшее Говно.
someone 05.06.2013 13:53 # −12
> Раньше substring был O(1). И весь старый код заточен на это.
Затачиваться на детали реализации - ССЗБ. В документации где-нибудь написано, что substring должен быть O(1)?
Хотите O(1) - пишите свой substring, это даже не так сложно.
3.14159265 05.06.2013 13:57 # −13
Рекомендую внимательно прочитать мои посты выше.
>Берём строку в стопицот символов и оставляем substring на один символ.
Берём строку в стопицот символов обрезаем джва проблема сначала и с конца.
Теперь у нас две практически идентичных строки по 100500 символов.
Еще неизвестно что хуже. Перерасход памяти адский, но зато стал явным!
3.14159265 05.06.2013 14:01 # −10
Хотите нормальных строк - пишите сами.
Нормальный такой библиотечный подход, да.
someone 05.06.2013 14:08 # −14
В Обычной Жизни (tm) substring за O(1) - слишком узкоспециализированная операция, чтобы ради неё таскать аж два дополнительных поля и риск внутренней фрагментации.
3.14159265 05.06.2013 14:12 # −14
Ну-ка покажите мне как с их помощью искать регэксом в стриме. Или сделать простой replace.
Особенно интересует поиск на границах буферов.
someone 05.06.2013 14:21 # −14
replace - только в строку, но тут-то хоть как придётся выделять новый массив, что с CharBuffer, что с substring.
3.14159265 05.06.2013 14:22 # −12
Особенно интересует поиск на границах буферов.
Ведь ваш CharBuffer явно не бесконечный.
someone 05.06.2013 14:25 # −14
3.14159265 05.06.2013 14:30 # −14
Проблема в том чтобы делать что-то нормальное с набором байт из потока нужно сначала сделать кучу ненужных копирований...
someone 05.06.2013 14:33 # −13
Достаточно простые случаи можно скормить Scanner. Для остального есть jakarta regexp, который поддерживает поточную обработку.
Конкретно у меня речь шла о том, что аналог O(1) substring в стандартной библиотеке есть. Что ещё надо?
3.14159265 05.06.2013 14:37 # −14
То еще говно. Причем несмотря на CharBuffer и nio тормознутее чем остальные io способы.
Достойно отдельного треда.
Вкратце расскажу как оно работает и решает проблему границ.
Когда буфер заканчивается, оно создает новый.
Копирует туда все что начитало раньше плюс то что начитало только что.
И, сюрприз! начинает применять регэкс на новом буфере с самого начала (или места последнего матча).
Короче копирований там дохерища. Еще и шлемиэльщина.
>есть jakarta regexp, который поддерживает поточную обработку.
Да есть много third-party либ.
Изначально же говорилось - они занимаются херней какой-то, вместо того чтобы сделать нормальные стандартные строки, io и буфера.
someone 05.06.2013 14:40 # −14
Какие операции должна поддерживать "нормальная стандартная строка"?
3.14159265 05.06.2013 14:41 # −14
roman-kashitsyn 05.06.2013 15:04 # −13
Data.ByteString наше всё
3.14159265 05.06.2013 15:05 # −13
>"Нормальные стандартные строки" - это какие?
Что в хацкиле строки настолько хорошо зделаны. Практически образцово.
На io вполне запросто могут уделать по памяти/cpu жабу, шарп и кривые самописные крестоподелия. И это несмотря, на иммутабельность!
Плюс. Думаю зеленый цвет тут не нужен.
append :: ByteString -> ByteString -> ByteStringSource O(n).
Хотя нет уж. Rope наше всё.
roman-kashitsyn 05.06.2013 15:16 # −13
3.14159265 05.06.2013 15:22 # −15
В жабе алгоритмическая культура развита только там где код пишут люди с учеными степенями - java.utl.concurent. В шарпе она вообще практически отсутствует - не было наборов до 3.5. Хацкиль выглядит оплотом алгоритмики и за счёт неё может запросто уделать их.
roman-kashitsyn 05.06.2013 15:50 # −8
3.14159265 05.06.2013 14:07 # −14
Приказываю разбираться с хеш-мапами и енумами.
roman-kashitsyn 05.06.2013 14:11 # −14
Мне не особо нужен свитч по строкам, но и хэш-мапа не всегда подходит.
3.14159265 05.06.2013 14:14 # −13
Енум. Просто добавь valueOf(String).
roman-kashitsyn 05.06.2013 14:20 # −13
someone 05.06.2013 14:24 # −12
Прикажете для неизвестных строк (аналог default в свиче) ловить исключение в Enum.valueOf?
3.14159265 05.06.2013 14:26 # −14
а) писать default
б) кидать из него исключение Unsuppoted...
С иключениями такой прикол, что ловить их можно где угодно и как удобно. Кто не понял этого, тот мучается и пишет столько try-catch, что кода больше чем у Тараса проверки retVal.
Это не только не аргумент против, наоборот "за".
roman-kashitsyn 05.06.2013 14:26 # −13
anonimb84a2f6fd141 05.06.2013 23:53 # +8
anonimb84a2f6fd141 05.06.2013 23:53 # +5
Век замыканий не видать,
Литералов для хешмепов тоже не видать.
Поебать!
Фабрика легко и непринужденно
Помещается в очке.
Что нужно еще?
someone 05.06.2013 13:34 # −13
Кстати, не пойму, почему они выбрали 0 в качестве специального значения.
Не проще ли было бы сделать хэш типом Integer вместо int и использовать null как флаг "хэш ещё не закэширован"?
Lure Of Chaos 05.06.2013 13:36 # −13
3.14159265 05.06.2013 13:37 # −13
Дополнительный булев флаг по памяти был бы таким же как Integer, но эффективней.
Lure Of Chaos 05.06.2013 16:04 # −14
а есть пример ненуллевой строки, у которой нулевой хэшкод?
bormand 05.06.2013 16:08 # −14
anonimb84a2f6fd141 05.06.2013 23:55 # +8
3.14159265 05.06.2013 16:19 # −12
Нужно решить несложную систему уравнений, где сумма кратна 2^32.
Тривиальный случай: строка полностью состоящая из 0.
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
anonimb84a2f6fd141 05.06.2013 23:44 # +8
anonimb84a2f6fd141 05.06.2013 23:44 # +7
bormand 07.06.2013 05:26 # −11
inkanus-gray 07.06.2013 07:39 # −10
bormand 07.06.2013 08:32 # −12
3.14159265 07.06.2013 12:29 # −11
Мда. Странно. До того как я выложил позавчера свой скрипт, он только бегал со смегмой на губах упрашивая дать ему разворачивалку комментов.
А там всего-то строчку написать:
guest 07.06.2013 12:49 # +10
$('.comment-text').click();
3.14159265 07.06.2013 12:51 # −12
А какой смысл выёбываться DOM, если строчкой ниже всё-равно юзаешь jquery?
>els=
Не питонист, ли ты мил человек?
guest 07.06.2013 12:55 # +10
3.14159265 07.06.2013 12:58 # −12
2-е не работает.
Срамной уебок. У тебя малафья на губах еще с прошлого раза осталась.
>сасай двачеблядь
Анонимным пидорским сленгом тут пишешь только ты.
guest 07.06.2013 13:00 # +11
твой сленг в тебе выдает гомосексуалиста
3.14159265 07.06.2013 13:02 # −12
>els=document.getElementsByClassName ('comment-text'); for(i=0,l=els.length;i<l;++i)els[i].style.display='block';
И остается строка - показать все, что скрыто
Мой сленг прямо посылает тебя на хуй.
guest 07.06.2013 13:04 # +9
3.14159265 07.06.2013 13:08 # −11
Сначала отрасти руки из нужного места. Твои бесполезные DOM-говноскрипты никому тут не нужны.
guest 07.06.2013 13:09 # +10
anonimb84a2f6fd141 07.06.2013 17:33 # +7
guest 07.06.2013 08:36 # +10
TarasB 07.06.2013 10:09 # −9
bormand 07.06.2013 10:22 # −12
Кстати, а страйко разве карантин после регистрации отключил?
roman-kashitsyn 07.06.2013 10:33 # −11
defecate-plusplus 07.06.2013 10:39 # −11
карантин сколько сейчас? неделю? вот она и истекла
bormand 07.06.2013 11:35 # −13
TarasB 07.06.2013 10:40 # −13
3.14159265 07.06.2013 12:40 # −9
И вообще откуда постоянно подозрения на старых.
Этои летний сезон отмечен новыми вспышками бугурта и мы имеем дело с новым штаммом долбоёба.
В интернетах таких водится овердохуя.
TarasB 07.06.2013 10:41 # −13
roman-kashitsyn 07.06.2013 11:57 # −13
inkanus-gray 07.06.2013 12:07 # −13
roman-kashitsyn 07.06.2013 12:12 # −12
3.14159265 07.06.2013 12:47 # −12
http://govnokod.ru/user/7258
http://govnokod.ru/user/7259
http://govnokod.ru/user/7260
http://govnokod.ru/user/7261
http://govnokod.ru/user/7262
http://govnokod.ru/user/7263
http://govnokod.ru/user/7264
3.14159265 07.06.2013 12:33 # −11
Vasiliy 07.06.2013 11:42 # −12
$('.ajax').closest(":not([href=http://govnokod.ru/user/5798])").trigger('click');
3.14159265 07.06.2013 12:49 # −11
Vasiliy 07.06.2013 13:51 # −12
eth0 07.06.2013 19:30 # −6
3.14159265 08.06.2013 16:45 # −9
http://rghost.ru/46605574
eth0 08.06.2013 17:46 # −8
Неужели говнокод катится в сраное?