Как я могу улучшить три метода, которые немного выполняют другую работу

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

 fun getRoamingStatusErrorItem(): SettingItem {
        return SettingRoamingItem(
            isRoaming = false,
            processingText = "",
            isEnabled = false,
            isErrorVisible = true,
            isProgressVisible = false)
    }

    fun getRoamingStatusProgressItem(): SettingItem {
        return SettingRoamingItem(
            isRoaming = false,
            processingText = "",
            isEnabled = false,
            isErrorVisible = false,
            isProgressVisible = true)
    }

    fun getRoamingStatusProcessingItem(text: String): SettingItem {
        return SettingRoamingItem(
            isRoaming = false,
            processingText = text,
            isEnabled = false,
            isErrorVisible = false,
            isProgressVisible = false)
    }

Как видите, эти методы просто представляют разные состояния типа объекта; Я хочу понять, является ли это хорошей практикой кодирования, чтобы использовать ее таким образом, или я могу лучше реорганизовать ее.

Это не Java, вы можете удалить тег

Bentaye 21.06.2019 14:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
56
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Мало что можно сделать, не меняя весь класс. Единственная «простая» вещь — это добавить еще один конструктор, у которого нет параметра isRoaming: во всех трех примерах это значение равно false. Когда вы всегда передаете одно и то же значение: не передавайте значение, а используйте телескопирование конструктора, чтобы предоставить это значение как «по умолчанию».

Кроме того, если вы готовы потратить больше времени, вам следует изучить использование шаблона строитель здесь. Нравиться:

SettingRoamingItemBuilder().withText("").withProgressVisible(true)..
  .build()

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

Вы можете использовать шаблон Builder для SettingRoamingItem и использовать isRoaming = false, processingText = "", isEnabled = false, isErrorVisible = true, isProgressVisible = false для значений по умолчанию. Затем используйте что-то вроде .withProcessingText("text").enableVisibleError().build(), чтобы получить экземпляр, необходимый для ваших геттеров.

Вы можете переписать свой конструктор со значениями по умолчанию:

class SettingRoamingItem(
        var isRoaming: Boolean = false,
        var  processingText :String = "",
        var isEnabled: Boolean = false,
        var isErrorVisible: Boolean = true,
        var isProgressVisible: Boolean = false)



fun getRoamingStatusErrorItem(): SettingItem = SettingRoamingItem(isErrorVisible = true, isProgressVisible = false)


fun getRoamingStatusProgressItem(): SettingItem = SettingRoamingItem(isErrorVisible = false, isProgressVisible = true)


fun getRoamingStatusProcessingItem(text: String): SettingItem = SettingRoamingItem(processingText = text,
        isErrorVisible = false,
        isProgressVisible = false)
Ответ принят как подходящий

Если SettingRoamingItem находится под вашим контролем, вы можете просто указать некоторые значения по умолчанию, например:

class SettingRoamingItem(
  val isRoaming : Boolean = false,
  val processingText : String = "",
  val isEnabled : Boolean = false,
  val isErrorVisible : Boolean = false,
  val isProgressVisible : Boolean = false)

тогда ваши вызовы функций могут быть упрощены до:

fun getRoamingStatusErrorItem() = SettingRoamingItem(isErrorVisible = true)
fun getRoamingStatusProgressItem() = SettingRoamingItem(isProgressVisible = true)
fun getRoamingStatusProcessingItem(text : String) = SettingRoamingItem(processingText = text)

Но тогда: зачем вам вообще такие функции?

Но тогда: зачем вам вообще такие функции? - отслеживать состояния объектов в зависимости от вызовов API и привязывать их к пользовательскому интерфейсу

User3 21.06.2019 15:20

Я имею в виду: если вы можете написать SettingRoamingItem(isErrorVisible = true) против getRoamingStatusErrorItem()... но это, наверное, только я...

Roland 21.06.2019 15:22

Другие вопросы по теме