Last active
May 22, 2019 19:10
-
-
Save Viveron/e3e3c02990d089459382911f90955c2d to your computer and use it in GitHub Desktop.
Class design agreement
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
```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