Jak modelovat view state - sum/product type

Ondřej

Jak modelovat view state - sum/product type
« kdy: 28. 06. 2018, 22:03:56 »
Zdravím místní osazenstvo,

snažím se implementovat svůj malý pet project (tzn. trochu toho over-engineeringu) a teď jsem se dostal do situace, kdy přemýšlím, jak se vlastně dřív (nebo i teď) "správně" píše UI kód pro `view`, které má více stavů. Například login komponenta: jsem přihlášený zobrazí se mi email, nebo progress indicator v případě že se přihlašuji a v případě chyby zobrazuji chybu. Tzn. 3 různé stavy, které musím modelovat.

Pokud použiju jazyk, který nemá `sum` type (níže je swift), je další možnost opravdu `if/else` šílenství...?  :-\
 
Pokud byste mi poradili nějaký open source project, kde je nějak pěkně/dobře modelovaná UI vrstva budu rád... :)

Kód: [Vybrat]
enum ViewStateSum {
    case loggedIn(email: String)
    case loading
    case error(reason: String)
}

func set(viewState: ViewStateSum) {
   
    switch viewState {
        case let .loggedIn(email: email):
            break // set view appropriately
        case let .error(reason: reason):
            break // set view appropriately
        case .loading:
            break // set view appropriately
    }
}

struct ViewStateProduct {
    let loggedIn: Bool
    let loading: Bool
    let anyError: Bool
   
    let email: String?
    let error: String?
}

func set(viewState: ViewStateProduct) {
   
    if viewState.loggedIn == true && viewState.loading == false && viewState.anyError == false && viewState.email != nil {
        // set view appropriately
    } else if ...
   
}


uuuuuuuu

Re:Jak modelovat view state - sum/product type
« Odpověď #1 kdy: 28. 06. 2018, 22:09:14 »
Nemuzes funkce/metody nacpat do pole/listu apod. a misto hafo ifu je proste volat z pole pomoci indexu.

JSH

Re:Jak modelovat view state - sum/product type
« Odpověď #2 kdy: 29. 06. 2018, 17:41:48 »
Občas se používá dědičnost. Varianty se odvodí od společného typu a funkce s pattern matchingem se implementují jako Vizitory. Ale moc elegantní to IMO není.

Ondřej

Re:Jak modelovat view state - sum/product type
« Odpověď #3 kdy: 29. 06. 2018, 18:05:23 »
Citace
Občas se používá dědičnost. Varianty se odvodí od společného typu a funkce s pattern matchingem se implementují jako Vizitory.

Zkusím se na to podívat. Díky za inspiraci. Přijde mi, že znovuobjevuji kolo :( Možná je celý koncept `viewState` špatně ačkoli se to dá relativně dobře testovat... :)