Как реорганизовать метод с более чем 6 параметрами в kotlin

#java #android #kotlin #mvvm #refactoring

#java #Android #kotlin #mvvm #рефакторинг

Вопрос:

Мне нужно сделать запрос в api, и я должен отправить 11 параметров, но, используя инструмент анализа кода, сообщите, что я должен отправить максимум 6. Была бы какая-то форма рефакторинга для меня, чтобы отправить эти параметры без отправки таким образом? Я использую kotlin, я упростил свой код:

 viewModel.requestTest(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param10)
  
 class viewModel

fun requestTest (param1 , param2, param3 : String? = "" , param4 : String? = "", param5 : String? = "", param6 : String? = "", param7 : String? = "", param8 : String? = "", param9 : String? = "", param10 : String? = "" , param10: String? = "") {
    //do request filling the body with these parameters
}


  

Комментарии:

1. Вы пробовали передавать именованные параметры вместо позиционных параметров? С именованными параметрами на самом деле нет причин для такого ограничения.

2. здравствуйте, я не совсем понял ваш вопрос, но я отредактировал в своем вопросе, как работает мой метод «requestTest» в моей ViewModel.

3. ваш инструмент жалуется на место, где вы объявили метод, или на место, где вы его вызываете?

4. ignoreDataClasses по умолчанию используется значение true , поэтому ответ @Raman, вероятно, сработает

5. извините, Раман, я принял ваш ответ. Я создам новый вопрос, если вы знаете эту новую проблему, я был бы признателен за вашу помощь

Ответ №1:

Используйте класс данных в качестве оболочки для параметров.

 data class RequestParams(val param1: String, ..., val paramN: String)

fun requestTest (params: RequestParams) {
    // use parameters like params.param1
}
  

Обратите внимание, вы также можете указать значения по умолчанию для этих параметров и использовать именованные аргументы, чтобы упростить этот тип вызова в большинстве случаев, например

 data class RequestParams(
  val name: String = "foo",
  val value: Int = 3,
  ...,
  val whatever: String? = null)

val params = RequestParams(
  value = 5
)

...
  

Обратите внимание, что вы все еще передаете более 6 параметров конструктору класса данных, но обычно инструменты компоновки распознают, что классы данных являются идиоматическим способом хранения многих свойств, и игнорируют их при проверке этого правила (как отметил @Matt Timmermans в комментариях к вашему вопросу, это действительно так).

Если это не решит вашу проблему, то вы могли бы сгруппировать свои 10 параметров в 2 класса данных с параметрами 5 5 или 4 6 — имеет ли это какой-либо смысл, все зависит от базового бизнес-значения ваших параметров.

Если не имеет смысла разделять параметры таким образом, я бы предпочел добавить аннотацию linter ignore в конструктор класса данных, а не кодировать специально для работы с linter.

Комментарии:

1. останется ли класс данных RequestParams внутри моей ViewModel?

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

3. Спасибо за ответ. Но, как я уже сказал в вопросе, я использую инструмент обнаружения, который не допускает более 6 параметров в методе… Использование этого «класса данных», который поставляется с 11 параметрами, не выдаст ту же ошибку?

4. привет, Ренан, я сделал то, что вы мне сказали, но это создало еще одну проблему, я отредактировал вопрос, чтобы проиллюстрировать

Ответ №2:

я думаю, что полезно использовать объект, подобный Bundle(https://developer.android.com/reference/android/os/Bundle?hl=en ) в системе Android