У меня есть концептуальный вопрос по протокольно-ориентированному программированию. Допустим, я создаю протокол Foo и хочу расширить Foo с помощью функции action() в расширении протокола. action() всегда будет в основном одним и тем же, независимо от того, кто его реализует, поэтому я не хочу повторять этот код. Единственная часть action(), которая изменяется, — это prop, а prop должен быть свойством экземпляра. Таким образом, моя соответствующая структура должна просто иметь определенную поддержку, и тогда действие будет работать правильно. Этот код в порядке и выглядит так:
protocol Foo {
var prop : String {get set}
}
extension Foo {
func action() -> String {
return prop + ": Applied Action."
}
}
Но вот загвоздка. Допустим, реквизит — это информация, к которой я не хочу, чтобы другие классы имели доступ. Я хочу, чтобы они обращались к нему только через action(). В текущем swift свойство должно быть как минимум внутренним, потому что протокол является внутренним, но мне нужно, чтобы оно было закрытым, чтобы потребляющие классы не могли случайно изменить свойство или прочитать информацию, к которой я хочу, чтобы они имели доступ только через action() . Я мог бы добавить action() в протокол, но тогда мне нужно переписывать action() каждый раз, когда структура соответствует требованиям.
Этот же пример можно расширить и до функции:
protocol Foo {
//customization point by conforming class
func customAction(str: String) -> String
}
extension Foo {
func action() -> String {
//Do some default work
let str = "some string created from previous default work"
return customAction(str: str)
}
}
action() всегда будет одной и той же реализацией, за исключением cusotmAction(). Итак, мне нужны соответствующие классы для реализации customAction(), но я не хочу, чтобы какие-либо внешние классы вызывали customAction(), поскольку он обеспечивает только определенное поведение, которое следует использовать только внутри action(). Поэтому мне нужно, чтобы customAction() был закрытым, но опять же, это невозможно.
Итак, вот мой вопрос, это просто сбой в протокольно-ориентированном программировании? Как я могу использовать протоколы для написания кода такого типа, не предоставляя слишком много возможностей prop/customAction() или не переписывая один и тот же код внутри action() снова и снова? Этот пример довольно прост, но я сталкиваюсь с более сложными версиями той же проблемы. Есть ли другой способ взглянуть на эту проблему с точки зрения POP, или мне следует искать более объектно-ориентированный подход?