Advertisement

Building for perfection

Owner at PoWWaU
Dec. 2, 2015
Advertisement

More Related Content

Advertisement
Advertisement

Building for perfection

  1. Building for Perfection Jorge D. Ortiz FuentesMADRID · NOV 27-28 · 2015
  2. Building for Perfection Jorge D. Ortiz Fuentes @jdortiz #Swift4AA
  3. A Canonical Examples production #Swift4AA
  4. #Swift4AA Agenda What is an advanced architecture? Paradigms Principles Design Patterns Conclusions
  5. Advanced Architecture
  6. #Swift4AA Advanced Architecture High level structures • Effectiveness • Efficiency • Robustness • Beauty and elegance
  7. #Swift4AA Architectural Benefits Reduce complexity Maximize re-use Reduce repetition Basis for easier growth Better testability Readability and easier collaboration
  8. – Salvador Dalí “Have no fear of perfection, you’ll never reach it”
  9. Not just one
  10. But there are wrong ones Most likely yours 😜
  11. Wrong one
  12. Paradigms
  13. #Swift4AA Programming Paradigms ObjectOriented Imperative PrgmDeclarative Prgm Control Flow Data Flow
  14. #Swift4AA Is Swift a Functional Language? Purity or pragmatism? Swift allows to express solutions declaratively Many standard functions to help and even more from some libraries
  15. Principles
  16. #Swift4AA Principles Single responsibility Open/Closed Liskov Interface Segregation Dependency Inversion
  17. Design Patterns
  18. #Swift4AA Syntactic Fructose guard defer repeat …
  19. Guard func presentCell(cell: SpeakerCellProtocol, indexPath: NSIndexPath) { let index = indexPath.row guard index < speakers.count else { return } let speaker = speakers[index] cell.displayName(speaker.name) cell.displayTitle(speaker.title) cell.displayDateSubmitted(relativeDateStringFromDate(s peaker.dateSubmitted)) }
  20. #Swift4AA Swift abstractions: protocols Swift doesn’t have abstract classes Usage of the protocol extensions Don’t “translate” design patterns to Swift
  21. protocol Exportable { func export(text: String) } extension Exportable { func export() {} } class MarkdownDocument: Document, Exportable { } Trait class HTMLExporter { func export(text: String) -> String { // Generate } } class MarkdownDocument: Document { let exporter = HTMLExporter() }
  22. Poor Template class Exporter { func exportToHTML() -> String { let header = generateHeader() let body = generateContent() let footer = generateFooter() return header + body + footer } final func generateHeader() -> String { //Implementation return "<html>" } func generateContent() -> String { fatalError() return “" } func generateFooter() -> String { //Implementation return “</html>" } }
  23. Swifty Template protocol Exporter { func exportToHTML() -> String func generateHeader() -> String func generateContent() -> String func generateFooter() -> String } extension Exporter { final func exportToHTML() -> String { let header = generateHeader() let body = generateContent() let footer = generateFooter() return header + body + footer } final func generateHeader() -> String { //Implementation return "<html>" } func generateFooter() -> String { //Implementation return "</html>" } }
  24. #Swift4AA Protocol Extensions Adds to class API vs subsystem (composition) Reuse DRY
  25. #Swift4AA Error Handling Elegant implementation Extended to current Cocoa for free Errors subclass ErrorType
  26. var control = Houston(fuel: 1.0, astronaut: nil, spaceshipOK: true) do { try control.launchSpaceship() } catch Houston.LaunchError.NoFuel { // Add Fuel print("Adding fuel") } catch Houston.LaunchError.NoAstronaut { print("Next in line") } catch Houston.LaunchError.BrokenShip(let problem) { print(problem) } catch let unknowError { // } Ready for Life class Houston { let fuel: Double let astronaut: String let spaceshipOK: Bool init (fuel: Double, astronaut: String?, spaceshipOK: Bool) { self.fuel = fuel self.astronaut = astronaut ?? "" self.spaceshipOK = spaceshipOK } enum LaunchError: ErrorType { case NoFuel, NoAstronaut, BrokenShip(String) } func launchSpaceship() throws { guard fuel >= 1.0 else { throw LaunchError.NoFuel } guard astronaut != "" else { throw LaunchError.NoAstronaut } guard spaceshipOK else { throw LaunchError.BrokenShip("Engine") } print("Launching spaceship") } }
  27. #Swift4AA Generics Aimed at DRY Much better that id (Obj-C) or AnyObject/ Any And use where for further restrictions
  28. Generic Awesome Power func countGreater<T where T:Comparable>(array: [T], value: T) -> Int { var count = 0 for elem in array where elem > value { count++ } return count }
  29. #Swift4AA If you scratch my back… It is also true that some patterns make using Swift easier Prefer non-optionals: Null Object (and combine it with errors)
  30. class Text { func displayContents() { print("Hola") } } class NullText: Text { override func displayContents() { } } func fetchText() -> Text { return NullText() } let text = fetchText() text.displayContents() Null Object class Text { func displayContents() { print("Hola") } } func fetchText() -> Text? { return nil } if let text = fetchText() { text.displayContents() }
  31. #Swift4AA Still Pending Introspection • Very limited • Useful for: Dependency Injection, KVC/KVO Dynamic Dispatching Community Supported features: • Promises • Reactive Extensions
  32. Conclusions
  33. #Swift4AA Conclusions Swift is a very expressive language • Intent It is mature enough to be used with advanced architectures Some additional features would be more than welcome
  34. Thank you!
  35. @jdortiz #Swift4AA
  36. MADRID · NOV 27-28 · 2015
Advertisement