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