Skip to content

Instantly share code, notes, and snippets.

@simonpang
Last active November 10, 2017 09:39
Show Gist options
  • Save simonpang/cd5432fd8ec03d4cc3613108bdbc6d88 to your computer and use it in GitHub Desktop.
Save simonpang/cd5432fd8ec03d4cc3613108bdbc6d88 to your computer and use it in GitHub Desktop.
MVMUM Architecture (i.e. View ViewModel UseCase Model)
MVMUM Architecture (View ViewModel UseCase Model)
V > VM > UC > M ( i.e. direction of dependency)
<= direct of flow control
=> increasing relevant to domain (i.e. plain object)
<= increasing relevant to framework/environment (i.e. platform objects with side effect e.g. native GUI, database)
Example: (user login screen)
// View. UI event handling, layout.
class LoginView {
var viewModel: LoginViewModel
var loginButton = UIButton()
func viewDidLoad() {
viewModel = ViewModelFactory.newLoginViewModel(context)
}
}
// View model. Display formatting and navigation logics here.
enum Route {
case presentSuccessLogined
case forgetPasswordFlow
}
class LoginViewModel {
var useCase: LoginUseCase
var prefilledName
var localizedErrorMessage
var onLoadingIndicatorVisible: (Bool) -> Void
var onSubmitButtonEnabled: (Bool) -> Void
var onPromptError: () -> Void
var onNavigateTo: (Route) -> Void
init(context) {
useCase = UseCaseFactory.newLoginUseCase(context)
}
}
// Platform independent UseCase. All business logics here.
class LoginUseCase {
var session: SessionModel
var username
var password
func login()
func setUsername()
func setPassword()
var onLoading: (Bool) -> Void
var onError: (String) -> Void
var onSuccess: (SessionModel) -> Void
}
// Plain object Model. Entity only.
class SessionModel {
var userId
var sessionToken
var expiryTime
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment