Здравствуйте, уважаемые подписчики и гости канала!
На самом деле принципиальная разница и есть и при этом иногда ее нет. Плюс все очень сильно может зависеть от ЯП. Например, если мы говорим про Java, то просто так функции вы не сделаете - не для всего это возможно. Отдельно golang - я его не особо знаю, но кажиcь там своя тема. Поэтому говорим скорее про python, php, typscript, javascript.
Чистые функции
Лично я предпочитаю иметь чистые функции в составе пакета, а не в виде статических методов статического класса. Это всякие простые реплейсы, простые валидаторы и пр. у чего нет какой-то конфигурации или глобального контекста. Очень удобно, например, просто делать какой-то реплейс - ну скажем два и более пробела заменять на один.
Сервисные дела
Если у вас какое-то определение языка по регулярке, то список языков и их паттерны символов, конечно можно сделать константой вне функции и использовать ее внутри функции, но это вариант скорее не очень. По мне лучше сделать это сервисным классом, который в конструкторе получает этот список языков и паттернов и имеет один или более методов для работы с этим делом. В этом случае класс, как мне видится, будет более чистым и легким для тестирования и преконфигурации, но при этом ему потребуется DI механизм, что с неправильным исполнением потянет кучу неудобств в проект.
SDK и пр.
Иногда требутеся шарить целый набор сервисов между проектами и тогда можно сделать что-то типа SDK. Я очень люблю сервис ориентированность в этом вопросе. При этом врядли вы сделаете DI конечных сервисов в свой проект. Скорее вы через DI будете получать главный экземпляр точки входа в SDK. Далее из этой точки можно автокомплитом получать весь список доступных сервисов и далее вызывать их методы.
Например это может выглядеть так:
MySDK.CacheService.put(‘lalala’, 42)
MySDK.CacheService.get(‘lalala’)
MySDK.MailService.send(email, ‘lalala’)
В принципе, эти сервисы могут иметь состояние, но оно скорее будет у них про некоторую конфигурацию или какой-то локальный кеш.
Паттерн ActiveRecord
А вот классы для работы с таблицами в БД с паттерном ActiveRecord и подобное я крайне не привествую.
Плохо:
const user = MySDK.UserService.get(15)
user.setName(‘Artur’)
user.save()
Норм:
const user = MySDK.UserService.get(15)
user.setName(‘Artur’)
UserService.save(user);
Мне нравится, когда каждый занимается своим делом и классы не исключение) Объект юзера просто должен хранить инфу о юзере, а сервис должен заниматься сохранением или оптимизированным массовым сохранением. А в случае с active record ответственность размазывается. Опыт был, мне не понравилось.
---
Подписывайтесь на канал, ставьте лайки, оставляйте комментарии - это помогает продвижению в Дзене.
Кроме этого:
Подписывайтесь в Telegram: https://t.me/lets_goto_it