Длинные списки параметров | Кодементор
Например, предположим, что у нас есть 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
; в то время как они в основном одинаковы, как от количества символов, так и от того, как вы их произносите, вложенные объекты кажутся более семантически правильными, более организованными.