Длинные списки параметров | Кодементор

Например, предположим, что у нас есть UIButton подкласс, который мы хотим настроить на месте вызова, поэтому мы добавляем два параметра к его init метод:

final class Button: UIButton {

   init(textColor: UIColor, borderColor: UIColor)

}

// ...

let button = Button(textColor: .darkText,
                    borderColor: .darkText)

Выглядит вполне нормально.

Проходит некоторое время, и появляется необходимость настроить цвет фона, после чего нам понадобится еще один параметр:

final class Button: UIButton {

   init(textColor: UIColor, borderColor: UIColor, backgroundColor: UIColor)

}

// ...

let button = Button(textColor: .white,
                    borderColor: .white,
                    backgroundColor: .darkText)

До сих пор не что плохо, хотя я бы начал спорить.

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

Мы могли бы добавить параметры по умолчанию, чтобы сделать сайты звонков более красивыми, но это все еще не лучшее, что мы можем сделать. Что, если мы обернем все эти параметры в Config объект и использовал его для init?

final class Button: UIButton {

   init(config: Config)

}

extension Button {

   struct Config {

      var textColor: UIColor = .darkText
      var borderColor: UIColor = .darkText
      var backgroundColor: UIColor? = nil
      var animatesOnTouch = false
      var cornerRadius: CGFloat? = nil

   }

}

// ...

let button1 = Button(config: Button.Config())

var config = Button.Config()
config.textColor = .white
config.borderColor = .white
config.backgroundColor = .darkText
config.animatesOnTouch = true
config.cornerRadius = 8

let button2 = Button(config: config)

init чистый, сайт вызова чистый, и мы создаем пользовательский Config объект только при необходимости и установить только те свойства, которые нам нужны.

Выглядит намного лучше, не так ли?

В качестве бонуса мне нравится вкладывать связанные объекты, например Config в нашем случае. я предпочитаю Button.Config к ButtonConfig; в то время как они в основном одинаковы, как от количества символов, так и от того, как вы их произносите, вложенные объекты кажутся более семантически правильными, более организованными.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *