- 1
- 2
// FxCop does not allow the string "Uri" in a method name that does not return a Uri object.
public static string To_U_r_i_TypeString(DeviceType type)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+114
// FxCop does not allow the string "Uri" in a method name that does not return a Uri object.
public static string To_U_r_i_TypeString(DeviceType type)
vladthesparrow 27.12.2012 10:35 # 0
Steve_Brown 27.12.2012 10:41 # +3
absolut 27.12.2012 13:17 # +1
bormand 27.12.2012 14:00 # 0
absolut 27.12.2012 15:48 # +3
Steve_Brown 28.12.2012 10:38 # +2
roman-kashitsyn 27.12.2012 14:04 # +3
anonimb84a2f6fd141 27.12.2012 21:05 # 0
Если оно будет транслейтить код в lisp Scheme, то даже наоборот слишком сложно.
bormand 27.12.2012 21:10 # 0
bormand 27.12.2012 14:53 # +1
@SuppressCop("uri")
roman-kashitsyn 27.12.2012 15:28 # +6
Yuuri 29.12.2012 11:11 # +1
dirtygopher 27.12.2012 15:38 # +1
vladthesparrow 28.12.2012 09:47 # 0
bormand 28.12.2012 10:43 # +3
Исключения есть из любых правил. Я, конечно же, имею в виду обоснованные исключения, а не "мне хочется назвать эту функцию toUriTypeString". Поэтому в FxCop должен быть механизм (и он есть!), чтобы не выпендриваясь в стиле to_u_r_i_TypeString указать, что я выслушал требования, но в моей ситуации они не актуальны. И еще необходима возможность просмотреть список подавленных предупреждений (скорее всего и такая фича тоже есть).
А отключать полезную утилиту и не юзать ее из-за одного false-positive - глупость какая-то (как впрочем и попытки обойти требования через жопу, как в топике, вместо банального SuppressWarning).
Steve_Brown 28.12.2012 11:03 # +2
:(
vladthesparrow 28.12.2012 11:17 # 0
Интересно, а какая связь между Microsoft.WindowsMobile.DirectX.Direct3D .DeviceType и URIFormattedString?
bormand 28.12.2012 11:46 # +2
- Нуб отключает все ворнинги и не юзает lint'ы и fxcop'ы считая, что они не нужны и показывают всякую херню.
- Наломав дров набравшись опыта он включает ворнинги до упора и бездумно пытается исправлять все-все ворнинги, при этом он боится их подавлять, ведь это же "стандарты" и "их писали не дураки".
- В конце-концов программист понимает, что все эти ворнинги существуют не для того, чтобы усложить ему жизнь, и фанатично терять часы на их исправление, а для того чтобы помочь ему обнаружить возможные ошибки, и понять что он делает не так. Он внимательно читает ворнинги и советы FxCop'а, и осознанно подавляет те, которые неактуальны в его ситуации.
Пример: android lint вчера сказал мне, что создавать SimpleDateFormat вручную некошерно, и следует воспользоваться стандартными инстансами, которые уже корректно настроены на пользовательскую локаль. Хороший совет? В 99% случаев да. Но не в моем, т.е. мне действительно нужна была дата в конкретном, жестко зафиксированном в ТЗ формате.
> Интересно, а какая связь между Microsoft.WindowsMobile.DirectX.Direct3D .DeviceType и URIFormattedString?
Да хрен бы его знал, я про пример из топика не хочу спорить. Это естественно не тот случай, в котором нужно подавлять ворнинг.
vladthesparrow 28.12.2012 12:09 # +1
vladthesparrow 28.12.2012 12:13 # 0
absolut 28.12.2012 13:42 # +2
переходим на троичные компы, посаны.
vladthesparrow 28.12.2012 14:09 # −5
defecate-plusplus 28.12.2012 15:02 # +4
потому что бинарный и семеричный как бы взаимоисключащие вещи
vladthesparrow 28.12.2012 15:27 # −7
eth0 28.12.2012 19:58 # +4
absolut 28.12.2012 20:52 # +5
LispGovno 28.12.2012 23:37 # +1
А ещё 7 это:
&87
3.14159265 28.12.2012 21:04 # +3
Скорее "упоротый".
bormand 28.12.2012 21:56 # +4
Возможно вы имели в виду именно битардный.
roman-kashitsyn 28.12.2012 11:45 # +2
bormand 28.12.2012 11:53 # +1
Мне вот андроидовый линт очень нравится, хоть иногда и выдает ворнинги не в тему. Очень годные советы выдает, особенно для только начинающего разбираться в платформе, такого как я.
roman-kashitsyn 28.12.2012 12:04 # 0
bormand 28.12.2012 12:15 # +1
Ну это уже имхо мазохизм, мешающий работать. Проще иногда, когда никаких идей нету, садиться и вычищать ворнинги.
wvxvw 28.12.2012 21:28 # +3
Есть непридуманная история про пакистанскую девочку Шилпу, которая как-то попала к нам в проект подмастерьем. Она была, ну по крайней мере поначалу, очень исполнительным и трудолюбивым сотрудником. В AS3 есть свое подобие lint'a - FlexPMD. Эта... замечательная утилита определяет все слушатели событий (в которых есть обязательный аргумент - событие), как функции с неиспользуемыми аргументами. Т.как в проекте предупреждений от этой утилиты было несколько тыщ, то девочке отдали на поправить, ну, чтобы познакомить с проектом и вообще, с инструментами...
В следующем коммите все слушатели событий были либо удалены, либо нерабочие.
bormand 28.12.2012 21:42 # +1
Ну откатили коммит, провели девочке инструктаж о том, что она сделала не так, и как надо делать, и все счастливы. Тоже мне проблема.
> как функции с неиспользуемыми аргументами
Ненавижу, кстати, этот ворнинг. В крестах очень много виртуальных функций им помечается, и толку от него почти нет, из-за огромного количества false-positive ;( Приходится или отключать его совсем, или давить через (void)param или Q_UNUSED(param).
P.S. А какого ж хрена вы этот ворнинг не отключаете совсем, или не подавляете в каждой функции, где он вылезает? Не вижу никакого смысла в стенах ворнингов, выдающихся при каждом старте линта. Среди них же полезные ворнинги потеряются, и внимание программиста рассеится из-за того что каждый раз их пролистывать...
P.P.S. А, понял, ей и отдали этот проект на зачистку ;)
wvxvw 28.12.2012 22:22 # 0
У линта есть дефолтные настройки и, конечно, их можно было заменить, но всем настолько было наплевать, (особенно ввиду того, что ошибок было ну просто очень много), что никто и не обращал внимания. Кроме того, он эти ошибки отрватительно распечатывает, к его распечаткам нужен еще отдельный просматриватель. Ну, а когда, опять же, ошибок очень много то как ни распечатай, все равно после пары страниц скучно станет.
bormand 28.12.2012 23:35 # +1
Инфаркт... ну кто в этом виноват? Не девочка конечно же. А тимлид который не пояснил про системы контроля версий, и не проследил за новичком, не занимался code review хотя бы поверхностно.
Инфаркт - это когда вынес таблицу из боевой базы... А код одной командой откатывается.
wvxvw 29.12.2012 00:27 # +2
1. Нанять бойцов с оДеска или Ланца и в экстримально сжатые сроки написать как можно больше кода, используя как можно больше барахла от третьих лиц.
2. Нанять дочку соседа на поддержку проекта, предварительно распросчавшись с бригадой, и потеряв какую-то часть исходников.
3. Понять, что дальше так жить нельзя, и попытаться нанять на постоянную работу кого-нибудь более-менее знающего.
(На самом деле пункты 1-2 могут повторяться до того, как дойдет до 3).
Когда такой проект попадает в руки, то нужно как-то бороться с тяжелым наследием, ну и линт, как одна из попыток что-то сделать. Но как правило, только привести проект в состояние, когда линт вообще может обработать все исходники - само по себе непосильный труд... Девочку тогда и брали в штат для того, чтобы разгрузить более опытных.
Ну и жалко ее было, человек старался, она пару недель потратила на свой первый коммит...
bormand 29.12.2012 05:25 # +3
Вот в этом и проблема. Недосмотрели. Не спросили ни разу как идет работа. Ну кто ж так с новичками поступает...
wvxvw 29.12.2012 11:12 # +1
bormand 29.12.2012 15:00 # +1
Вот в следующий раз не поленитесь, заведите приватную репу на каком-нибудь битбакете или у себя на сервере, дайте новому работнику доступ на запись, и поясните, что каждый день нужно в обязательном порядке пушить все что было сделано.
Поверьте, и работа будет идти намного эффективнее, и не потеряете наработки, если сотрудник забьет и свалит до окончания срока, и если что случится - проблемы можно будет заметить до того как они станут фатальными. Полчасика в день, потраченные на просмотр коммитов, имхо не будут потрачены в пустую...
LispGovno 29.12.2012 05:54 # 0
Виноват наставник, а не девочка
absolut 29.12.2012 07:47 # −5
bormand 29.12.2012 15:04 # +1
absolut 29.12.2012 18:12 # +3
3.14159265 28.12.2012 21:09 # +4
Выдавать ворнинг:
@SuppressCrap(["china","copy-paste"])
Еще полезно детектить всякие велосипеды:
@SuppressCrap("php-dates")
>CRITICAL ERROR: статическую переменную с маленькой буквы
Лол. Вот если бы еще checked exceptions на ворнинги заменить.
bormand 28.12.2012 21:34 # 0
Ну да, какой-нибудь атрибутик в виде @SuppressException(IOException), который заставляет компилер завернуть чекед исключение в RuntimeException, чтобы не писать это говно руками.
roman-kashitsyn 29.12.2012 00:07 # +2
все нормальные жабозаменители (clojure, scala, groovy) выпилили checked exceptions
3.14159265 29.12.2012 14:50 # +2
С#
>выпилили checked exceptions
Один из недостатков исключений, описываемых Тарасом - непонятно что и где вылезет.
3.14159265 29.12.2012 14:49 # +1
Не-не. Это оверхед в виде лишнего объекта.
JVMу на эти checked исключения насрать. Просто чтоб компилер собирал.
Сам я вообще никогда их не заворачиваю. А кидаю тот же unchecked через хак.
bormand 29.12.2012 15:05 # 0
Можно примерчик?
3.14159265 29.12.2012 15:13 # 0
Самое простое конечно Thread.stop(e). Но мы не ищем легких путей.
bormand 29.12.2012 15:22 # 0
An additional danger of this method is that it may be used to generate exceptions that the target thread is unprepared to handle (including checked exceptions that the thread could not possibly throw, were it not for this method). Прелестный метод.
> оверхед в виде лишнего объекта
Кстати, а стоят ли эти хаки того? Куча в яве шустрая, исключения достаточно редки (если кидать их только в исключительных ситуациях, а не по-питонски)...
3.14159265 29.12.2012 15:24 # +1
>Прелестный метод.
Та да.
Вот потому надо всегда в каком-то корневом методе писать catch(Throwable)
LispGovno 29.12.2012 17:52 # +2
http://www.youtube.com/watch?v=G7YiwTpQdT8
3.14159265 29.12.2012 15:30 # +1
А потом еще разворачивать вложенные исключения.
И тип херится. А так можно ловить тот же IOException, если хочется.
И я уверен на 99% что моя статика в посте ниже заинлайнится, так что оверхеда нет.
Ну можно экономить на спичках хотя бы так:
bormand 29.12.2012 15:59 # 0
> Ну можно экономить на спичках хотя бы так
Ну да, в трассе некошерно смотрятся все эти caused by. Но с другой стороны top level заглушек, отлавливающих все-все-все в программе не так много. Можно уж пару-тройку раз вытряхнуть из пойманного экцепшена cause.
> если хочется
Ну судя по превращению в анчекед не особо и хочется...
> И я уверен на 99% что моя статика в посте ниже заинлайнится, так что оверхеда нет.
Кстати, а можно ли как-то в яве посмотреть, чего там наджитил джит, или это совсем черный ящик?
3.14159265 29.12.2012 16:04 # +1
https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly
Кстати вот всё хочу проверить как инлайнится полиморфизм и всякие виртуальные методы унаследованные от интерфейсов типа String.length(), а руки не доходят.
Только по-хорошему надо с включенным -server проверять.
3.14159265 29.12.2012 15:23 # +2
http://ideone.com/iZwMmh
bormand 29.12.2012 15:47 # 0
Че-то я туплю, почему каст Exception в RuntimeException в предпоследней строке не падает...
Потому что это тупо синтаксический сахар, и на самом деле там получается каст не в RuntimeException, а всего лишь в Throwable (т.к. T extends Throwable), а компилятору заткнули рот саппрес ворнингом, чтобы он не ругался на каст в хуй пойми что (без саппресса он бы съел только RuntimeException e)?
3.14159265 29.12.2012 15:54 # 0
Магия генериков. Чудеса тут: <RuntimeException>
Есть еще способ. Можно вообще без ворнингов и депрекейшнов написать.
Но он некрасивый, требует ресурсов и не инлайнится.
LispGovno 29.12.2012 17:56 # +2
3.14159265 29.12.2012 18:30 # +3
Так точно!
3.14159265 29.12.2012 19:29 # +3
Так это по сути неотключабельная проверка компилера - вот это основной недостаток.
В подтреде речь и идет о неотключаемых чекерах и инспекторах.
Например хочу сделать какой-то хак, я знаю что так делать нехорошо, но понимаю что вот здесь мне он _нужен_.
А компилер не дает. Потому что слишком умный.
Никто не любит слишком умных.
bormand 29.12.2012 19:41 # 0
3.14159265 29.12.2012 20:03 # 0
http://rghost.ru/42605788
Суть такова. Можно поставить Ignore, Warning, Error.
И если пользователь поставил error, то не дает компилить. Хочешь warningи жолтые набигают. А уж в коде их глушить: @SuppressWarnings("checked exceptions")
Можно вообще забить. Джва года жду такую опцию.
bormand 29.12.2012 20:28 # +1
Там почти в каждом методе (даже в put!) может выброситься JSONException, который надо обрабатывать. По какой же причине он кидает это исключение?
Методы put: Throws: JSONException - If the key is null.. WTF??!! непроверяемый NullPointerException чем не угодил? В конце-концов если я в качестве ключа передал null, то мой код явно невменяем, и заслуживает рантайм экцепшена...
3.14159265 29.12.2012 20:56 # +1
При всем уважении к долбоёбам имею подозрения что писал Крокфорд. JSONObject лютый олдскул. Гумно еще в детский сад ходил когда её написали. Тогда checked был в моде.
Достаточно неделю поработать с Connection Statement и ResultSet как начинается страшная аллергия.
Без удобных либ-обёрток в жабе ловить вообще нечего.
Gson батенька, gson. Хотя для андроида так просто не прокатит, согласен.
bormand 29.12.2012 21:08 # 0
Понятно, тогда простительно.
Да на самом деле там можно приложить пачку jar'ов с нужными либами к проекту, и при сборке они упакуются в dex. Скорее всего и GSON можно таким образом туда пропихнуть. Просто влом ради джвух мест, в которых он используется.
> ResultSet
SQLFeatureNotSupportedException порожден от Exception?! Мда, хардкор такой хардкор, имхо кинули бы UnsupportedOperationException да и все... Может я чего-то в жабе не понимаю?
TarasB 29.12.2012 22:40 # +1
3.14159265 29.12.2012 22:57 # +2
Исключения в любом языке - это плохо, потому что в жабе они проверяемые и это никак не отключить.
Не кажется ли вам, сер, что мы видим экстрагированные ЖАБАПРОБЛЕМЫ.
wvxvw 29.12.2012 16:22 # +1
Каст к парамтеру типа в рантайме превращается в каст к Object т.е. просто выбрасывается, т.как примитивы не могут быть параметрами типа.
bormand 28.12.2012 21:28 # 0
На самом деле если в корпоративном style guide написано, что статические переменные начинаются с заглавной, и весь остальной код написан в таком стиле, то инспектор все правильно делает.
> в твоём if больше трёх условий!
Ну это опытному программисту кажется, что такой ворнинг только нозит, т.к. опытный программист и сам чувствует, когда 3 условия в ифе это плохо, а когда можно написать 5-10.
А вот для неопытного джуниора, пытающегося запихать в один иф какое-нибудь говнище, это вполне полезный намек.
P.S. Вот мне кажется, что это должно работать как-то так - не нравится придирка инспектора - подавляешь ее. Затем более старший и опытный товарищ просматривает списки подавленных ворнингов, и или оставляет как есть, или объясняет подавившему что он делает не так, или же, если имеет такое право, вносит изменения в настройки инспектора...
3.14159265 29.12.2012 21:45 # +1
Ну уж нет. Это перебор, даже языков с кучей граблей.
-Wall навеки.
bormand 29.12.2012 21:50 # +1
как-то так еще
Умело бы оно еще не показывать этот ворнинг на виртуальных методах, но показывать на остальных - цены бы не было.
TarasB 29.12.2012 22:38 # 0
А на задовызовах ты либо пиши в заголовке только тип параметра, без названия, либо в начала метода пиши (void)foo, либо
Последнее из Ады
bormand 30.12.2012 09:07 # +1
Крестоблядство же, в сишке так нельзя.
> либо в начала метода пиши (void)foo
Ну собственно так и делаю, а в Qt использую макрос Q_UNUSED, который раскрывается в тот же код.
defecate-plusplus 30.12.2012 10:18 # 0
при этом не вижу причин, почему толоконные лбы из сишного комитета продолжают протаскивать это убогое требование
> в Qt использую макрос Q_UNUSED
в 2 раза длиннее, чем написать void, засоряет листинг капслоком - в нем хоть есть преимущество перед void?
bormand 30.12.2012 11:09 # 0
Нуб: автор явно хотел что-то этим сказать, но что? Надо бы загуглить. Профи: ага! Функция принимает координаты и цвет, но автор не использует их в данном методе.
Нуб наводит мышку на Q_UNUSED и читает там: Indicates to the compiler that the parameter with the specified name is not used in the body of a function. This can be used to suppress compiler warnings while allowing functions to be defined with meaningful parameter names in their signatures.
P.S. Реализация Q_UNUSED (оказывается не все так безоблачно с кастом в void): P.P.S. Терпеть не могу код, в котором опустили имена аргументов в реализации функции, особенно если мне надо один из них поюзать, и приходится искать в хидере\доке как же он назывался, и копипастить его имя... Видимо стандартизаторы думают так же. Нуб и профи: что это за хуита? Какие аргументы приходят в эту функцию? Придется посмотреть в документации... Профи: ага! Функция принимает координаты и цвет, но автор не использует их в данном методе.
defecate-plusplus 30.12.2012 11:52 # 0
даже истеричному компилятору
всем, кроме сишкоблядского комитета выделить с шифтом аргумент и нажать * - экономит время и строки, и всем всё очевидно
bormand 30.12.2012 12:06 # 0
P.S. Да и меня эти закомментаренные аргументы бесят больше чем Q_UNUSED/(void). Хотя дело вкуса, и комменты действительно втыкаются одним нажатием хоткея (ctrl-/ в креаторе).
defecate-plusplus 30.12.2012 12:19 # 0
и чьи же это проблемы?
если честно, ни разу за 10 лет не было такого, что ворнинг unused parameter реально помог
только раздражает
если пишешь функцию на 10 PgDn и десятком output аргументов, один из которых забываешь присвоить (по сути, единственная гипотетическая польза от этого ворнинга) - зачем должны страдать остальные, не делающие так, но пользующие -Wall
как для меня - и void и Q_UNUSED - плохо пахнущие костыли, только загрязняют код
defecate-plusplus 30.12.2012 12:25 # +1
bormand 30.12.2012 12:55 # 0
Боятся пропустить и не выдать какой-нибудь ворнинг из-за слишком тонкой крестограни между input и output параметрами?
Те же инты, содержащие хендл файла/сокета, открытого на запись, или смартпоинтеры, переданные по значению, или конст ссылка на вектор из функций, это input или output? Формально input, но по смыслу могут оказаться обязательным output'ом.
Тут, наверное, нужна маркировочка на первом описании виртуального метода, или на прототипе для колбеков, в которой помечается, какие аргументы важны, и их не стоит игнорировать. Вот только по ним и выдавать подобный ворнинг...
А для невиртуального метода и не коллбека этот ворнинг даже полезен, т.к. там аргументы не юзают разве что для совместимости со старым кодом.
bormand 30.12.2012 12:31 # +1
Ну еще гипотетические опечатки из-за копипасты, когда в аргументах были x и y, а в коде поюзал только x джважды.
> зачем должны страдать остальные, не делающие так, но пользующие -Wall
Х.з. видимо они страдают от незнания -Wno-unused-parameter?
defecate-plusplus 30.12.2012 12:39 # 0
bormand 30.12.2012 13:18 # 0
Хм, сделал корявый файл без энтера после закрывающей скобки. Откомпилил - ворнинга нет. Видимо в gcc 4 его убрали, т.к. последний раз я видел его только в gcc 3+ под ARM, и там, если мне не изменяет память, он не отключался, и лечился только добавлением энтера в конец файла.
P.S. Файл без энтера в конце корявый не только потому, что его gcc не понимает. Его и многие другие никсовые тулзы не любят, дифф например пишет "В конце файла нет новой строки", а cat нескольких таких файлов клеит их через жопу (последняя строка первого и первая следующего слипаются).
defecate-plusplus 30.12.2012 13:42 # +1
ну а cat работает верно - нет переноса, надо клеить без переноса
bormand 30.12.2012 13:58 # 0
Ну к нему никаких претензий нет, для него это просто двоичные файлы. Я просто хотел привести пример, что файлы без конца строки в конце не всегда айс.
P.S. А еще такие файлы прикольно читаются fgets'ом, ломая нубам лабы...
absolut 30.12.2012 12:56 # 0
bormand 30.12.2012 13:24 # +1
roman-kashitsyn 30.12.2012 15:31 # +1
bormand 30.12.2012 16:09 # 0
3.14159265 29.12.2012 23:02 # 0
Хотя он может приводить к тихому переполнению. Так что надо смотреть по специфике кода и личным препочтениям.
bormand 30.12.2012 09:24 # +3
А этот ворнинг не мусор. Он спасает от вот такой дурацкой ситуации: https://ideone.com/ZY2zAf. Так что отключать его я бы не стал, да и выдается он не всегда, а только когда есть риск.
Если разрядность знакового числа больше разрядности беззнакового, то, согласно стандарту каст пойдет в сторону знакового инта, и ни проблемы ни ворнинга не будет. Если же разрядность беззнакового больше либо равна разрядности знакового - каст пойдет в unsigned, вместе с потенциальной траблой и ворнингом.
Vindicar 30.12.2012 13:40 # +1
Вот за это вот я не люблю си и плюсы - за то что наступить на грабли можно даже в сравнении двух целых чисел.