Вся неопределённость из-за того что определить, нарушен принцип или нет, можно только зная контекст.
Один и тот же код, но в разных контекстах, может как нарушать, так и не нарушать такой принцип.
Представим себе такой псевдокод:
конфиг = прочитать_конфиг_из_файла()
соединение = открыть_соединение_с_бд(конфиг.строка_подключения)
соединение.сохранить(данные)
соединение.закрыть()
Если у нас контекст, что это какой-то большое приложение, которое написано в ОО-стиле, то тут SRP явно нарушен:
Читать конфиг и открывать соединение нужно в другой функции и передавать в функцию по сохранению данных уже открытое соединение. Обработку ошибок при чтении файла или подключении стоит делать в другом месте.
Разделение этого когда повысить надёжность и облегчит разработку и поддержку, уменьшится дублирование кода, а местами код станет сильно проще.
С другой стороны, если у нас контекст - это просто небольшой скрипт, который делает бэкапы и он полностью самостоятелен, но нарушения нет - попытка разделить этот "скрипт" приведёт только к усложнению всего.
Если после вынесения ответственностей в отдельные модули приводит к снижению качества кода и усложнению поддержки, то SRP в изначальном виде нарушен не был, либо ты допустил ошибки при попытке выделить ответственности.