All streams
Search
Write a publication
Pull to refresh
-2
0
Denis Podgorodnichenko @qadmium

Software developer

Send message
>Если формула отпарсилась в дерево — инпут годный. Но от переполнения при умножении это не спасёт.

а инпут к формуле?

>А во сколько раз дольше ваша проверка будет считаться (да и писаться, с тестами), чем само вычисление?

один раз — при комипяции. вы вообще слышали про контракты?
А как? Получить ArithmeticException способов больше одного: сложение, умножение, деление, логарифм — всё проверками обложить?


ну если делаем лабораторку в универе, то можно и не обкладывать )) а какие еще есть варианты? input всегда нужно валидировать

SystemException нельзя ловить как таковой, а OverflowException — можно


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

Contract.Require(divisor != 0);

если мы говорим про overflow то у функции сложения контракт будет вглядеть вот так:

Contract.Require(int.MaxValue — arg1 > arg2 && int.MaxValue — arg2 > arg1);

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

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

а вообще за всю мою практику из наследников SystemException мне приходилось ловить и проглатывать только TaskCanceledException, все что было связано с арифметикой — это всегда была моя ошибка
валидировал бы ввод и отселаживал overflow/underflow без эксепций, удивительно просто, да?
возврат DBZ — часть естественного контракта функции. Функции деления, например.


нет

в программе кнопок больше одной, одна может не работать. Главное — побочных эффектов не настругать.


и что? не работает — перепиши

Функция может работать в рамках контракта, который мы где-то нарушили. Самое банальное — плохо проверили пользовательский ввод. Нехорошо, но не смертельно — введут ещё раз.


контракт нарушен -> написано неверено -> смысла работать дальше нет
если бы получили DBZ из функции, значит функция написана неверено, какой смысл что-то изолировать, если у вас программа написана неверно? хоть какой-то смысл это имеет на границе плагина или чего-то такого что можно безболезненно прибить и оно при этом нам не подконтрольно
если у вас ожидается что инты будут переполняться, то, очевидно, использовать механизм исключений для этого глубоко неправильно. Впрочем как и ловля любого SystemException без rethrow
тогда, очевидно, должен быть способ задать поведение по умолчанию. А оно может быть различным для каждого случая, и тогда начинаем использовать?.. и ??, либо различным для каждого типа, тогда нам нужен или Null Object или типизированный null(еще вопрос где описать поведение такого null). Все это очень сложно, гораздо проще не иметь дела с null вообще, и тогда, возможно, мы увидим какой-то сахар для этого в языке
>Что? Нет! Ну как, конечно если язык падает при доступе к такой переменной и заставляет ее всячески обворачивать то да, ошибка. А так — нет. И никаких лишних движений.

Framework Design Guidelines

DO NOT catch System.Exception or System.SystemException in framework code, unless you intend to rethrow.


Единственное, что можно сделать: поймать, написать логи/дампы/перезапуск и упасть. NRE это однозначная ошибка в коде, работать дальше смысла не имеет
Как вы на этапе компиляции библиотеки отследите все случаи, когда использующий ее код передает в нее null?


code contracts
Почему if(something != null) вдруг „антипаттерн“? Единственное назначение которого — выбросить исключение поближе к месту предательства“ — никто не выбрасывает NullReferenceException и никто не отменял валидацию параметров метода (InvalidArgumentException) или ошибочных сценариев (InvalidOperationException).


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

На предвосхищение ООП через 20 лет не претендую


это пять ))
В Optional ещё можно лямбду выполнить если там пусто и ещё много чего можно


все тоже самое, там должно быть просто выражение

Кроме того Optional в сигнатуре медота означает, что метод может вернуть пустое значение. Синтаксис чище выходит. Не надо гадать, может там быть пустое значение, или нет.


да, это плюс

Но с таким подходом наверное лучше особый синтаксис делать для мест в которых null не может вернуться — их меньше.


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

repository.GetBean()?.GetData()?.GetName() ?? «Bad Data»

все уже давно есть ))
А общий тип вводят дженерики, которые есть в Java, C#, Delphi, и напрочь отсутствуют в С++.


C#?

 class Program
    {
        static void Main(string[] args)
        {
            Generic(1);
            Generic("1");
        }

        static string Generic<T>(T value)
        {
            return value.ToString();
        }
    }


int:

--- C:\Users\sow\Documents\Visual Studio 2015\Projects\testawait\testawait\Program.cs 
    24:             return value.ToString();
029C2DE8  push        ebp  
029C2DE9  mov         ebp,esp  
029C2DEB  sub         esp,8  
029C2DEE  xor         eax,eax  
029C2DF0  mov         dword ptr [ebp-8],eax  
029C2DF3  mov         dword ptr [ebp-4],ecx  
029C2DF6  cmp         dword ptr ds:[0FBC7D4h],0  
029C2DFD  je          029C2E04  
029C2DFF  call        72BE6150  
029C2E04  lea         ecx,[ebp-4]  
029C2E07  call        717B6220  
029C2E0C  mov         dword ptr [ebp-8],eax  
029C2E0F  mov         eax,dword ptr [ebp-8]  
029C2E12  mov         esp,ebp  
029C2E14  pop         ebp  
029C2E15  ret  


string:
--- C:\Users\sow\Documents\Visual Studio 2015\Projects\testawait\testawait\Program.cs 
    24:             return value.ToString();
029C2E2C  in          al,dx  
029C2E2D  or          al,33h  
029C2E2F  ror         byte ptr [ecx+4D89F445h],0FCh  
029C2E36  mov         dword ptr [ebp-8],edx  
029C2E39  cmp         dword ptr ds:[0FBC7D4h],0  
029C2E40  je          029C2E47  
029C2E42  call        72BE6150  
029C2E47  mov         ecx,dword ptr [ebp-4]  
029C2E4A  mov         eax,dword ptr [ecx]  
029C2E4C  mov         eax,dword ptr [eax+28h]  
029C2E4F  call        dword ptr [eax]  
029C2E51  mov         dword ptr [ebp-0Ch],eax  
029C2E54  mov         eax,dword ptr [ebp-0Ch]  
029C2E57  mov         esp,ebp  
029C2E59  pop         ebp  
029C2E5A  ret  
вот только там он протеворечит сам себе, потому что то, что он показал это ActiveRecord и repository, и совершенно верно ему об этом рассказали. При этом рассказывает какие-то сказки про active record, очевидно не читав даже определения
ога спасибо большое, а то я не нашел в списке на сайте
забавно, как раз 2 года назад на ASP.NET MVC написали прилагу с рейтингом эло для кикера. Я аж сначала подумал, что кто-то из наших запостил, настолько похоже ))
программиста который пишет так выкидывают в окно без выходного пособия

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity