Проверка с помощью If
Есть вот такая конструкция:
if (args = malloc(sizeof(abl_args)), NULL == args) {..}
Я правильно понимаю, что в ней выделяется память для структуры abl_args и проверяется выделена ли она? Первую часть условия для читабельности можно было вынести отдельно? Прокомментируйте пожалуйста с точки зрения правильности и красивости.
Заранее большое спасибо.
С точки зрения красивости код безобразен: нечитабелен, зачем-то дважды проверяется практически одно и тоже условие.
С точки зрения читабельности не просто можно, а нужно выносить первую часть за пределы if.
Для сравнения, что читабельнее?
if (NULL == args) {..}
Да, согласен.
abl_args *args;
if (args = malloc(sizeof(abl_args))) {..}
Скажи, ну чем это лучше, чем
if (NULL == args) {..}
Кроме того, так, как ты привел, писать плохо, т.к. нормальный компилятор будет варнинг выбрасывать: "не имел ли ты в виду == вместо =".
Думаю не имел. В данном случае если с помощь функции malloc возвращается указатель на свободную область памяти отведённую под abl_args(число отличное от нулю), то условие проверки if() удовлетворяется и происходит вход {}. Если же память по каким либо причинам не высвобождается для этого объекта, то возвращается нулевой указатель, условие if()
не удовлетворятеся со всеми вытекающими последствиями))))
[/LEFT]
не имел ли ты в виду == вместо =.
Думаю не имел. В данном случае если с помощь функции malloc возвращается указатель на свободную область памяти отведённую под abl_args(число отличное от нулю), то условие проверки if() удовлетворяется и происходит вход {}. Если же память по каким либо причинам не высвобождается для этого объекта, то возвращается нулевой указатель, условие if()
не удовлетворятеся со всеми вытекающими последствиями))))
Это ты с компилятором разговариваешь, который такой варнинг выбросил?
Ну и как уговорил компилятор? :)
А у меня
ненормальный компилятор, но мы с ним дружим и понимаем друг друга))) :D
Ну лады.... после вот этой конструкции:
зачем писать вот так:
когда можно вот так:
[/LEFT]
зачем писать вот так:
когда можно вот так:
В С++ это (NULL == args) "хороший тон".
зачем писать вот так:
Код:
if (NULL == args) {..}
когда можно вот так:
Код:
if (args) {..}
[/quote]
Элементарно, в первом случае условие "если ноль", а во втором "если есть" ("если не ноль")
Думаю, Jail опечатался и имел в виду if(!args).
abl_args *args;
if (args = malloc(sizeof(abl_args))) {..}
Следует напомнить, что на некоторых компиляторах подобная запись может вызвать warning типа "а может, ты имел в виду == ?".
if ((args = malloc(sizeof(abl_args))) == NULL) {..} будет безопаснее.
Тут скорее что проверяем. Проверка на "если есть" или проверка на "если нет". :)
Ну для новичков да.... Но для тебя то Green..... :)[/LEFT]
Ну для новичков да.... Но для тебя то Green..... :)[/LEFT]
Код может быть или читабельным или нет. И неважно для кого. Новичек просто может в нем не разобраться, а опытный программист разберется. Но это не делает код более читабельным и оправдывающим такой подход )
Ну если вы этот код видете ничетаемым,то я не знаю......
Что уж тогда говорить например о перегрузке операторов в С++))) :D Тоже нечитаемо???
Допустим я использую в определении класса чисто виртуальную функцию для вывода в выходной поток. В классах наследуемых базовый класс переопределяю эту функцию (полиморфизм в работе!). Перегружаю оператор '<<', реализуя его как не функцию-членн и вызываю из него эту виртуальную функцию, которая в соответствии с переданным по ссылке объектом вызывает нужную мне функцию)))))))
{
d.display(out); //Вобщем сама виртуальная функция, реализуемая в каждом классе
return out;
}
По вашему это тоже нечитаемо??????
А мне так удобно и пользуюсь этим примером постоянно. Это очень сокращает код (хотя кому-то это может показаться просто ужастно и нечитаемо!). :D
[/LEFT]
Ну если вы этот код видете ничетаемым,то я не знаю......
Что уж тогда говорить например о перегрузке операторов в С++))) :D Тоже нечитаемо???
Не понимаю, при чем тут это?
Перегружаю оператор '<<', реализуя его как не функцию-членн
А по другому у тебя и не получится.
А мне так удобно и пользуюсь этим примером постоянно. Это очень сокращает код (хотя кому-то это может показаться просто ужастно и нечитаемо!). :D
При чем тут нечитаемость?
У меня создается впечатление, что ты, просто, нашел на твой взгляд подходящий пост, чтоб показать какую крутую технику ты применяешь.
Только к нечитаемости это никакого отношения не имеет и техника вполне элементарная, обсуждалась здесь не раз:
http://forum.codenet.ru/showthread.php?t=31233
http://forum.codenet.ru/showthread.php?t=35755
Да причом тут крутая техника, это многие используют))) :)
Я просто привёл пример который может оказаться(думаю и является) потяжелее, чем приведённое до этого выражение.
Вроде такого рода выражения повсеместно применяются программистами на 'C', возможно я и неправ, но примеры подобного кода видел не раз, поэтому и возражаю вашему мнению о нечитабельности))))) :)
[/LEFT]
Лично я бы написал это как
if ( ( args = malloc( sizeof( abl_args ) ) == NULL )
{
//Вызов какого-нибудь самопального обработчика исключительных ситуаций
}
if ( !args )
{
// ...
}
Лично я бы написал это как
if ( ( args = malloc( sizeof( abl_args ) ) == NULL )
{
//Вызов какого-нибудь самопального обработчика исключительных ситуаций
}
А ты можешь аргументировать в чем предпочтительность такой нечитабельной записи?
я согласен с тем, что чем больше скобок в одной строке, тем сложнее порой за ними уследить ))))))) бывает такое %)
а читабельность, о которой говорит Green, я так полагаю не заставляет страдать скорость при review кода, вот и всё... собственно этим и удобнее. чтобы потом самому через некоторое время не путаться, ну и другим (если код дорабатываться будет не только Вами) :)
ИМХО