Задать вопрос
@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, но и другие типы данных.
  • Вопрос задан
  • 159 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
Наоборот, написать общую функцию для таких целей — это хороший способ.
У вас тут посыл запроса, обработка кода ответа, парсинг. Это всё отлично выносится в общую функцию, которой потом удобно будет пользоваться. Особенно с дженериками, которые добавили в go1.18
Ответ написан
@rPman
Я бы оставил так и не усложнял логику
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Не стоит объединять похожие, но разные по смыслу вещи. Если конкретный участок кода повторяется прям всюду - вынесите его в отдельный сервис.
Конкретно у вас тут из одинакового - только логгирование при НЕ 200м ответе. Вы ничего особо не сэкономите.
Лучше оставить как есть.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы