• Что имеет в виду Рихтер (CLR Via C#) в 6-ой главе?

    ApeCoder
    @ApeCoder
    callvirt передается адрес объекта, он посмотрит на VMT класса этого объекта. найдет там реализацию метода и вызовет его. Если внутри реализации вызвать его же не указав какой конкретно класс использовать, то он найдет его же и будет бесконечная рекурсия. А если указывать какой конкретно класс использовать (какую именно реализацию метода) то это уже будет невиртуальный вызов по определению.
  • Почему в некоторых языках функции могут быть вне классов, а в других нет?

    ApeCoder
    @ApeCoder
    ⚡ Kotobotov ⚡, по-моему она внутри класса. То есть где-то вверху находится надпись class{ и она после фигурной скобочки и до последней фигурной скобочки. Этот скрытый класс он же вроде внутри какого-то класса со всеми потрохами нет?
  • Почему в некоторых языках функции могут быть вне классов, а в других нет?

    ApeCoder
    @ApeCoder
    "В джава кстати тоже есть независимые функции"

    Как их написать и где чтобы они были вне класса? Я погуглил но нет нашел способа
  • Как наглядно увидеть процесс сборки мусора в программе?

    ApeCoder
    @ApeCoder
    ТыжСисАдмин, ну вообще на абстрактный вопрос можно ответить на том же уровне абстракции "как сварить кашу? - Найдите рецепт для каши в интернете, купите ингридиенты, выполните инструкции в рецепте" тут на большинство вопросов можно просто подсказать термины для поиска в интернете типа "garbage collection monitoring tools <ваша платформа или язык>"
  • Почему лямбда выражение не выполняется?

    ApeCoder
    @ApeCoder
    Evgeniel, так сложно будет. Разберитесь, что такое dynamic и чем отличается от object. Что такое IEnumerable и какие типы возвращает серилизатор (хотя бы в отладчике посмотрите).
  • Почему лямбда выражение не выполняется?

    ApeCoder
    @ApeCoder
    Evgeniel, разумеется - потом там не будет Any - надо приводить к соответствующим типам
  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    Алексей Николаев, я PHP не знаю, может там другие традиции.

    По моему:
    1. Выбросить исключение можно, но не как часть основного сценария использования предиката (например, вам передали неправильные параметры)
    2. Выбросить исключение можно, но переделать, чтобы это был не предикат, а проверка, см. например, ответ здесь:
    https://stackoverflow.com/questions/4019748/progra...

    It would be more convenient to write:

    public function AddProduct($productId, $name, $price, $isCurrentlyInStock)
    {
        Contracts::Require(__FILE__, __LINE__, is_int($productId), 'The product ID must be an integer.');
        Contracts::Require(__FILE__, __LINE__, is_string($name), 'The product name must be a string.');

    instead of:

    public function AddProduct($productId, $name, $price, $isCurrentlyInStock)
    {
        if (!is_int($productId))
        {
            throw new ArgumentException(__FILE__, __LINE__, 'The product ID must be an integer.');
        }
    
        if (!is_int($name))
        {
            throw new ArgumentException(__FILE__, __LINE__, 'The product name must be a string.');
        }


  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    longclaps, тогда, какой смысл в вашем высказывании здесь вообще? Задающий вопрос - новичок. Опытный человек полез бы в документацию или воспользовался поиском и все выяснил. Чтобы воспользоваться критическим мышлением нужны данные - у новичка их нет, а вы его посылаете в неверном направлении.

    "Исключения - это плохое название. Запутывающее. Неудачное. На самом деле за этим скрывается альтернативный поток управления" - очевидно не так, потому, что кроме изменения потока управления там есть еще кое-что и все вокруг предназначено для исключительных ситуаций. Соответственно ваш ответ новичка запутает. Вы сами путаете предназначение и реализацию.
  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    longclaps,
    "На самом деле за этим скрывается альтернативный поток управления".


    За этим скрывается не только альтернативный поток управления, но и сообщение, возможность выводить стектрейс дефолтное поведение с выводом стектрейса, возможность использовать инструменты отладки для сингнализации места вызова исключения, а так же тормоза при использовании (попробуйте в вашем приммере уменьшить глубину вызова до 2 - вы получите замедление в два раза, это надо учитывать, например, если у вас 99% вызовов - неглубокая рекурсия, а есть 1% с глубокой)

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

    Вот только нахрена это делать - ума не приложу


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

    ApeCoder
    @ApeCoder
    longclaps,

    Топикстартер задался очень здравой задачей - выработать годное отношение к исключениям, и привёл практический пример.


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

    Применять что-то не по назначению можно, но надо подумать что все остальные будут рассчитывать на основное назначение.

    Если руками - ну что-то вы там предприняли, но стек он всё равно бы освободил.


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

    В питоне то же самое, но там и вызов функции - дорогая задача,


    То есть не исключения легковесные а все остальное тяжеловесное?
  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    Исключением может быть отсутствие ценника, если, например, приняты правила со у каждого товара должен быть ценник или, например, начавшийся пожар.
  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    longclaps,
    ярлыками можете свой лоб обклеить


    Извините, был эмоционален. Просто использование таймера + декоратора + цикла, там где все это уже есть вместе с повторением несколько раз немного развеселило.

    Ответ на вопрос о скорости исчерпан.


    Ок ладно. На данном бенчмарке у меня получается ~20+-5% (я просто несколько раз запустил то, что вы написали, мне влом разбираться как в питоне это делать нормально).

    Теперь надо автору вопроса порекомендовать что-то, у него PHP. Как там? Вам же за себя ловко?

    По памяти всё тривиально - обработчик исключения освобождает всю цепочку кадров стека вплоть до помеченного кадра, никакой параллельный "коллстек" не нужен.


    Ссылка на трейсбек хранится в объекте-исключении и лучше ее никуда не присваивать, как я понял. А почему она там хранится? Потому, что исключения предназначены для исключительных ситуаций и нужна диагностика.

    Даже как-то неловко за вас


    Ну, я исправился.
  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    longclaps, то, есть по вашим измерениям, эксепшены сами по себе тормозят всего в 2.5 раза?
    Как с ответами на остальные вопросы?

    from time import time


    Как я вижу, находить новые применения непредназначенным для этого вещам - ваш конек. Вроде в python есть timeit, который как раз предназначен для бенчмаркинга и за вас все сделает и точнее - почему вы не использовали его. Зачем эти декораторы?

    (я не python программист, просто набрал в гугле python benchmarking)
  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    longclaps, спасибо, что вы меня просветили, приятно встретить такого знающего человека. Только у меня есть несколько вопросов.

    1. По примеру кода задающего мне кажется, что это не Python а PHP
    2. Хотелось бы сравнить исключение и возвращаемое значение по объему памяти:

    try: 
      b = 1/0
    except Exception  as e:
      pint(e.__traceback__)


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

    Я вот нашел только вот это и там вот такие результаты:

    100,000 iterations
    with_try (168.793 ms)
    with_try_exc (223.589 ms)
    without_try (24.877 ms)
    without_try_not (20.992 ms)
  • Можно ли выбрасывать исключение в предикатах?

    ApeCoder
    @ApeCoder
    Микроскоп - это плохое название, запутывающее. На самом деле за этим скрывается тяжёлый предмет, которым удобно колоть орехи.

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

    ApeCoder
    @ApeCoder
    Moskus, неудача в тренировках играет важную роль - обратной связи "как неправильно".

    Ну а если не так придираться к словам, то если побочный эффект практически неизбежен, то это можно обозначить фразой "чтобы сделать x нужно y" кому надо, тот поймет ;)
  • Какую функцию выполняет Application Layer?

    ApeCoder
    @ApeCoder
    На картинке в книжке есть UI, Application, Domain, Infrastructure

    Например мы пишем консольное приложение для того, чтобы управлять пользователям. По команде -a или --add надо принять имя пользователя и email из параметров и добавить пользователя. В случае если такой пользователь есть, надо красным цветом вывести сообщение об ошибке, иначе вывести ID пользователя.

    Разбиение по слоям:
    - UI - разбор параметров командной строки, оформление полученных данных для вывода на консоль
    - Application - UserManagementService (не веб сервис, а сервис в смысле книжки Эванса - класс с операциями не относящимися на прямую к сущностям) с методом типа UserId AddUser(string name, string email)
    - Domain - класc User, какой-нибудь Users: IList
    - Infrastructure - ORM какой-нибудь

    Сам по себе вебсервис может быть в Application layer.

    Application type относится скорее к технологическим штучкам. Application layer - это часть бизнес логики, которая характерна для конкретного приложения, но это именно бизнес логика.