Тот, где ты в качестве оправдания говоришь, что сначала пишешь код переполненный избыточными токенами, а потом кропотливо их убираешь в release? Не, не читал
Это не оправдания, так как я вам ничего не должен чтобы оправдываться, а утверждение того как мне удобно писать код, так как он не законченный вариант и может измениться вместо аргумента принимаемого как call by value к call by reference. Теперь яснее?
Неужели? Когда находится решение лучше предыдущего, вы оставите как есть? С таким иррациональным рассуждением многое бы попросту не переписывалось и не улучшалось, не так ли?
Во-первых, не три версии функции, а три разные функции. Во-вторых, для разделения сущностей. В-третьих, для четкого обозначения что каждая проверка делает. И в-четвертых, для избежания возможной копипасты, естественно. Бу-го-га. Лично ты используешь код этого "новичка" чуть ли не круглосуточно. Причем разный, причем много лет. Угу, и лепи все в одну кучу так, чтобы никто (включая себя любимого через три месяца) не мог понять, что написано. И успешно каждый раз чтобы создавал новую версию той же функции, но уже понятную. После компиляции мой и ваш код будут одинокавыми. Но мой сможет понять и поддерживать любой джун даже через много лет. Точно то же самое, что и у вас, естественно. А по коду это не видно. Не потому ли, что таки говнокод? )) Кисо обиделось? Любимую функцию назвали говнокодом? В каком именно стиле не писать? Не приводить пример отрефакторенного кода для обсуждения? Заметьте, я ни разу не написал "так пишут новички".... Может на "говнокод" обиделись? Так мы все регулярно говнокод пишем, потому что век живи - век учись. Я вот на свой код 10-летней давности без слез смотреть не могу, причем это обычно слезы смеха ) Я давно специализируюсь на асме и низкоуровневом С. Но приходится по роду деяйтельности регулярно писать на с++, джаве и лиспе.
ol., Начнем. Для этого есть cctype и функции такие как isupper, islower, etc, но самое главное что у меня есть собственные функции, которые обрабатывают содержимое собственного класса String, поэтому вы не зная мой код проявляете инициативу не нужную, основываясь на куске кода. Не то же самое, у меня там кирилица чекается, а у вас из названия уже понятно, то что не символ. То что не символ в другом диапазоне чекается, посмотрите что ль таблицу кодировок. На остальное не считаю нужным отвечать.... Пишите по делу.
Ууууу, так у вас еще все и на контекст завязано? Отлично, и после этого вы свой код называете хорошим? Любая, я подчеркиваю, любая функция в коде должна быть понятна без того, чтобы рассматривать и разгребать контекст. У меня под руками вот прямо сейчас лежит 30 тысяч файлов на 300 метров сорцов. Я что, должен перелопатить их все, чтобы понимать что нужная мне функция делает? Как написали, так я и понял. Я не против поменять название функции на что-то более правильное. После замены названия на non_cyrillic() или что-то похожее данная претензия к приведенному примеру пропадет? Вы обидчивы, сударь. Сначала выдает "если вы в том же тоне...", а сам тут же второй раз подряд пытается оскорбить. Короче, все с Вами, понятно. Кодить не умеете, но вместо того, чтобы слушать умных людей и учиться, начинаете нести какую-то охинею. Думаю, на этом можно заканчивать.
[delete] Незнание вас не принуждало писать в данной теме и то чего вы не знаете в моих глазах вас не унижает. Конечно хорошим, так как вы опять пишите не зная, функционал вынесен в отдельный файл который использует класс, чтобы не было каши.
ol., это священная аски кодировка, ничего сложно и не читаемого в ней нет. Возможно это наглость, но поймите меня правильно, покажите мне свой код на плюсах или сишечке? Желательно ваш, а не коллег.
Я поддерживаю ol., таки да, говнокод. Вот понадобится вам раздельный функционал, будете плодить сущности сами. И более того - МАГИК НАБМЕР БЛЭТ
Ещё раз, этот диапазон нужен дабы использовать его в собственных функциях таких как isupper, islower, swapcase, так и зачем мне их ещё раз дублировать?
Вы не думаете об архитектуре, вы думаете в стиле "Я сэкономлю немного места , помещу все в 1 функцию". Но вы не думаете, что могут потребоваться другие функции. И что совсем не наглядно использовать для одной цели, функцию, которая делает совсем другое. Это противоречит правилу "не создавать функций двойного назначения"
TermoSINteZ, частично с вами согласен, но частично нет. Не согласен в том, так как у функции все же своя задача, которая работает с диапазонами и если абстрагироваться до задач, то так можно рекурсивно дойти до крайностей, моя же функция выполняет свою обобщенную задачу. Согласен с тем что так читабельнее, так легче человеку который будет разбирать код понять что происходит, управляемость именно в зависимости от того какой диапазон нужен, etc.
Код говно. 1. const не нужен. 2. Символы надо сравнивать с символами. 3. Я бы закастил принудительно к unsigned и работал с этим, т.к.: а. никогда не видел, чтобы у символов были отрицательные коды; б. количество проверок уменьшится как минимум на одну, а каст signed -> unsigned вообще ничего не стоит. 3. return true, return false для булевского выражения... Так студенты колледжа на третьем курсе у меня пишут, и я их больно бью за это гусями.
SadKo, перечитайте ветку, вы повторяетесь, тут уже на две страницы трештока. Со многими пунктами согласен, с некоторыми нет, дело в том что функция работает не только с латиницей, но и с кириллицей. Символы можно сравнивать и с кодами. ASCII:
Да кто сейчас с однобайтовой кириллицей работает? Сейчас либо utf8, который надо передавать как const char*, либо utf16, который wchar_t.
Подведем итоги. Сел вчера и на свой ляд переписал с уклоном варианта ol., Код (C++): inline bool russ_uppercase(const char &ch) { return (ch >= 'А' && ch <= 'Я'); } inline bool russ_lowercase(const char &ch) { return (ch >= 'а' && ch <= 'я'); } inline bool uppercase(const char &ch) { return (ch >= 'A' && ch <= 'Z'); } inline bool lowercase(const char &ch) { return (ch >= 'a' && ch <= 'z'); } inline bool is_valid_character(const char &ch) { return russ_uppercase(ch) || russ_lowercase(ch) || uppercase(ch) || lowercase(ch); } А вот одна из функций что обращается к некоторым из них: Код (C++): char *upper(char *dst, const char *src) { char *pd = dst; const char *ps = src; while(*ps) { if(russ_lowercase(*ps) || lowercase(*ps)) *pd++ = (*ps++ & 223); else *pd++ = *ps++; } return dst; } Здесь при каждой итерации приходится обращаться к 2-ум функциям, но функция swapcase обращается к is_valid_character, которая в свою очередь обращается к 4-ем функциям, что в итоге приводит при каждой итерации вызов 5-ти функций. Убрал указатели по совету SadKo, вместо них заюзал ссылки, так как это рациональнее на мой взгляд. Естественно, так как они у нас не рекурсивны, etc, то сделал их inline, дабы можно было сделать инлайн подстановку. rmn, вот и const стал нужен, об чем я и говорил, что мне так удобнее писать, дабы потом не было упущений. Что потерялось? Хардкор который умещался в 3-строках и заключался в единственном вызове функции. Какие плюсы? Читабельность и больше гибкости при необходимости проверять вместо 4-х диапазонов, всего лишь два.