Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Привычный для всех плюсовиков велосипед по работе со строкой (походу свой в каждом проекте).
Более 10 лет не замечали тормоза в componentsSeparatedByString, который 100 Кб текст разбирал на строки за 5-10 сек (!!!).
Не понимаю, в языке же есть поддержка ООП, почему её не используют? Почему, например, получение размера строки нельзя прокешировать при изменении строки и затем брать из отдельного метода класса CStringUtf8, вроде length()?
В чём логика передачи пустой строки как аргумента метода componentsSeparatedByString()? Куда разумнее здесь было бы бросить assert, нет? Если уж смысл в том, чтобы вернуть массив, содержащий единственный элемент, равный исходной строке (хотя, как мне кажется, логичнее при пустом аргументе было бы разбить всю строку по символам и вернуть массив этих символов), почему нельзя сделать отдельную проверку в самом начале с последующим простым возвратом из метода, вместо того чтобы считать размер строки и брать подстроку равную исходной строке?
subString() делает что-то уж совсем сложное, почему просто не сделать clamp() по 0, размеру строки и стартовому индексу и передать первым параметром со сдвигом по внутреннему указателю, а затем, аналогично, clamp() по 0, размеру строки и размеру подстроки, передав полученный результат со сдвигом по указателю вторым параметром в конструктор класса? Так нельзя?
Про findSubString() уже всё сказали выше. Опять же, я бы тоже не позволял просто так в метод передавать пустой аргумент в качестве строки поиска или делал бы такую проверку отдельно в самом начале и возвращал 0.
Я не особый специалист по плюсам, возможно, где-то херню написал.
Не понимаю, в языке же есть поддержка ООП, почему её не используют?
Не понимаю, в языке же есть поддержка процедурного программирования, почему её не используют?
Не понимаю, в языке же есть поддержка ФП, почему её не используют?
Не понимаю, в языке же есть поддержка АОП, почему её не используют?
Не понимаю, в языке же есть поддержка Си, почему её не используют?
Не понимаю, в языке же есть поддержка макросов, почему её не используют?
Не понимаю, в языке же есть поддержка шаблонов, почему её не используют?
Не понимаю, в языке же есть поддержка комплексных чисел, почему её не используют?
да там все алгоритмы с какой-то херней работают. Проще цикл написать, чем у кого-то занимать чем алгоритмы заюзать. Поневоле скриптушатникам завидовать начинаешь.
У скриптушатников тоже не у всех всё гладко. В том же js куда не сунься, везде свой dosomething.js, а стандартная либа настолько нищая, что поневоле понимаешь, почему люди всякие реакты и ноды так любят.
Метода length() нет за ненадобностью. Что он должен возвращать? Кол-во кодепоинтов? Где это может потребоваться? Есть lengthInBytes(), который считается как разность указателей.
Пустые строки и впрямь никто не рассматривал. Возможно в тестах бы и проверили, но тестов нет. Любой, кто будет передавать пустые строки - ССЗБ.
subString() отсчитывает кодепоинты и выдергивает подстроку, передавая указатели в конструктор. Считаю, что передавать позицию в кодепоинтах также бессмысленно как и считать в них длину строки.
clamp в 2005 не было. Описанный алгоритм не понял, почитаю позже.
Кстати проблема с тормозами решилась добавлением версии subString() с итераторами.
> Пустые строки и впрямь никто не рассматривал. Возможно в тестах бы и проверили, но тестов нет. Любой, кто будет передавать пустые строки - ССЗБ.
Как же вы можете доверять работе написанного кода, если у вас все предусловия прописаны неявно и никак не контролируются? Вы же не будете рассказывать каждому новому программисту о том, какая специфика работы каждого из написанных методов? ) Или у вас подробная документация есть? Но даже если так, документацию к классам читают обычно, когда что-то не работает, по-хорошему, интерфейс должен работать предсказуемым образом )
Да, вряд ли кто-то явно будет передаст указатели друг на друга в качестве параметров, но ведь любая ошибка в связанном коде — и они могут там оказаться.
Я понимаю, что это не ваш код, но и защищать его по принципу «это не код небезопасный, а программист глупый» тоже не очень правильно )
> subString() отсчитывает кодепоинты и выдергивает подстроку, передавая указатели в конструктор. Считаю, что передавать позицию в кодепоинтах также бессмысленно как и считать в них длину строки.
Я понял, ошибся, перепутал размеры сдвига у итератора с переданным размером строки.
> clamp в 2005 не было.
Он реализуется в одну-две строки ) Но не суть.
bormand # 0
Да пофиг на тормоза, функция findSubString() вообще не рабочая. Попробуй найти "aab" в "aaab", к примеру.
Desktop # 0 ⇈
jojaxon # 0 ⇈
Тесты - это больная мозоль. Их мало, но они в тельняшках.
Rooster # 0 ⇈
Не могла же она просуществовать 10 лет некорректная?
jojaxon # 0 ⇈
Rooster # 0 ⇈
У меня мозг протух.
Web_Monkey # 0 ⇈
Ща говном кидатся начну! Уук! Уук! Кууик!
softpawww # 0
В чём логика передачи пустой строки как аргумента метода componentsSeparatedByString()? Куда разумнее здесь было бы бросить assert, нет? Если уж смысл в том, чтобы вернуть массив, содержащий единственный элемент, равный исходной строке (хотя, как мне кажется, логичнее при пустом аргументе было бы разбить всю строку по символам и вернуть массив этих символов), почему нельзя сделать отдельную проверку в самом начале с последующим простым возвратом из метода, вместо того чтобы считать размер строки и брать подстроку равную исходной строке?
subString() делает что-то уж совсем сложное, почему просто не сделать clamp() по 0, размеру строки и стартовому индексу и передать первым параметром со сдвигом по внутреннему указателю, а затем, аналогично, clamp() по 0, размеру строки и размеру подстроки, передав полученный результат со сдвигом по указателю вторым параметром в конструктор класса? Так нельзя?
Про findSubString() уже всё сказали выше. Опять же, я бы тоже не позволял просто так в метод передавать пустой аргумент в качестве строки поиска или делал бы такую проверку отдельно в самом начале и возвращал 0.
Я не особый специалист по плюсам, возможно, где-то херню написал.
Web_Monkey # 0 ⇈
Не понимаю, в языке же есть поддержка процедурного программирования, почему её не используют?
Не понимаю, в языке же есть поддержка ФП, почему её не используют?
Не понимаю, в языке же есть поддержка АОП, почему её не используют?
Не понимаю, в языке же есть поддержка Си, почему её не используют?
Не понимаю, в языке же есть поддержка макросов, почему её не используют?
Не понимаю, в языке же есть поддержка шаблонов, почему её не используют?
Не понимаю, в языке же есть поддержка комплексных чисел, почему её не используют?
Как же без всего этого со строками то раьотать?
bormand # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
Needless # 0 ⇈
Какой C++ )))
bormand # 0 ⇈
Needless # 0 ⇈
bormand # 0 ⇈
jojaxon # 0 ⇈
softpawww # 0 ⇈
softpawww # 0 ⇈
Ну вы тогда или крестик снимите, или штаны наденьте ) Или используйте ООП, или нет. А то набрали классов, а что с ними делать — хз )
jojaxon # 0 ⇈
Пустые строки и впрямь никто не рассматривал. Возможно в тестах бы и проверили, но тестов нет. Любой, кто будет передавать пустые строки - ССЗБ.
subString() отсчитывает кодепоинты и выдергивает подстроку, передавая указатели в конструктор. Считаю, что передавать позицию в кодепоинтах также бессмысленно как и считать в них длину строки.
clamp в 2005 не было. Описанный алгоритм не понял, почитаю позже.
Кстати проблема с тормозами решилась добавлением версии subString() с итераторами.
softpawww # 0 ⇈
Как же вы можете доверять работе написанного кода, если у вас все предусловия прописаны неявно и никак не контролируются? Вы же не будете рассказывать каждому новому программисту о том, какая специфика работы каждого из написанных методов? ) Или у вас подробная документация есть? Но даже если так, документацию к классам читают обычно, когда что-то не работает, по-хорошему, интерфейс должен работать предсказуемым образом )
Да, вряд ли кто-то явно будет передаст указатели друг на друга в качестве параметров, но ведь любая ошибка в связанном коде — и они могут там оказаться.
Я понимаю, что это не ваш код, но и защищать его по принципу «это не код небезопасный, а программист глупый» тоже не очень правильно )
> subString() отсчитывает кодепоинты и выдергивает подстроку, передавая указатели в конструктор. Считаю, что передавать позицию в кодепоинтах также бессмысленно как и считать в них длину строки.
Я понял, ошибся, перепутал размеры сдвига у итератора с переданным размером строки.
> clamp в 2005 не было.
Он реализуется в одну-две строки ) Но не суть.
jojaxon # 0
gost # 0 ⇈
This.