Вспомогательные функции как статические функции или процедурные функции?
Интересно, следует ли создать вспомогательную функцию в классе как статическую функцию или просто объявить ее как процедурную функцию?
Я склонен думать, что статическая вспомогательная функция - верный путь, потому что я могу видеть, к примеру, какая это вспомогательная функция. База данных::connect(), File::create().
что такое лучшая практика?
2 ответа
ИМО это зависит от того, какой это тип вспомогательной функции. Statics / Singletons очень усложняют тестирование, потому что они распространяют конкретные зависимости вокруг. Так что, если вспомогательный метод - это то, что я мог бы подделать в модульном тесте (и ваши примеры создания файлов и подключения к базам данных определенно подпадают под эту категорию), то я бы просто создал их как методы экземпляра для обычного класса. Пользователь будет создавать экземпляр вспомогательного класса по мере необходимости для вызова методов.
Имея это в виду, легче использовать шаблоны Inversion of Control / Dependency Injection / Service Locator для подделки, когда вы хотите протестировать код, если вы хотите имитировать доступ к базе данных, доступ к файловой системе и т. Д.
Это, конечно, имеет обратную сторону: теоретически существует несколько экземпляров вспомогательного класса, но это не является реальной проблемой в большинстве систем. Накладные расходы на наличие этих экземпляров минимальны.
Если бы вспомогательный метод был чем-то очень простым, что я никогда не хотел бы подделывать для теста, то я мог бы рассмотреть возможность использования статического.
Синглтон решает путаницу.
MyHelper.Instance.ExecuteMethod();
Экземпляр будет статическим свойством. Преимущество заключается в том, что вы получаете простой однострочный код в вызывающем методе, и он повторно использует ранее созданный экземпляр, что предотвращает накладные расходы на создание экземпляра в разных местах памяти и его удаление.