• Как правильно обрабатывать ошибки в C#?

    Nipheris
    @Nipheris Куратор тега C#
    Т.е. нужна некая философия

    А какие книги вы уже пробовали читать, раз такое спрашиваете?

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

    Все это дает вам набор простых правил:
    1) выбрасывать исключение нужно тогда, когда вы не собираетесь обрабатывать возникшую ситуацию в рамках текущего алгоритма. Иными словами, для работающей в данный момент функции эта ситуация - "исключительная". Пример: вы пишете функцию для чтения GIF-файла в Bitmap, и по ходу чтения проверяете соответствие получаемых данных формату GIF-файлов (например, убеждаетесь в наличии GIF89a в начале файла). Если вдруг вы видите, что формат файла нарушен, то вам ничего не остается кроме как выбросить исключение, т.к. вы не можете продолжить выполнение основного алгоритма - считывание файла. Внутри функции считывания вы не знаете заранее, как вызывающий код захочет обработать эту проблему, вам и не нужно это знать;
    2) перехватывать исключение конкретного типа нужно тогда, когда в задачу текущего кода входит и обработка ошибок тоже. Иными словами тогда, когда исключение в вызванном коде - лишь один из вариантов нормальной работы вызывающего кода. Вернемся к примеру с GIFками: если для библиотечной функции чтения файла нарушение формата - это критическая проблема, то для вызывающего эту функцию GUI-приложения это нормальная ситуация - ее можно и нужно обработать, выдав пользователю соответствующее сообщение, или просто пропустить файл, если обрабатывается сразу несколько картинок. Или например, если вы пишете веб-сервис, вы врядли хотите, чтобы весь сервис прекратил работу из-за ошибки при обработке какого-то одного запроса. Поэтому в веб-сервере, раздающем файлы вы, к примеру, можете перехватывать все FileNotFound исключения, и выдывать ошибку 404, а на все остальные исключения внутри обработчика запроса - ошибку 500 и в обоих случаях писать в error.log.

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

    Отличный пример разных подходов - методы Parse/TryParse у числовых типов в дотнете. Первый возвращает значение и выбрасывает исключение, второй записывает значение через выходной параметр, возвращает bool и НЕ выбрасывает исключение. "Try" в названии второго метода подчеркивает, что для этого метода неудача при попытке распарсить число из строки - НОРМАЛЬНАЯ ситуация, и метод в этом случае вернет false. Для метода Parse напротив, такая ситуация будет исключительной, т.к. ему просто-напросто нечего будет возвращать, и дальнейшая нормальная работа кода, в том числе вызывающего, невозможна.
    Поэтому метода TryParse чаще используют тогда, когда вероятность ошибки высока и ее обработка - одна из ветвей алгоритма. Например при считывании пользовательского ввода мы сразу можем попросить пользователя исправить введенное значение.
    С другой стороны, Parse применяется если ошибка маловероятна, мы не готовы ее обработать и лучше прервать всю операцию целиком. Например если мы получили от сервера невалидный ответ, мы не попросим его исправить этот ответ. Дальнейшее общение с сервером лучше прервать, т.к. имеет место нарушение протокола и можно наломать дров.
    Ответ написан
    Комментировать
  • Какой вариант применения исключений лучше?

    search
    @search
    мама говорит что я особенный
    Первый вариант предпочтительнее. Потому что первый вариант - это рецепт: всегда кидайте исключение когда функция не может вернуть (или сделать) то что от неё ждут.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Декларируемые исключения Java — это плохо. Однако эти декларируемые исключения позволяют осознать, что есть три типа аварий.

    1. Среда исполнения чувствует себя плохо, исполнение программы под угрозой (сработала самопроверка в какой-то части программы, не подконтрольной программисту). Например, срабатывание какого-то встроенного детектора, определяющего запись в чужую память. Выпадают где угодно. Их на практике не приходится ни выбрасывать, ни ловить.

    2. Нарушена логика программы (сработала самопроверка, зависящая от программиста). Неверный аргумент, выход за границу массива. Выпадают где угодно. Их часто выбрасывают и крайне редко ловят.

    3. Нестабильная часть программного окружения чувствует себя плохо. Файл не найден, нет связи. Выпадают в определённых точках. Часто выбрасывают и часто ловят. В Java только их требуется декларировать.

    Таким образом, ваш холивар относится к вопросу: выбрасывать ли исключение, если случилась авария 3-го типа? Я лично замечал подобные вопросы только в одном языке — Си++. Думаю, это связано с двумя вещами. 1) Большие издержки, связанными с определёнными методиками обработки исключений. 2) Довольно невнятное поведение Си++ при выпадении исключения из конструктора.

    Если же отойти от недостатка конкретного языка — даже по поводу обычного HTTP 404 есть «путь Indy» и «путь cURL» — выбросить исключение и сообщить о ненайденном документе другими методами. За первое и за второе можно найти кучу аргументов.
    Ответ написан
    Комментировать
  • Зачем используется две бд PostgresSQL и MongoDB/Redis?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Реляционная БД хорошо себя показывает для целостности данных, хорошая и крепкая структура... но есть минус — когда много связей и таблицы глубокие, то приходится делать очень большые и сложны запросы, некоторые могут выполняться долго...

    Тогда делают денормализацию данных — объединяют несколько таблиц в один документ, например в документе с товаром будут сразу и варианты с ценами, и изображения и категория и комментарии, тогда при запросе этого документа по id идет 1 запрос и данные быстро отдаются.

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

    Также Редис используют для хранения в нем сессий https://habrahabr.ru/post/318836/
    Ответ написан
    8 комментариев
  • Это заказчики такие скупые пошли или я чего-то не понимаю?

    Bandicoot
    @Bandicoot
    Вась-программист
    Ну всё, хорошие разработчики перестали быть дефицитом) Смиритесь, это рынок. Современное программирование по сложности можно сравнить с инженерным делом, т.е. по сути ничего сложного здесь и нет. А задротов и самоучек хватает.
    Ответ написан
    30 комментариев
  • Как назвать класс, который имеет доступ к базе данных?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Yii есть ActiveRecord, который привязан к таблице

    Но он это делает через несколько абстракций...
    В самом Yii2 за работу с БД отвечает https://github.com/yiisoft/yii2/blob/master/framew...

    И как правильнее поступать, привязывать такие классы к сущности или к таблице?

    Вы вроде правильно работаете через репозиторий
    Вот хороший и популярный паттерн, решающий ваш случай:
    design-pattern.ru/patterns/data-mapper.html
    Ответ написан
    1 комментарий
  • Что говорить валютному контролю в банке насчет выполненных работ?

    vicodin
    @vicodin
    Имею некоторый опыт
    выведите эти 14 баксов на пейпал, купите две бутылки пива и выпейте одну за здравие Валютного Контроля, а вторую за Апворк
    Ответ написан
    10 комментариев
  • Является ли нарушением закона Деметры возврат callable или пути к классу?

    @Xilian
    Программист 1С, сетевые технологии, SQL
    Что такое "путь к классу"?

    >>Ведь по сути, он ничего не собирает и не создает, а лишь отдает ссылки на объекты.

    Ссылка - это просто указатель на область памяти без объяснения, что там находиться. Возврат ссылки нарушает принцип инкапсуляции объекта.

    >>Закон Деметры гласит, что нельзя пользоваться классами, которые были возвращены другими классами.

    Запрещено выводить из области видимости mutable объекты, это нарушает принцип инкапсуляции. Если у тебя еще язык с GC у тебя и утечки памяти поедут плодиться.
    Ответ написан
    2 комментария
  • Является ли нарушением закона Деметры возврат callable или пути к классу?

    @galliard
    Закон Деметры гласит, что нельзя пользоваться классами, которые были возвращены другими классами. Распространяется ли это на вызываемые (callable) значения, или пути к классу?


    Не распространяется на пути к классу. На callable не распространяется, если в теле callable нет ссылки на $this.

    Вообще смысл закона в том, что бы ты не мог изменить состояния объекта без взаимодействия с ним.

    Является ли класс, генерирующий callable, фабрикой?

    Является, если создается новый инстанс callable.
    Ответ написан
    Комментировать
  • Есть ресурсы по PHP и MySQL типа learn.javascript.ru?

    php.net/manual
    Ответ написан
    Комментировать
  • Составили требований для верстальщика, не перегнули ли палку?

    Не вижу каких-то чрезмерных требований, наоборот их можно еще дополнить. Если читать сей "документ", может показаться что вы излишне требовательны, но на деле для нормального верстальщика все то что вы описали является нормой. Про бэм тоже не понял.
    Ответ написан
    Комментировать
  • Как Wordpress выключает ресенд формы при обновлении страницы?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Для отправки форм в админке WordPress использует файл /wp-admin/admin-post.php, аналогичный более популярному и привычному /wp-admin/admin-ajax.php, после обработки данных на хуках происходит внутренний редирект. Отсюда и отсутствие данных в $_POST после такой оработки.

    Вот тут подробнее как этим пользоваться в своих целях.
    Ответ написан
    Комментировать
  • Может ли фабрика генерировать коллекцию объектов?

    @res2001
    Developer, ex-admin
    Новая сущность то же будет фабрикой, которая создает коллекцию.
    Если вы используете только коллекции, то смысла в единичной фабрике нет, если же нужно создавать и единичные объекты, то сделайте 2 фабрики для коллекции и для 1 объекта.
    Ответ написан
    Комментировать
  • Является ли хорошей практикой делать интерфейсы даже тогда, когда класс не планируется заменять?

    @ImSorry
    В этой статье хорошо написано, когда нужен интерфейс и зачем он нужен
    sergeyteplyakov.blogspot.com/2014/12/what-are-inte...
    А от себя добавлю, что фанатичное придерживание принципов SOLID может привести к обратному, а именно увеличению сложности проекта.
    Ответ написан
    4 комментария
  • Является ли хорошей практикой делать интерфейсы даже тогда, когда класс не планируется заменять?

    @kttotto
    пофиг на чем писать
    Нет, не надо. Не нужно усложнят проект там где это не требуется.
    Есть правило первой пули: сначала Вы пишите максимально просто и только когда приходят первые изменения, которые требуют абстракции, тогда только Вы ее выделяете.
    Ответ написан
    2 комментария
  • Что за шум вокруг темы, что программисты скоро не нужны?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    Вот вы все шутите, а реальность для программистов всех мастей действительно изменится. Греф в общем-то прав, остается только предсказывать, как это произойдет.

    10 лет назад был огромный спрос на сетевых инженеров (те, кто циски и джуниперы настраивают), им платили хорошие деньги. Операторов было много, сети везде были разными, работа сложной. Теперь мелких операторов почти не осталось, весь рынок поделен на сотовой связи между БИГ4, на ШПД тоже осталось 5 крупных игроков. Так вот эти операторы соптимизировали свои бизнес процессы так, что связистов потребовалось значительно меньше. хотя общая сложность сетей значительно возрасла. Как сейчас работает оператор? Фактически один человек рисует схему, как должно быть настроено, другой настраивает согласно этой схеме. Фокус в том, что раньше при отсутствии первого надо было держать 5 человек высокой квалификации второго типа. А теперь надо одного первого и 5 других, просто умеющих читать. Да, высококвалифицированные люди остались, но только их стало значительно меньше.

    К чему я все это. Недалек тот день, когда тысячи программистов будут не нужны. Вместо них нужны будут десятки тех, кто рисует схему, но кто ниразу не набирал сам код. Остальные будут тупо применять какой-либо инструмент для реализации этой схемы. Ну и останется еще чуть-чуть людей, кто будет пилить этот инструмент. Когда это произойдет? Когда наступит так называемое насыщение рынка, когда крупные, возможно федеральные, игроки в весьма ограниченном количестве полностью поделят между собой все заказы на программистов. Тогда все процессы будут унифицированы и наступит пора их оптимизации.
    Ответ написан
    7 комментариев
  • Что за шум вокруг темы, что программисты скоро не нужны?

    sabramovskikh
    @sabramovskikh
    Вполне веростяно лет через 10 уже ИИ будут все делать.
    Недавно в гугле ИИ написала ИИ лучше себя и быстрее
    Ответ написан
    4 комментария