2017-01-22 2 views
2

Помещение:Являются ли инкапсулирующие классы рефлексивными Swift 3 парадигмами?

  • В идеале, манера, в которой один программа на языке должна стараться соответствовать парадигмам, к которому язык приписывая.
  • В Swift эти парадигмы - это, в первую очередь, ориентированное на протокол программирование и вторичное функциональное программирование.
  • В целях совместимости и совместимости Swift также поддерживает объектно-ориентированное программирование.
  • Типы ссылок (классы) являются идиоматическими для ООП, тогда как типы значений (структуры, перечисления, примитивы) в сочетании с протоколами являются идиоматическими для POP.

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

Запрос: Какова же роль класса, содержащего типы значений? Связаны ли эти инкапсулирующие классы с парадигмами Swift, или же они сдерживают ООП?

Базовый вариант: Является ли следующая хорошая или плохая практика в Swift:

struct Attribute { 
    let name: String 
    var value: Int 
} 

final class AttributeManager { 
    var attributes: [Attribute] = [] 
    func add(attribute: Attribute) { self.attributes.append(attribute) } 
} 

ответ

1

Некоторые из помещений вы заявляете находятся на ложном пути.

Swift - это язык с несколькими парадигмами общего назначения. Он не имеет ООП только из-за совместимости и интероперабельности. Многопарадигменные языки позволяют разработчикам выбирать наиболее подходящую парадигму кодирования для конкретной работы.

Кроме того, некоторые понятия строго не связаны с одиночными парадигмами. Типы значений не просто функциональны, они образуют базовый тип типов в структурных языках. Также много языков ООП, которые не являются функциональными типами поддержки, за пределами базовых примитивных.

Что называется, ориентированное на протокол программирование - это еще одна форма и расширение интерфейса на основе программирования - одна из основных концепций в объектно-ориентированном программировании.

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

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

В вашем примере кода основное отличие между AttributeManager, определяемым как класс, противоположный структуре, - это обмен изменениями в поле attributes. Если вы имеете дело с экземпляром класса, вы можете передать его как параметр, и вы можете создавать и сохранять изменения, внесенные в поле attributes через код. Выполнение этого с переменной типа значения является более сложным, и для этого потребуется либо использование параметра in-out, либо возврат измененной структуры через возвращаемое значение функции. Классы обеспечивают большую гибкость. Кроме того, использование структур противоречит шаблону Singleton, где вам нужно иметь один и только один экземпляр, который может мутировать его состояние.

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

Далее читаем: Swift Is Not Functional

+0

Это может быть просто, что я только действительно знакомы с ООП, но от того, что я могу сказать, не существует на самом деле функционал/общий способ сделать то, что я хочу: Есть список пар Int String, которые могут быть добавлены и удалены из него, и могут сохранять эти значения в UserDefaults, а затем извлекать их. –

+0

Я понимаю ваши замечания о том, что Swift в первую очередь является OOP, но затем возникает вопрос: каковы различия в шаблонах дизайна, которые, как говорят, Swift? –

+0

Во-первых, если вы знаете один способ решения проблемы, это хорошо. Вы решили проблему. Это не значит, что вам нужно остановиться в этот момент, но вы также можете. Когда вы знаете два или более способов решения проблемы, вы должны увидеть, какой из них лучше подходит и имеет наименьшие лазейки. Ваш код в порядке. –