Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 7 8 9 10 11 [12] 13 14 15 16 17   вперед  Ctrl
 Re: Исключения vs коды возвратов  [new]
Валентин Иванович
Member

Откуда:
Сообщений: 104
короче, дети, вот вам совет
1. использовать исключения можно, и нужно. для вас их в ваши языки ввели не глупые дяди, чтобы вы не делали goto. если это жава или додиез ит.п. - то там есть типы. ловите нужные типы, вот и все
2. весь треп про внешний API ни о чем, просто не в кассу

удачи вам, и здоровья
12 июл 18, 15:49    [21566355]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Валентин Иванович
Member

Откуда:
Сообщений: 104
hVostt
Если в языке есть исключения, надо их использовать.


+146%
12 июл 18, 15:52    [21566364]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
казинак
Member

Откуда:
Сообщений: 1269
Валентин Иванович
....для вас их в ваши языки ввели не глупые дяди,
еще один огнепоклонник

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

то, что другим удобно/неудобно читать твой код, савсем не показатель
к примеру, лямбды после ооп, очченно режут глаз...
и чо? запретить их?
12 июл 18, 16:28    [21566510]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Валентин Иванович
Member

Откуда:
Сообщений: 104
казинак
лямбды после ооп, очченно режут глаз


шо ты несешь
12 июл 18, 16:30    [21566522]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
казинак
Member

Откуда:
Сообщений: 1269
Валентин Иванович
казинак
лямбды после ооп, очченно режут глаз


шо ты несешь

а ты?
12 июл 18, 16:31    [21566530]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
казинак
Member

Откуда:
Сообщений: 1269
Валентин Иванович,

судя по профилю, ты - завсегдатай ПТ
что такое лямбды, хоть знаешь?
12 июл 18, 16:36    [21566554]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3714
казинак
Валентин Иванович,

судя по профилю, ты - завсегдатай ПТ
что такое лямбды, хоть знаешь?

а вы завсегдатай раздела "Работа". Видимо не ценят ваши подходы на работах =)
(по вашей логике)
12 июл 18, 16:50    [21566608]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
казинак
Member

Откуда:
Сообщений: 1269
Roman Mejtes
казинак
Валентин Иванович,

судя по профилю, ты - завсегдатай ПТ
что такое лямбды, хоть знаешь?

а вы завсегдатай раздела "Работа". Видимо не ценят ваши подходы на работах =)
(по вашей логике)

не ценили б, выгнали бы давно
12 июл 18, 16:54    [21566628]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Валентин Иванович
Member

Откуда:
Сообщений: 104
Сон Веры Павловны
hVostt
пропущено...


Ну если так да :)

Ну, здесь и то, и другое: SOAP выбрасывает исключения, полученные в некоем подобии OperationResult (<soap:fault>). Ничто не мешает делать подобное со своим наколеночным OperationResult.


но это не имеет отношения к Exception и try catch
12 июл 18, 16:59    [21566654]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Изопропил
Member

Откуда:
Сообщений: 31427
казинак
к примеру, лямбды после ооп,

летели два крокодила, один зелёный, другой - на север
12 июл 18, 17:05    [21566680]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27448
Валентин Иванович
короче, дети, вот вам совет
1. использовать исключения можно, и нужно. для вас их в ваши языки ввели не глупые дяди, чтобы вы не делали goto. если это жава или додиез ит.п. - то там есть типы. ловите нужные типы, вот и все
2. весь треп про внешний API ни о чем, просто не в кассу

удачи вам, и здоровья

Спасибо, дядя, и тебе не хворать.

Исключения используем и не только исключения. Так что не волнуйся и иди спокойно себе занимайся своими делами
12 июл 18, 17:07    [21566683]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Валентин Иванович
Member

Откуда:
Сообщений: 104
skyANA
Валентин Иванович
короче, дети, вот вам совет
1. использовать исключения можно, и нужно. для вас их в ваши языки ввели не глупые дяди, чтобы вы не делали goto. если это жава или додиез ит.п. - то там есть типы. ловите нужные типы, вот и все
2. весь треп про внешний API ни о чем, просто не в кассу

удачи вам, и здоровья

Спасибо, дядя, и тебе не хворать.

Исключения используем и не только исключения. Так что не волнуйся и иди спокойно себе занимайся своими делами


вот это и называется - языком молоть
12 июл 18, 17:13    [21566704]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27448
Валентин Иванович
skyANA
пропущено...

Спасибо, дядя, и тебе не хворать.

Исключения используем и не только исключения. Так что не волнуйся и иди спокойно себе занимайся своими делами


вот это и называется - языком молоть

Языком молоть - это много и быстро говорить.
А использование не только исключений - это, извините, никак с этим не связано.
12 июл 18, 17:17    [21566718]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Валентин Иванович
Member

Откуда:
Сообщений: 104
skyANA
Валентин Иванович
пропущено...


вот это и называется - языком молоть

Языком молоть - это много и быстро говорить.
А использование не только исключений - это, извините, никак с этим не связано.


поделитесь, если это не секрет, как вы используете "не только" исключения. про OperationResult я уже прочитал
12 июл 18, 17:54    [21566849]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27448
Валентин Иванович
skyANA
пропущено...

Языком молоть - это много и быстро говорить.
А использование не только исключений - это, извините, никак с этим не связано.


поделитесь, если это не секрет, как вы используете "не только" исключения. про OperationResult я уже прочитал
Вернёмся к контексту топика...

Где-то мы выбрасываем исключения, где-то возвращаем некий Result, зависит от...
Где-то даже коды возврата есть, но это надо бы переписать
12 июл 18, 18:14    [21566918]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
Валентин Иванович
Member

Откуда:
Сообщений: 104
skyANA
Валентин Иванович
пропущено...


поделитесь, если это не секрет, как вы используете "не только" исключения. про OperationResult я уже прочитал
Вернёмся к контексту топика...

Где-то мы выбрасываем исключения, где-то возвращаем некий Result, зависит от...
Где-то даже коды возврата есть, но это надо бы переписать


молодцы. евреи, наверное
12 июл 18, 18:15    [21566921]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27448
Валентин Иванович
skyANA
пропущено...
Вернёмся к контексту топика...

Где-то мы выбрасываем исключения, где-то возвращаем некий Result, зависит от...
Где-то даже коды возврата есть, но это надо бы переписать


молодцы
Знаем
12 июл 18, 18:26    [21566943]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27448
Функциональный C#. Часть 4. Обработка исключений
[HttpPost]
public HttpResponseMessage CreateCustomer(string name, string billingInfo)
{
    Result<BillingInfo> billingInfoResult = BillingInfo.Create(billingInfo);
    Result<CustomerName> customerNameResult = CustomerName.Create(name);
 
    return Result.Combine(billingInfoResult, customerNameResult)
        .OnSuccess(() => _paymentGateway.ChargeCommission(billingInfoResult.Value))
        .OnSuccess(() => new Customer(customerNameResult.Value))
        .OnSuccess(
            customer => _repository.Save(customer)
                .OnFailure(() => _paymentGateway.RollbackLastTransaction())
        )
        .OnSuccess(() => _emailSender.SendGreetings(customerNameResult.Value))
        .OnBoth(result => Log(result))
        .OnBoth(result => CreateResponseMessage(result));
}
12 июл 18, 18:27    [21566947]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27448
Railway oriented programming: Error handling in functional languages by Scott Wlaschin
12 июл 18, 18:30    [21566951]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
hVostt
Member

Откуда:
Сообщений: 16869
skyANA
Функциональный C#. Часть 4. Обработка исключений


Угу, автор, как это обычно бывает, намеренно привёл отвратительную реализацию в противовес своему подходу:

[HttpPost]
public HttpResponseMessage CreateCustomer(string name, string billingInfo)
{
    Result<CustomerName> customerNameResult = CustomerName.Create(name);
    if (customerNameResult.Failure)
    {
        _logger.Log(customerNameResult.Error);
        return Error(customerNameResult.Error);
    }
 
    Result<BillingInfo> billingInfoResult = BillingInfo.Create(billingInfo);
    if (billingInfoResult.Failure)
    {
        _logger.Log(billingInfoResult.Error);
        return Error(billingInfoResult.Error);
    }
 
    Customer customer = new Customer(customerNameResult.Value);
 
    try
    {
        _repository.Save(customer);
    }
    catch (SqlException)
    {
        _logger.Log(“Unable to connect to database”);
        return Error(“Unable to connect to database”);
    }
 
    _paymentGateway.ChargeCommission(billingInfoResult.Value);
 
    _emailSender.SendGreetings(customerNameResult.Value);
 
    return new HttpResponseMessage(HttpStatusCode.OK);
}


А теперь перепишем, как это должно было быть:

[HttpPost]
public HttpResponseMessage CreateCustomer(string name, string billingInfo)
{
    var customerName = CustomerName.Create(name); 
    var billingInfo = BillingInfo.Create(billingInfo);
    var customer = new Customer(customerName);
    _repository.Save(customer);
    _paymentGateway.ChargeCommission(billingInfo);
    _emailSender.SendGreetings(customerName);
    return new HttpResponseMessage(HttpStatusCode.OK);
}


Ну вот. Чисто, понятно. Хотя и здесь на контроллер возложено слишком много обязанностей, в нём выполняется многовато бизнес-логики.

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

.OnSuccess(
            customer => _repository.Save(customer)
                .OnFailure(() => _paymentGateway.RollbackLastTransaction())
        )


И вот это, "отлов ошибок" типа в функциональном стиле, чтобы потом сделать ровно тоже самое, что может сделать фильтр API, выгоды не видно совсем. Если же внутри всё написано в таком же ключе, то весь путь ошибки, проброшенный через эти "промисы" потеряется окончательно, всё ради того, чтобы залогировать корень проблемы, но не её путь. Хотя если каждый компонент по пути следования ошибки будет оборачивать в свою структуру, то... привет недоделанные исключения! Ещё строчку и файл нужно добавлять, тогда вообще будет сказка. Поехали на нашем велосипеде, чё ты, бросай это старьё

Ладно, если такой подход позволял раньше более или менее красиво обойти проблему коллбеков при асинхронном подходе, сейчас при наличии async/await, это зачем нужно, непонятно.

В общем, статья не убедительна, но как пример, что можно ещё так накостылить, показательна :) Где-то может будет удобно применить подобный подход, но плюсов не вижу. Функциональный стиль, здесь с большим натягом.
12 июл 18, 20:18    [21567168]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
hVostt
Member

Откуда:
Сообщений: 16869
Вот этот код

Result<BillingInfo> billingInfoResult = BillingInfo.Create(billingInfo);
Result<CustomerName> customerNameResult = CustomerName.Create(name);


Гарантировано не должен бросать исключения. А как этого добиться? Ловить внутри и засовывать в свою структуру. Чтобы потом что? Дождаться пока кто-то не поймает в OnFailure, если не забудет конечно.
И при этом, почему-то именно этот кусок не пошёл в функциональную цепочку, а просто засунут в замыкания, и это странновато.
12 июл 18, 20:22    [21567175]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
hVostt
Member

Откуда:
Сообщений: 16869
Такой подход, кстати, хорошо бы смотрелся в качестве прикладного интерфейса для возврата результатов в NancyFX.

Но и только. Внедрив такой подход за рамками API, неизбежно полезут костыли. Собственно что-то очень похожее, полностью основанное на OperationResult с методами-расширениями для построения цепочек я уже делал... лет 5 назад, и это действительно было удобно, потому что API был полностью на этом построен.
12 июл 18, 20:29    [21567189]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
love_bach
Member

Откуда:
Сообщений: 595
Дядя Коля
кто хорошо в теме разбирается - есть какие-то мировые лидеры мнений которые топят за исключения? один програмист мне доказывает что коды лучше потому что так Джоэл сказал, очевидно надо найти не менее или примерно такого же по авторитету человека который топит за исключения.


в этой ветке я за исключения
12 июл 18, 20:30    [21567192]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
love_bach
Member

Откуда:
Сообщений: 595
skyANA
Функциональный C#. Часть 4. Обработка исключений
[HttpPost]
public HttpResponseMessage CreateCustomer(string name, string billingInfo)
{
    Result<BillingInfo> billingInfoResult = BillingInfo.Create(billingInfo);
    Result<CustomerName> customerNameResult = CustomerName.Create(name);
 
    return Result.Combine(billingInfoResult, customerNameResult)
        .OnSuccess(() => _paymentGateway.ChargeCommission(billingInfoResult.Value))
        .OnSuccess(() => new Customer(customerNameResult.Value))
        .OnSuccess(
            customer => _repository.Save(customer)
                .OnFailure(() => _paymentGateway.RollbackLastTransaction())
        )
        .OnSuccess(() => _emailSender.SendGreetings(customerNameResult.Value))
        .OnBoth(result => Log(result))
        .OnBoth(result => CreateResponseMessage(result));
}


это ни чем не отличается от стандарного try catch, кроме записи
12 июл 18, 20:33    [21567197]     Ответить | Цитировать Сообщить модератору
 Re: Исключения vs коды возвратов  [new]
hVostt
Member

Откуда:
Сообщений: 16869
love_bach
это ни чем не отличается от стандарного try catch, кроме записи


Отличается и довольно существенно. Видим, что Result тут приходит из сервисов, т.е. там внутри такой же код. Если он где-то там сваливается, то потом прокидывается через цепочку до прикладного уровня, теряется стек вызовов, код должен полностью оперировать данными из Result, т.е. как бы функциональный стиль все дела.

Здесь мы видим, всё не совсем так.

Надо уже идти до конца, типа

return BillingInfo.Create(billingInfo).CombineWith(CustomerName.Create(name))...

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

ну и попёрли костыли.
12 июл 18, 20:56    [21567223]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 7 8 9 10 11 [12] 13 14 15 16 17   вперед  Ctrl
Все форумы / WinForms, .Net Framework Ответить