Этот консультант ASP.NET знает, что он делает? - PullRequest
9 голосов
/ 03 октября 2008

ИТ-отдел нашей дочерней компании попросил консалтинговую компанию написать им приложение ASP.NET. Теперь у него периодически возникают проблемы со смешиванием того, кто является текущим пользователем, и, как известно, ошибочно показывает Джо некоторые данные Боба.

Консультанты были возвращены для устранения неполадок, и нас пригласили выслушать их объяснения. Выделены две вещи.

Сначала руководитель консультанта предоставил этот псевдокод:

void MyFunction()
{
    Session["UserID"] = SomeProprietarySessionManagementLookup();
    Response.Redirect("SomeOtherPage.aspx");
}

Далее он сказал, что присвоение переменной сеанса асинхронно, что казалось неверным. Конечно, вызов функции поиска может сделать что-то асинхронно, но это кажется неразумным.

Учитывая эту предполагаемую асинхронность, его теория заключалась в том, что переменная сеанса не назначалась до того, как было сгенерировано неизбежное исключение ThreadAbort перенаправления. Эта ошибка не позволила SomeOtherPage отобразить правильные данные пользователя.

Во-вторых, он привел пример рекомендуемой практики кодирования. Вместо того чтобы писать:

int MyFunction(int x, int x)
{
    try 
    {
        return x / y; 
    }
    catch(Exception ex)
    {
        // log it
        throw;
    }
}

Техника, которую он рекомендовал, была:

  int MyFunction(int x, int y, out bool isSuccessful)
  {
    isSuccessful = false;

    if (y == 0)
        return 0;

    isSuccessful = true;

    return x / y;
  }

Это, безусловно, сработает и в некоторых ситуациях может быть лучше с точки зрения производительности.

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

Мнения

Ответы [ 22 ]

1 голос
/ 03 октября 2008

Этот парень не знает, что делает . Очевидный виновник прямо здесь:

Session["UserID"] = SomeProprietarySessionManagementLookup();
0 голосов
/ 07 октября 2008

Если консультанты развернули свое приложение ASP.NET на ваших серверах, то они, возможно, развернули его в некомпилированном виде, что означает, что вокруг вас будет видна куча файлов * .cs, на которые вы сможете посмотреть.

Если все, что вы можете найти, это скомпилированные сборки .NET (DLL и EXE), то вы все равно сможете декомпилировать их в несколько читаемый исходный код. Бьюсь об заклад, если вы посмотрите код, вы найдете их, используя статические переменные в собственном коде поиска. Тогда у вас будет что-то очень конкретное, чтобы показать своим боссам.

0 голосов
/ 03 октября 2008

If SomePprietarySessionManagementLookup (); выполняет асинхронное присваивание, скорее всего, это будет выглядеть так:

SomeProprietarySessionManagementLookup(Session["UserID"]);

Сам факт, что код присваивает результат Session ["UserID"], предполагает, что он не должен быть асинхронным, и результат должен быть получен до вызова Response.Redirect. Если SomePprietarySessionManagementLookup возвращается до того, как будет рассчитан его результат, у них все равно есть ошибка проектирования.

Бросить исключение или использовать параметр out - это вопрос мнения и обстоятельств, и в реальной практике это не будет равносильно тому, как вы это делаете. Чтобы проблема с производительностью исключений стала проблемой, вам нужно вызывать функцию огромное количество раз, что, вероятно, само по себе является проблемой.

0 голосов
/ 03 октября 2008

По второму пункту я бы здесь не использовал исключения. Исключения зарезервированы для исключительных случаев.
Однако деление чего-либо на ноль определенно не равно нулю (по крайней мере, в математике), поэтому это будет зависеть от конкретного случая.

0 голосов
/ 03 октября 2008

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

Второй номер тоже довольно актуален. Это не совсем идиоматично - это слегка измененная версия таких вещей, как int.TryParse, которые призваны избежать проблем с производительностью, вызванных множеством исключений. Но если вы не называете этот код ужасно много, вряд ли это будет заметно (по сравнению, скажем, с одним запросом к базе данных на страницу и т. Д.). Это определенно не то, что вы должны делать по умолчанию.

0 голосов
/ 03 октября 2008

Полагаю, ваш консультант предлагает использовать переменную состояния вместо исключения для обработки ошибок. Я не согласна Как часто люди забывают или лень проверять ошибки на возвращаемые значения? Кроме того, переменная pass / fail не является информативной. Есть и другие вещи, которые могут пойти не так, кроме деления на ноль, например, целое число x / y слишком большое или x равно NaN. Когда что-то идет не так, переменная состояния не может сказать вам, что пошло не так, но исключение может. Исключение для исключительного случая, и деление на ноль или NaN, безусловно, исключительные случаи.

0 голосов
/ 03 октября 2008

Довольно странно. По второму пункту это может быть или не быть быстрее. Хотя, конечно, это не та же функциональность.

0 голосов
/ 03 октября 2008

Типичные "консультантские" чушь:

  1. Проблема в том, что делает SomePprietarySessionManagementLookup
  2. Исключения являются дорогостоящими, только если они выброшены. Не бойтесь try..catch, но броски должны происходить только в исключительных обстоятельствах. Если переменная y не должна быть нулевой, тогда ArgumentOutOfRangeException будет уместным.
0 голосов
/ 03 октября 2008

Я должен согласиться с Джоном Руди. Моя интуиция говорит мне, что проблема в SomePprietarySessionManagementLookup ().

.. и ваши консультанты не уверены в себе.

0 голосов
/ 26 января 2009

Весь этот поток ответов полон типичного отношения программиста. Это напоминает мне статью Джоэла «То, что вы никогда не должны делать» (переписать с нуля). Мы ничего не знаем о системе, кроме как об ошибке, и какой-то парень опубликовал некоторый код в Интернете. Здесь так много неизвестных, что смешно говорить: «Этот парень не знает, что делает».

...