Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Building for perfection

516 views

Published on

This are the slides for the talk that I made at Codemotion 2015.
Swift had provided developers with new features of the most modern languages combined with a simple and elegant syntax. In this presentation I explore what an advanced architecture is and its benefits, how design patterns help us in an advanced architecture, and how to implement those patterns in Swift, taking advantage of Swift 2.x new features.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Building for perfection

  1. 1. Building for Perfection Jorge D. Ortiz FuentesMADRID · NOV 27-28 · 2015
  2. 2. Building for Perfection Jorge D. Ortiz Fuentes @jdortiz #Swift4AA
  3. 3. A Canonical Examples production #Swift4AA
  4. 4. #Swift4AA Agenda What is an advanced architecture? Paradigms Principles Design Patterns Conclusions
  5. 5. Advanced Architecture
  6. 6. #Swift4AA Advanced Architecture High level structures • Effectiveness • Efficiency • Robustness • Beauty and elegance
  7. 7. #Swift4AA Architectural Benefits Reduce complexity Maximize re-use Reduce repetition Basis for easier growth Better testability Readability and easier collaboration
  8. 8. – Salvador Dalí “Have no fear of perfection, you’ll never reach it”
  9. 9. Not just one
  10. 10. But there are wrong ones Most likely yours 😜
  11. 11. Wrong one
  12. 12. Paradigms
  13. 13. #Swift4AA Programming Paradigms ObjectOriented Imperative PrgmDeclarative Prgm Control Flow Data Flow
  14. 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. 15. Principles
  16. 16. #Swift4AA Principles Single responsibility Open/Closed Liskov Interface Segregation Dependency Inversion
  17. 17. Design Patterns
  18. 18. #Swift4AA Syntactic Fructose guard defer repeat …
  19. 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. 20. #Swift4AA Swift abstractions: protocols Swift doesn’t have abstract classes Usage of the protocol extensions Don’t “translate” design patterns to Swift
  21. 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. 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. 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. 24. #Swift4AA Protocol Extensions Adds to class API vs subsystem (composition) Reuse DRY
  25. 25. #Swift4AA Error Handling Elegant implementation Extended to current Cocoa for free Errors subclass ErrorType
  26. 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. 27. #Swift4AA Generics Aimed at DRY Much better that id (Obj-C) or AnyObject/ Any And use where for further restrictions
  28. 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. 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. 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. 31. #Swift4AA Still Pending Introspection • Very limited • Useful for: Dependency Injection, KVC/KVO Dynamic Dispatching Community Supported features: • Promises • Reactive Extensions
  32. 32. Conclusions
  33. 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. 34. Thank you!
  35. 35. @jdortiz #Swift4AA
  36. 36. MADRID · NOV 27-28 · 2015

×