Вспомогательные функции как статические функции или процедурные функции?

Интересно, следует ли создать вспомогательную функцию в классе как статическую функцию или просто объявить ее как процедурную функцию?

Я склонен думать, что статическая вспомогательная функция - верный путь, потому что я могу видеть, к примеру, какая это вспомогательная функция. База данных::connect(), File::create().

что такое лучшая практика?

2 ответа

Решение

ИМО это зависит от того, какой это тип вспомогательной функции. Statics / Singletons очень усложняют тестирование, потому что они распространяют конкретные зависимости вокруг. Так что, если вспомогательный метод - это то, что я мог бы подделать в модульном тесте (и ваши примеры создания файлов и подключения к базам данных определенно подпадают под эту категорию), то я бы просто создал их как методы экземпляра для обычного класса. Пользователь будет создавать экземпляр вспомогательного класса по мере необходимости для вызова методов.

Имея это в виду, легче использовать шаблоны Inversion of Control / Dependency Injection / Service Locator для подделки, когда вы хотите протестировать код, если вы хотите имитировать доступ к базе данных, доступ к файловой системе и т. Д.

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

Если бы вспомогательный метод был чем-то очень простым, что я никогда не хотел бы подделывать для теста, то я мог бы рассмотреть возможность использования статического.

Синглтон решает путаницу.

MyHelper.Instance.ExecuteMethod();

Экземпляр будет статическим свойством. Преимущество заключается в том, что вы получаете простой однострочный код в вызывающем методе, и он повторно использует ранее созданный экземпляр, что предотвращает накладные расходы на создание экземпляра в разных местах памяти и его удаление.

Другие вопросы по тегам