Первая версия должна быть предпочтительной по нескольким причинам. Во-первых, это значительно облегчает тестирование, поскольку каждый метод не зависит от другого состояния. Чтобы протестировать метод do_bar
, просто создайте экземпляр содержащего его класса и вызовите метод с различными параметрами. Если вы выбрали вторую версию кода, вы должны были бы убедиться, что в объекте установлены все правильные переменные экземпляра, прежде чем вызывать метод. Это тесно связывает тестовый код с объектом и приводит к неудачным тестовым случаям или, что еще хуже, к тестовым кейсам, которые больше не должны проходить, но все же делают, поскольку они не были обновлены, чтобы соответствовать тому, как теперь работает объект.
Вторая причина, по которой предпочтение отдается первой версии кода, заключается в том, что он более функциональный и облегчает повторное использование. Скажем, что другой модуль или лямбда-функция реализуют do_bar
лучше, чем текущий. Это не было бы закодировано, чтобы предположить некоторый родительский класс с определенной именованной переменной экземпляра. Для возможности многократного использования он будет ожидать, что любые переменные будут переданы в качестве параметров.
Функциональный подход - намного лучший подход ... даже в объектно-ориентированных языках.