• Как реализуется обработка исключений на корпоративных проектах?

    Для того, чтобы обрабатывать исключения можно:
    1. Воспользоваться аннотацией @ExceptionHandler. Чтобы не прописывать её в каждом контроллере и не использовать наследование, её можно применить к методу в классе с аннотацией @ControllerAdvice
    2. Реализовать свой HandlerExceptionResolver и зарегистрировать его в WebMvcConfigurer
    Ответ написан
    Комментировать
  • Как научиться писать юнит-тесты, в которых будет смысл и не ошалеть от скуки?

    @dborovikov
    Ну во первых написание в несколько раз большего кода не является проблемой. Ибо есть правило: «написание кода не является узким местом разработки». Узкое место это например постоянный реинжениринг дизайна. Тестов и должно быть больше, чем оснвоного кода, но код тестов должен быть простым, и легко пишушимся. Что-то подали на вход, что-то получили на выходе.

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

    И последнее, всегда есть вещи которые практически нельзя протестировать, например многопоточность. Это нормально. Просто такой код должен быть локализован.
    Ответ написан
    4 комментария
  • Паттерн Стратегия

    @rtorsten
    Как реализовать метод void changeValueTo1::Change() так, чтобы он имел доступ к параметрам класса MyClass?

    Наиболее простой способ, как уже и сказали сделать перекрестную ссылку/указатель.
    class changeValueTo1 : public changeValue
    {
    public:
        changeValueTo1(General * p) : _parent(p) {}
        ~changeValueTo1() {}
        void Change();
    
    private:
        General * _parent;
    };
    
    void changeValueTo1::Change()
    {
        //должен изменить значение параметра a объекта класса MyClass на 1
        _parent->a = 5;
    }
    
    MyClass::MyClass() {
       object = new changeValueTo1(this);
    }
    


    В данном случае это параметр класса General, а не MyClass как ты указал в комментарии. Если нужно именно MyClass то необходимо в changeValueTo1 изменить тип указателя.
    Ответ написан
    1 комментарий