Skip to content

Instantly share code, notes, and snippets.

@Viveron
Last active May 22, 2019 19:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Viveron/e3e3c02990d089459382911f90955c2d to your computer and use it in GitHub Desktop.
Save Viveron/e3e3c02990d089459382911f90955c2d to your computer and use it in GitHub Desktop.
Class design agreement
```swift
import UIKit
/*
Проектируемый класс условно делится на области:
1. Свойства
2. Иницализаторы
3. Методы
Правила для всех областей:
1. Тип доступа свойства
увеличивается (сверху вниз) по мере вхождения в область.
2. Тип доступа свойства/инициализатора/метода
уменьшается (сверху вниз) по мере вхождения в область.
Наличие разметки (MARK:) опционально, но при использовании
предпочтителен следующий формат:
MARK: - <тип_доступа> <область>
, где:
<тип_доступа> := [Public|Internal|Private]
<область> := [properties|initializers|methods]
Тип доступупа Internal используется (вводится в обращение) только в случае
разработки свифтового модуля, отдельного от основного таргета приложения
(Cocoa Touch Static Library или Framework и т.д.). К примеру LeadKit.
Обязательно инспользование разметки только в случае выделения
группы свойств/инициализаторов/метородов реализуемого протокола
следующего формата:
MARK: - <имя_протокола> <область>
, где:
<имя_протокола> - полное не измененное имя протокола
<область> := [properties|initializers|methods]
Пример (#1):
class SomeView: UIView {
// Область свойств
private static
private
public static
public read only
public read write
public lazy read only
public lazy read write
implemented protocols properties read only
implemented protocols properties read write
override read only
override read write
// Область иницализаторов
convenience init
public init
override init
falling int?
required falling int?
implemented protocols initializers
private init
// Область методов
static
public
override
implemented protocols methods
private
}
Общая рекомендация к способу реализации протокола (в теле класса или расширении)
является слудующей; только если присутствует необходимость выполнения переопредления
реализуемого метода родительского класса дочерним - следует реализовать метод в теле класса,
во всех остальных случаях - выносить в расширение.
Расширения класса с реализацией протоколов находятся за определенем класса
и обязательно помечатся меткой (MARK:), как указано в swift gide style компании.
Так же допускается выносить в приватные расширения ТОЛЬКО приватные методы проектируемого класса.
Если тип класс/структура/enum предосталяют внутренний тип, то объявление данного типа
должно находиться перед родительским типом (пример 2).
Все остальные расширения, константы и прочее должно располагаться за реализациями протоколов
класса в расширениях (пример 3).
*/
// Пример (#2):
extension SomeView {
enum SpecificSybtype {
case none
}
}
// Пример (#1 частный пример):
class SomeView: UIView {
private let somePrivateImmutable = 0
private var somePrivateMutable = 0
private(set) var somePublicMutableReadOnly = 0
static let someStaticImmutable = 0
let somePublicImmutable = 0
var somePublicMutable = 0
override var hashValue: Int {
return 0
}
convenience init(some: Int) {
self.init(other: some)
}
init(other: Int) {
super.init(frame: .zero)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
@available(*, unavailable)
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func publicMethod() {
}
override func layoutSubviews() {
super.layoutSubviews()
}
// MARK: - Private methods
private func privateMethod() {
}
}
// MARK: - SomeProtocol
extension SomeView: SomeProtocol {
}
// Пример (#3):
// MARK: - [Helpers|Snippets]
private extension SomeView {
}
// MARK: - Helpers
private extension Array where ... {
}
// MARK: - Constants
private enum Constants {
}
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment