Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Uma decisão pode custar caro

Uma decisão pode custar caro

Os exemplos foram extraídos do projeto: https://github.com/ronanrodrigo/Sensazonal

Decisões adiáveis e não tão adiáveis
Você não precisa decidir o banco de dados que vai usar quando tá começando a fazer seu aplicativo. Durante a apresentação será demonstrado os pontos de atenção de decisões mais comuns quando estamos construindo um aplicativo.

Por quê adiar uma decisão
Vantagens de ter adiado uma escolha que podem parecer vantagens semelhantes a utilizar um protocolo. Contudo, até mesmo a construção de um protocolo pode sofrer influência de decisões precipitadas. Você descobrirá como escapar dessa cilada, bino.

Experiências de decisões precipitadas e como adiar decisões
Com exemplos de códigos já construídos, será apresentado como é um código agnóstico de decisão e também como é um código que foi construído pensando em detalhes. Programar e pensar desse jeito, tem diferenças que vão além da semântica.

Ronan Rodrigo Nunes

November 09, 2018
Tweet

More Decks by Ronan Rodrigo Nunes

Other Decks in Programming

Transcript

  1. func testListWhenMonthIsGreaterThanTwelveThenPresentError() { gateway = ListFoodStubGateway() presenter = ListFoodStubPresenter() interactor

    = ListFoodByMonthInteractor(gateway, presenter) interactor.list(byMonth: 13) XCTAssertEqual(presenter.presentedError, .invalidMonth) }
  2. protocol ListFoodGateway { func foods(byMonth month: Int, onComplete: CompletionHandler) }

    class ListFoodNetworkGateway: ListFoodGateway { // ... } class ListFoodJsonFileGateway: ListFoodGateway { // ... } class ListFoodCoreDataGateway: ListFoodGateway { // ... }
  3. protocol FoodGateway { func fetch(byMonth month: Int) func put(id: Int,

    name: String) func insert(name: String) } protocol ListFoodScreen { func updateLabel(name: String) }
  4. class ListFoodByMonthInteractor { private let gateway: ListFoodGateway private let presenter:

    ListFoodPresenter init(gateway: ListFoodGateway, presenter: ListFoodPresenter) { self.gateway = gateway self.presenter = presenter } func list(byMonth month: Int) { guard GregorianMonth.isValid(month: month) else { return presenter.presentError(.invalidMonth) } gateway.foods(byMonth: month) { /**/ } } }
  5. class ListFoodMemoryGateway: ListFoodGateway { func filter(byMonth month: Int, onComplete: CompletionHandler)

    { let foods = DataSource.allFoods.filter { $0.months.contains(month) } onComplete(.success(foods)) } }
  6. struct DataSource { private static let yam = Food(name: "YAM",

    months: [...]) private static let kiwi = Food(name: "KIWI", months: [...]) private static let bay = Food(name: "BAY", months: [...]) private static let pea = Food(name: "PEA", months: [...]) static let allFoods = [yam, kiwi, bay, pea, ...] // ... }
  7. class ListFoodJsonFileGateway: ListFoodGateway { func foods(byMonth month: Int, onComplete: CompletionHandler)

    { // ... queue.async { do { let foodsData = try Data(contentsOf: fileURL, ...) let foods = try JSONDecoder() .decode([FoodCodable].self, from: foodsData) .filter { $0.months.contains(month) } // ... DispatchQueue.main.async { onComplete(.success(foods)) } } catch { //... } } } }
  8. func testListWhenMonthIsGreaterThanTwelveThenPresentError() { gateway = ListFoodStubGateway() presenter = ListFoodStubPresenter() interactor

    = ListFoodByMonthInteractor(gateway, presenter) interactor.list(byMonth: 13) XCTAssertEqual(presenter.presentedError, .invalidMonth) }