Я думаю, что дядя Боб отлично поработал, объясняя это в своей книге «Чистый код» (потрясающий прочитанный кстати). Но во всяком случае, его точка зрения заключается в том, что вы не должны использовать статику в любом месте, где хотите использовать полиморфизм (который, я думаю, именно то, что вы хотите для вышеуказанного случая).
В вашем случае у вас есть UserManager. Ни в коем случае полное приложение, не так ли? У вас может быть нечто более сложное, использующее UserManager. Предположим, у вас есть собственная версия StackOverflow (не делайте этого, конечно, stackoverflow является потрясающим, не нужно конкурировать).
Итак, у нас есть LoginService, который вызывает UserManager.getUser(). Это неизменная зависимость (поскольку мы не используем полиморфизм). Если UserManager.getUser() требует базовую базу данных SQL, то угадайте, что вам нужно для запуска (или проверки) LoginService .... базы данных SQL!
public class LoginService {
public boolean authenticate(String username, String password) {
User user = UserManager.getUser(username); // hard dependency on implementation
// other stuff
}
}
Более распространенное решение - абстрактные вещи, которые могут измениться за интерфейсом. Таким образом, вы можете поменять местами реализации. LoginService имеет работу, которая должна быть проверена и не должна зависеть от конкретной реализации базы данных.
public interface UserManager {
User getUser(String id):
}
public class SQLUserManager implements UserManager {
@Override
public User getUser(String id) { // SQL stuff }
}
class LoginService {
public LoginService(UserManager userManager) {
this.userManager = userManager;
}
public boolean authenticate(String username, String password) {
User user = userManager.getUser(username);
// other stuff
}
}
Теперь LoginService могут 1) быть испытаны независимо от того, что используется UserManager и 2) можно оставить в покое, если изменения реализации пользователь.
Это не насмешка, а тестирование ваших компонентов без установки всего пакета приложений.
Это не то, что обычно называют геттерами. –
Я знаю об этом. Однако я не мог найти лучшего имени. – Emmanuel
.. и вместо этого используйте инъекцию зависимостей. 'new UserManager()' каждый раз, когда вы используете класс только для того, чтобы избежать «статических» методов, IMO - самый худший из них. – zapl