Статические Методы - Зло? Окончание
Начало
Когда вы изучаете функциональное программирование, вы начинаете понимать, что статические методы вредны только в том случае, если они работают с общим состоянием. Например, когда они позволяют вам читать или изменять состояние глобальной переменной.
Статические методы, которые не работают с общим состоянием, по-прежнему обладают хорошими характеристиками, которые мы обсуждали ранее (удобство, немного лучшая производительность), но не проявляют соответствующих недостатков (сильная связанность, запутанный график зависимостей).
Единственная причина, по которой эти недостатки становятся проблемой, заключается в том, что вам нужно отслеживать изменения состояния на протяжении всего потока выполнения вашей программы. Без изменения состояния эти два момента перестают быть проблемой.
Вы же не беспокоитесь об "абстрагировании" вызовов вроде
Math.Min(a, b), верно? Вам также не следует беспокоиться об отделении вашего кода от ваших собственных статических методов, которые не сохраняют состояния.Рассмотрим следующий класс:
public class CustomerService {
public void Process(string cust, string addr)
{
Address a = CreateAddress(addr);
Customer c = CreateCustomer(cust, a);
SaveCustomer(c);
}
…
}
Обычно мы сделали бы методы CreateAddress, CreateCustomer и SaveCustomer приватными экземплярными методами. Но, их можно сделать статическими: private static Address CreateAddress(string addr)Преимущество этой версии в том, что статические методы заставляют вас следовать принципам функционального программирования. Становится невозможным по ошибке сослаться на состояние класса внутри метода, и это заставляет вас явно указывать в методах, какие данные им нужны, и какие они производят на выходе.
=> new Address(addr);
private static Customer
CreateCustomer(string name, Address addr)
=> new Customer(name, addr);
private static void SaveCustomer(Customer c)
{
var repository = new Repository();
repository.Save(c);
}
4. Вывод
За свою карьеру программиста я испытывал разное отношение к использованию статических методов. Ещё недавно я пытался всегда явно вводить все нужные зависимости. В настоящее время я делаю это только для зависимостей, которые сохраняют состояние. Если метод не сохраняет состояния, его можно сделать статическим и вызвать напрямую.
Тестировать статические методы также проще, чем экземплярные, потому что они не требуют создания экземпляра класса.
Источник: https://enterprisecraftsmanship.com/posts/static-methods-evil/