Си диез / Говнокод #16228 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
private object N(Func<object> func)
        {
            try
            {
                return func();
            }
            catch (NullReferenceException)
            {
                return null;
            }
        }

...

int? val = (int?)N(() => oldAttr.parent_value.Analyses_attribute);

...

Мощный метод для поддержки паровозов.

Запостил: MainGovnokoder MainGovnokoder, (Updated )

Комментарии (11) RSS

  • А какие ещё могут быть варианты, если уровень вложенности >5, а писать много ифов не нужно?

    Только не хватает замены Object на генерики:
    static T N<T>(Func<T> func)
    {
        try{ return func(); }
        catch(NullReferenceException) { return default(T); }
    }


    Всё зависит от контекста использования.

    jQuery style:
    private static T N<T>(Object obj, String tempate)
    {
    	if(String.IsNullOrEmpty(tempate))
    		throw new ArgumentNullException("tempate");
    
    	Object current = obj;
    	foreach(String propertyName in tempate.Split(' '))
    	{
    		if(current == null)
    			return default(T);
    		PropertyInfo property = current.GetType().GetProperty(propertyName);
    		if(property != null)
    			current = property.GetValue(current, null);
    	}
    	return (T)current;
    }
    Ответить
    • > а писать много ифов не нужно
      религия не позволяет?
      if(oldAttr!=null && oldAttr.parent_value!=null)
      Ответить
      • Если больше 5, то действительно может быть влом...
        if(oldAttr!=null
            && oldAttr.parent_value!=null
            && oldAttr.parent_value.Analyses_attribute!=null
            && oldAttr.parent_value.Analyses_attribute.secondValue!=null
            && oldAttr.parent_value.Analyses_attribute.secondValue.thirdValue!=null)
            return oldAttr.parent_value.Analyses_attribute.secondValue.thrirdValue.myValue;


        Но в таком случае более актуален вопрос: А действительно-ли нужен такой уровень вложенности? 🙂
        Ответить
        • У меня другой вопрос - а действительно ли при хорошей архитектуре о обьекте с такой вложенностью нихрена не будет известно до момента такой проверки?
          Ответить
          • Судя по названию общекта "oldAttr", раньше она точно не была хорошей 🙂
            Ответить
        • Ждём выхода C# 6. В нём наконец-то будет оператор ?. - тогда заживём.
          Ответить
  • я так понимаю функции рукописные, так что же не сделать возврат null а не выброс исключения?
    Ответить
    • Эм-м, я что-то не уловил? В таком контексте:
      int? val = (int?)N(() => oldAttr.parent_value.Analyses_attribute);

      null может выбросить обращение к проперте Analyses_attribute, если пропертя parent_value==null.

      По паттернам M$, желательно не выбрасывать исключения из пропертей.
      Ответить
      • логично, ибо просто присваеваешь полю значение а тут вылетает исключение. что за пиздец?!

        пропертя должна быть легковесной и без камней на дне
        Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8