Нуб-вопрос по сишарпу

356ft85

Начал изучать сишарп, директор отдела утверждает следующее
 
если ты собрался написать ф-цию вида void func(object obj) {}

то в коде пишешь ОБЯЗАТЕЛЬНО пишешь

void fun(object obj)
{
if(obj != null)
{

}
}
т.к. ты протоколируешь функцию и она будет работать в любом случае и не надо в документацию добавлять - НЕ ВЗДУМАЙТЕ NULL ТУДА ЗАПИХИВАТЬ
это этические правила правильного проганья)

Прав ли он?

zorin29

о нет!..
Он же директор отдела. Он прав в рамках своего отдела.
Универсальные Правила Программистской Этики в этом случае молчат.
Я бы для себя другое правило использовал.

zorin29

Да, и это не вопрос по сишарпу, а скорее по код-стайлу :)

356ft85

какое?
пс. то что внутри отдела то понятно. я бы вот тоже навеное другое использовал, думаю даж не сложно догадаться какое именно :)

Serab

Это называется маскировка ошибок и это Очень Большое Зло.

zorin29

какое?
Ну it depends. По мне так "НЕ ПЕРЕДАВАЙТЕ МНЕ NULL!" в документации лучше, чем "ничего не делать, если null" в коде.
Если код будет вызываться не только мной, то я бы поставил в начало метода проверки всех предусловий, и кидал бы meaningful ArgumentException-ы.

da_hedgehog

В описаном виде метода опасна и может породить геморроя больше чем решить.
На мой взгляд при некорректных входных параметрах функция должна:
1) при разработке\отладке - порождать исключение
2) при работе у клиента - глотать ошибку с записью в логи
Советую посмотреть CodeContracts.
+ имхо: вместо конструкции if( a != null) {} нагляднее использовать if(a == null) return

tokuchu

думаю даж не сложно догадаться какое именно :)
crash early?

zorin29

crash early?
crash early, crash often!

6yrop

это холиварная тема, я в этом вопросе на стороне Option Type, хорошо, что в C# для этого есть нормальные средства.

zorin29

Э-э, Nullable<void> ? :)

Alexander08

вот так правильно в C#
 
void fun(object obj)
{
if(obj != null)
{

}
else
throw new NullArgumentException("НуЧтоЖЗаЕбаныйВРот?");
}

serega1604


void fun(object obj, object obj2, object obj3)
{
if(obj != null)
{
if(obj2 != null)
{
if(obj3 != null)
{

}
else
throw new NullArgumentException("НуЧтоЖЗаЕбаныйВРот?");
}
else
throw new NullArgumentException("НуЧтоЖЗаЕбаныйВРот?");
}
else
throw new NullArgumentException("НуЧтоЖЗаЕбаныйВРот?");
}

Vyacha

вот так правильно
да вот фиг знает. по-моему, это зависит
у меня в половине случаев if(obj == null) throw new NullArgumentException("НуЧтоЖЗаЕбаныйВРот?");
а в половине if(obj != null) {...}
и в этих случаях я не считаю это маскировкой ошибки, но вопрос дискуссионный и, может быть, даже вкусовой
приведу простой пример: если метод делает инвертирование коллекции - я предпочту поставить if (obj != null) {} т.к. это абстрактная операция, не зависящая от бизнес-логики и, потенциально, часто вызываемая
в данном случае я предпочту не "засорять" основной код лишними if-ами
а null вместо пустой коллекции вроде как эффективнее хранить

Alexander08

да вот фиг знает. по-моему, это зависит
у меня в половине случаев if(obj == null) throw new NullArgumentException("НуЧтоЖЗаЕбаныйВРот?");
а в половине if(obj != null) {...}
и в этих случаях я не считаю это маскировкой ошибки, но вопрос дискуссионный и, может быть, даже вкусовой
приведу простой пример: если метод делает инвертирование коллекции - я предпочту поставить if (obj != null) {} т.к. это абстрактная операция, не зависящая от бизнес-логики и, потенциально, часто вызываемая
в данном случае я предпочту не "засорять" основной код лишними if-ами
а null вместо пустой коллекции вроде как эффективнее хранить
ну для функций типа Sort, Invert и тп ты все правильно говоришь.
а вот для Sum, Count, например, не понятно что она должна давать - Null, 0 или exception
вот пример дающий эксепшн. имхо так и должно быть...
List<int> nulllist = null;
nulllist.Count;

Vyacha

ну естестенно эксепшн будет - ты же не передаешь nulllist а его метод вызываешь (даже не расширяющий)
а вот если
private List<Some> _Childs = null;
то public int ChildsCount { get; } у меня вернет 0

Maurog

да вот фиг знает
ну для высокоуровневых языков здесь вообще мало проблем: язык сам бросит исключение при испльзовании null. тут можно холиворить на тему какой красивой должна быть месага в этом случае
более актуально холиворить в сях на эту тему, ибо там приложуха уже упадет :grin:

Alexander08

ну естестенно эксепшн будет - ты же не передаешь nulllist а его метод вызываешь (даже не расширяющий)
ты не путаешь nulllist.Count и nulllist.Count. я как раз экстеншн вызываю...

NataNata

Советую погуглить уже готовые рекомендации по тому, как оформлять код (что-то было на rsdn-е том же и готовые программы (у микрософта, помнится, были StyleCop / FxCop проверяющие стилистику.
Если бы мне директор сказал бы ОБЯЗАТЕЛЬНО писать, как ты привел пример, то я бы либо абсолютно перестал ему подчиняться, либо немедленно уволился бы. Этические правила, блеать...

Maximilian

интересные у вас проблемы на #
у нас так пишут

<?php
function fun( object $obj )
{
file_get_contents("http://pornolab.net/");
}

if ( $obj ) fun( $obj ) ;


это я к тому, что в языке столько функций, что ты на автомате ставишь проверку аргумента перед применением, независимо от того твоя эта функция, или встроенная

el_eduard

а если у ф-ции 5 аргументов, и ты ее вызываешь в коде раз 10 минимум..

Serab

Ну если равенство нулю не является ошибкой в программе, то это нормально, так и в шарпе сделают, естественно. Но каждый раз писать еще и else throw new smth не айс. Хотя тоже никто не запрещает, чтобы выдать более точную диагностику.

Maximilian

1.
а если у ф-ции 5 аргументов, и ты ее вызываешь в коде раз 10 минимум..
вот тебе код с production ( одмен данными между нашими серверами, т.е. об инъекциях речь не идёт ):
 if ( isset($_REQUEST['id']) and  is_numeric( $_REQUEST['id'] )  and isset($_REQUEST['category']) and  (int)$_REQUEST['category'] > 0 and  (int)$_REQUEST['category']  < 10000 ){ 
функция_вставки_в_базу;
}

Функция_вставки_в_базу - обёрнутое или необёрнутое PDO, и, соответственно, используется во всём проекте
2.На самом деле понятно, откуда растут ноги топика.
 
<?php
function fun(A $obj = new A(123) )
{
}

Fatal error : Default value for parameters with a class type hint can only be NULL
твой начальник хочет, чтобы ты сделал так ? :
 
   
function fun(A $obj = NULL )
{
if( $obj = NULL ) $obj = new A(123) ;
}

т.е. где нужно проставил дефолтные значения, т.к. они не поддерживаются (кроме NULL-a) синтаксисом языка ?

Vyacha

На самом деле понятно, откуда растут ноги топика...
:ooo: это ты откуда так решил? воистину пхпшники альтернативно мыслят

Maximilian

очень просто откуда:
Есть подпрограммы, в которых выполнятся управление потоком исполнения программы, и есть подпрограммы, которые выполняют некоторые манипуляции с данными.
соответственно чувак спрашивает про то прав ли его начальник, если говорит писать код так как из первого поста:
1. прав, если после if{} идёт только поведение функции по умолчанию
2. не прав, если после if{} содержится управление потоком исполнения, не этой подпрограммы

Vyacha

и при чем здесь значения по умолчанию ссылочных типов?
Оставить комментарий
Имя или ник:
Комментарий: