Логирование

Если вы добавляете отладочную печать в код модуля, то, вероятно, вы нарушаете Single Responsibility Principle. Рассмотрим 2 случая.

Для отладки модуля в продакшене вам, как программисту, нужно собрать некоторые логи. И вы решаете добавить отладочную печать прямо в этот модуль. Т.е. инициатором изменения в коде являетесь вы, а не «владелец» модуля (например аналитик). Таким образом вы нарушаете SRP. Что, например, выльется в конфликты в системе контроля версий, когда другой разработчик внесет запрошенные аналитиком изменения.

Аналитику для принятия некоего решения потребовалось собрать статистику. В этом случае стоит ввести абстракцию логгера, как мы это делали, например для генератора идентификаторов.

В первом случае логирование нужно добавлять в подпроекте main. Т.е. воспользоваться Open-Close Principle, расширить поведение без модификации артефакта.

Можно использовать паттерн декоратор.

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

Если мы хотим залогировать вызов функции, то можем применить декоратор к переменной, содержащей эту функцию. Воспользуемся alter-var-root или robert-hooke.