@Ciscoridze

Go. Что делать, если в коде много схожих друг с другом функций?

У меня есть некое приложение, которое обращается к API облачной платформы, полулачет JSON, парсит его и возвращает результат.
И на каждый случай у меня написана отдельная функция, которая запрашивает то список тасков, то список кластеров, то еще что-то.
Функции получаются очень похожи друг на друга, но в тоже время написать одну для всех, которая будет принимать аргументы в зависимости от случая, тоже кажется мне не очень хорошим способом решения данной проблемы.
Как в подобном случае стоит поступить?

Пример функций ниже:
//Возвращает список всех работающих кластеров (у которых healthy true)
func getHealtyClusters() []gjson.Result {
	url := API + "/clusters/" + ServiceInstanceID
	res, body := makeRequest(map[string]string{"Authorization": "Bearer " + accessToken}, "GET", url)
	if res.StatusCode == 200 {
		healtyClusters := gjson.Get(string(body), `clusters.#(healthy==true)#.name`).Array()
		return healtyClusters
	} else {
		_logStringGenerate("GET ALL HEALTH CLUSTERS", string(body), false, strconv.Itoa(res.StatusCode))
		log.Println(State.DebugLogString)
		return nil
	}
}

//Возвращает таски по конкретному кластуре
func getClusterTasks() []gjson.Result {
	url := API + "/tasks/" + ServiceInstanceID + "/30/1"
	res, body := makeRequest(map[string]string{"Authorization": "Bearer " + accessToken}, "GET", url)
	if res.StatusCode == 200 {
		tasks := gjson.Get(string(body), `taskList.#(metadata.ClusterID=="`+State.ClusterID+`")#`).Array()
		return tasks
	} else {
		_logStringGenerate("GET CLUSTER TASKS", string(body), false, strconv.Itoa(res.StatusCode))
		log.Println(State.DebugLogString)
		return nil
	}
}


Также функции могут возвращать не только []gjson.Result, но и другие типы данных.
  • Вопрос задан
  • 158 просмотров
Пригласить эксперта
Ответы на вопрос 3
Наоборот, написать общую функцию для таких целей — это хороший способ.
У вас тут посыл запроса, обработка кода ответа, парсинг. Это всё отлично выносится в общую функцию, которой потом удобно будет пользоваться. Особенно с дженериками, которые добавили в go1.18
Ответ написан
@rPman
Я бы оставил так и не усложнял логику
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Не стоит объединять похожие, но разные по смыслу вещи. Если конкретный участок кода повторяется прям всюду - вынесите его в отдельный сервис.
Конкретно у вас тут из одинакового - только логгирование при НЕ 200м ответе. Вы ничего особо не сэкономите.
Лучше оставить как есть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы