- 1
switch (Strings.nullToEmpty(value)) { ... }
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+114
switch (Strings.nullToEmpty(value)) { ... }
Жабовский string switch не умеет в null. Приходится так.
Всё, что работает с хэш-кодами, считает, что хэш-код null равен 0.
а как переопределять сравнение объектов? Все равно помимо статики QObject.equals(Object) необходим
Похожий подход используется в Python. Там есть глобальные функции str и repr, которые для классов дёргают переопределяемые методы __str__ и __repr__ соответственно.
А вот я с ним согласен. Не надо делать кумира из ооп. Некоторые алгоритмы намного лучше смотрятся как функции, чем как статик методы говноутилитарного класса.
В c++ такую функцию:
1. можно перегрузить в другом заголовочном файле
2. передавать по указателю в алгоритмы и функции высшего порядка
Перегрузка - это, наоборот, зло. Есть полиморфизм и интерфейсы. Перегрузка - источник труднообнаруживаемых багов.
> передавать по указателю в алгоритмы и функции высшего порядка
Дождитесь Java 8 с лямбдами. А пока есть интерфейсы и анонимные классы.
Видимо, вы просто никогда не писали шаблоны.
> Дождитесь Java 8 с лямбдами
Но в сишке передавать указатели на функции можно уже больше сорока лет, почему я должен ждать до 2015 года?
А java 8 позволит автоматически конвертировать тысячи уже написанных статических методов в замыкания?
Это фактически ничего не изменит.
Просто чуть меньше писать. Будет больше функцианального говна, в тех местах где громоздкость не давала развернуться буйной фантазии.
There is no silver bullet, Neo.
> в сишке передавать указатели на функции можно уже больше сорока лет
Архиверно.
Хахахаха, еще 10 лет подождать? :DDDDDDDDDDDDDDDDD
>почему я должен ждать до 2015 года?
Потому, что ява. Ты еще спроси, когда лямбды появятся.
А причем тут питон?
>Довольно часто я предпочитаю жабу питону
Чего так? И в каком смылсе, "предпочитаю". Жаба ведь тоже далеко не идеальный язык.
Пилить скрипты на питоне - самое то. Тут я предпочитаю питон башу и пёрлу. Смо по себе сравнение динамикм с классической статикой - некорректно.
А так, ну по-просту, тормознутость - его основная проблема.
Написал на питоне скрипт за полдня, который в несколько потоков заливает данные. И ещё полдня, @**a, пытался завести его на сервере без интернета и с устаревшей версией питона, взывая к virtualenv, buildout и божьей силе.
В итоге плюнул, написал за теже полдня аналог на жабе, собрал убержар, профит.
> пытался завести его на сервере без интернета и с устаревшей версией питона
/me кстати недавно сталкивался с той же проблемой.
ЧСХ решил тоже жабой :)
Да, так вот, там методы можно специализировать на null, т.е. если сильно хочется nil с чем-то сравнить, то можно:
вот так, например.
Не нужен.
Хеш-мапы точно так же были сделаны. Еще 15 лет назад.
Такое горбатое сишкоблядское рудиментарное убожество как switch не исправят никакие строки. Только могила, только хардкор.
А вот чтоб решить действительно нужные, насущные проблемы: сделать грамотные строки, разбитые на страницы по 4К и решить проблему +=, буферов и subString() на больших строках. Это не.
Ради разминки рекомендую подумать, сколько раз нужно скопировать данные туда-сюда чтобы максимально эффективно считать InputStream в строку?
или наоборот. в любом случае, они тырят друг от друга. и это хорошо.
> чтобы максимально эффективно считать InputStream в строку
зависит от размера буффера.
Любой разумный для универсального использования. Главное - максимально эффективно.
Даю подсказку - эти буфера по 1024 аппендятся в StringBuffer, который потихоньку удваивается копированием.
После чего содержимое буфера опять-таки копируется! В новую строку.
обычно хватает такой.
скажем, для реализации таких протоколов, как HTTP или IRC
длинные данные, как правило, бинарные, для них нужен чистый стрим.
Далеко ходить не буду: размер данной страницы - 55 Кбайт.
> для них нужен чистый стрим.
И сильно со стримом что-либо сделаешь? Регэкс там наложить или найти чего.
Еще раз вопрос:
>сколько раз нужно скопировать данные туда-сюда
Если просто из потока читаем - начинаем с буфера любого "разумного" размера и при каждом чтении увеличиваем размер вдвое, число перераспределений памяти O(log(len(stream))) + 1.
Кстати, шок, хоррор, срочно в номер: StringBuilder так и делает.
Спасибо кеп.
Выше об этом сказано:
http://govnokod.ru/13102#comment179590
В целом же получаем. Как минимум 3 копирования:
1. в массив char[]/byte[]
2. в StringBuilder
3. в String.
А можно-то было обойтись всего одним! То бишь по-прежнему основным двигателем прогресса остаются не сахарные технологии, типа свичей по строкам, а алгоритмы.
Хотя, конечно, это недоработка, что StringBuilder не умеет сам эффективно читать из потока. Тут бы пригодился метод, умеющий передавать Reader.read сразу слайс внутреннего массива StringBuilder.
(Именно Reader. Если мы читаем из InputStream, то byte[] в char[] всё равно кому-то придётся перекодировать.)
Но проблема как раз в том что StringReader неэффективен.
Он содержит внутри себя оный StringBuilder.
> а зачем StringBuilderу уметь читать из потока? для этого есть вполне эффективные Readerы
Reader'у нужен массив, в который он будет писать прочитанные символы. Массив приходится выделять самостоятельно и делать StringBuilder.append, а это операция копирования. Было бы более удобно, если бы можно было скормить Reader'у напрямую внутренний массив StringBuilder'а с нужным смещением.
Как, например, в MFC CString есть операция GetBuffer, хотя вообще, конечно, MFC - тот ещё ужас.
А если это сокет или пайп? Самый эффективный способ, это как выше написал 3.14159265, паровозик из буферов по N байт.
И ведь все эти идеи древнее, придуманы в 70-х или того раньше. Зато хотим бесполезные свичи по строкам.
Прикажете писать портянку из if("текст".equals(str)), которая к тому же медленнее свича?
> сделать грамотные строки, разбитые на страницы по 4К
Создаём тыщу строк по одному символу, и привет, внутренняя фрагментация. Типичная строка в типичном приложении гораздо короче 4K.
Раньше такая проблема была из-за "оптимизации" substring, когда маленький substring от большой строки держал в памяти всю большую строку. Сейчас это убрали.
Будет тысяча строк с массивом на один символ.
вообще, это очень холиварный вопрос.
я лично думаю, что так сделали, потому что редко кого интересует реализация виртуальной машины, и делают обычно все примитивно. грустно, но факт
Хорошая годная была оптимизация. Раньше substring был O(1) - явное следствие COW.
И весь старый код заточен на это.
Теперь же начиная с богомерзкой 7-й явы O(N).
ИМХО, сделали еще бОльшее Говно.
> Раньше substring был O(1). И весь старый код заточен на это.
Затачиваться на детали реализации - ССЗБ. В документации где-нибудь написано, что substring должен быть O(1)?
Хотите O(1) - пишите свой substring, это даже не так сложно.
Рекомендую внимательно прочитать мои посты выше.
>Берём строку в стопицот символов и оставляем substring на один символ.
Берём строку в стопицот символов обрезаем джва проблема сначала и с конца.
Теперь у нас две практически идентичных строки по 100500 символов.
Еще неизвестно что хуже. Перерасход памяти адский, но зато стал явным!
Хотите нормальных строк - пишите сами.
Нормальный такой библиотечный подход, да.
В Обычной Жизни (tm) substring за O(1) - слишком узкоспециализированная операция, чтобы ради неё таскать аж два дополнительных поля и риск внутренней фрагментации.
Ну-ка покажите мне как с их помощью искать регэксом в стриме. Или сделать простой replace.
Особенно интересует поиск на границах буферов.
replace - только в строку, но тут-то хоть как придётся выделять новый массив, что с CharBuffer, что с substring.
Особенно интересует поиск на границах буферов.
Ведь ваш CharBuffer явно не бесконечный.
Проблема в том чтобы делать что-то нормальное с набором байт из потока нужно сначала сделать кучу ненужных копирований...
Достаточно простые случаи можно скормить Scanner. Для остального есть jakarta regexp, который поддерживает поточную обработку.
Конкретно у меня речь шла о том, что аналог O(1) substring в стандартной библиотеке есть. Что ещё надо?
То еще говно. Причем несмотря на CharBuffer и nio тормознутее чем остальные io способы.
Достойно отдельного треда.
Вкратце расскажу как оно работает и решает проблему границ.
Когда буфер заканчивается, оно создает новый.
Копирует туда все что начитало раньше плюс то что начитало только что.
И, сюрприз! начинает применять регэкс на новом буфере с самого начала (или места последнего матча).
Короче копирований там дохерища. Еще и шлемиэльщина.
>есть jakarta regexp, который поддерживает поточную обработку.
Да есть много third-party либ.
Изначально же говорилось - они занимаются херней какой-то, вместо того чтобы сделать нормальные стандартные строки, io и буфера.
Какие операции должна поддерживать "нормальная стандартная строка"?
Data.ByteString наше всё
>"Нормальные стандартные строки" - это какие?
Что в хацкиле строки настолько хорошо зделаны. Практически образцово.
На io вполне запросто могут уделать по памяти/cpu жабу, шарп и кривые самописные крестоподелия. И это несмотря, на иммутабельность!
Плюс. Думаю зеленый цвет тут не нужен.
append :: ByteString -> ByteString -> ByteStringSource O(n).
Хотя нет уж. Rope наше всё.
В жабе алгоритмическая культура развита только там где код пишут люди с учеными степенями - java.utl.concurent. В шарпе она вообще практически отсутствует - не было наборов до 3.5. Хацкиль выглядит оплотом алгоритмики и за счёт неё может запросто уделать их.
Приказываю разбираться с хеш-мапами и енумами.
Мне не особо нужен свитч по строкам, но и хэш-мапа не всегда подходит.
Енум. Просто добавь valueOf(String).
Прикажете для неизвестных строк (аналог default в свиче) ловить исключение в Enum.valueOf?
а) писать default
б) кидать из него исключение Unsuppoted...
С иключениями такой прикол, что ловить их можно где угодно и как удобно. Кто не понял этого, тот мучается и пишет столько try-catch, что кода больше чем у Тараса проверки retVal.
Это не только не аргумент против, наоборот "за".
Век замыканий не видать,
Литералов для хешмепов тоже не видать.
Поебать!
Фабрика легко и непринужденно
Помещается в очке.
Что нужно еще?
Кстати, не пойму, почему они выбрали 0 в качестве специального значения.
Не проще ли было бы сделать хэш типом Integer вместо int и использовать null как флаг "хэш ещё не закэширован"?
Дополнительный булев флаг по памяти был бы таким же как Integer, но эффективней.
а есть пример ненуллевой строки, у которой нулевой хэшкод?
Нужно решить несложную систему уравнений, где сумма кратна 2^32.
Тривиальный случай: строка полностью состоящая из 0.
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
Мда. Странно. До того как я выложил позавчера свой скрипт, он только бегал со смегмой на губах упрашивая дать ему разворачивалку комментов.
А там всего-то строчку написать:
$('.comment-text').click();
А какой смысл выёбываться DOM, если строчкой ниже всё-равно юзаешь jquery?
>els=
Не питонист, ли ты мил человек?
2-е не работает.
Срамной уебок. У тебя малафья на губах еще с прошлого раза осталась.
>сасай двачеблядь
Анонимным пидорским сленгом тут пишешь только ты.
твой сленг в тебе выдает гомосексуалиста
>els=document.getElementsByClassName ('comment-text'); for(i=0,l=els.length;i<l;++i)els[i].style.display='block';
И остается строка - показать все, что скрыто
Мой сленг прямо посылает тебя на хуй.
Сначала отрасти руки из нужного места. Твои бесполезные DOM-говноскрипты никому тут не нужны.
Кстати, а страйко разве карантин после регистрации отключил?
карантин сколько сейчас? неделю? вот она и истекла
И вообще откуда постоянно подозрения на старых.
Этои летний сезон отмечен новыми вспышками бугурта и мы имеем дело с новым штаммом долбоёба.
В интернетах таких водится овердохуя.
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
$('.ajax').closest(":not([href=http://govnokod.ru/user/5798])").trigger('click');
http://rghost.ru/46605574
Неужели говнокод катится в сраное?