1. C# / Говнокод #16228

    +132

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 25 Июня 2014

    Комментарии (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$, желательно не выбрасывать исключения из пропертей.
        Ответить
        • логично, ибо просто присваеваешь полю значение а тут вылетает исключение. что за пиздец?!

          пропертя должна быть легковесной и без камней на дне
          Ответить
    • Уже скоро)))
      int? val = oldAttr?.parent_value?.Analyses_attribute
      Ответить

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