Skip to content

Instantly share code, notes, and snippets.

@dimsuz
Created February 10, 2019 19:43
Show Gist options
  • Save dimsuz/e144f8f326e38128267f45afba52dcde to your computer and use it in GitHub Desktop.
Save dimsuz/e144f8f326e38128267f45afba52dcde to your computer and use it in GitHub Desktop.

Именование: Соглашения и рекомендации

Правила именования различных MVI структур

1. Имена intent-функций

Исключайте детали ui-имплементации, используйте "намерения" пользователя в качестве имён

Intent-функции внутри View-интерфейса должны называться исходя из "намерения" пользователя, их имена должны отвечать на вопрос "что именно хочет сделать пользователь?", и не должны в своём имени содержать какие-то детали имплементации внутри View.

Распространённой ошибкой, являются, например, такие имена:

interface View {
  fun continueButtonClickIntent(): Observable<Unit>
  fun snackbarCloseIntent(): Observable<Unit>
}

В первом случае, continueButtonClicked содержит сразу две ошибки: во-первых, упоминание Clicked, являет собой пример того, что "наружу" просочились детали представления — а именно, что есть некий UI-элемент, который можно кликать. Однажды это может измениться, например, этот intent будет порождаться не кнопкой, а неким другим элементом UI, например checkbox-ом или ещё чем-то более экзотическим, или даже набором из нескольких элементов (их события могут быть объединены через Observable.merge()). Во-вторых, ошибочно упоминаяется Button, по аналогичным соображениям - это может не выдержать тест временем.

Во втором случае, практически те же ошибки - "светится" то, что имплементация содержит снэкбар, который умеет закрываться.

Чтобы прийти к правильному решению, нужно представить себя в роли пользователя и задать вопрос, "каково моё намерение, при совершении этих действий с интерфейсом"?

Ответы могут быть такими:

  • Я нажимаю кнопку 'continue', чтобы выполнить логин. Хорошее имя для intent-а здесь тогда: fun loginIntent()
  • Я нажимаю кнопку 'continue', чтобы перейти к следующему шагу. Имя: fun switchToNextStepIntent()
  • Я нажимаю кнопку 'continue', чтобы продолжить - в самом общем смысле. Имя fun continueIntent()
  • Я нажимаю кнопку 'закрыть снэк бар', чтобы спрятать сообщение об ошибке логина: fun hideLoginErrorMessageIntent()

Заметьте, что в примерах выше нигде не фигурируют ни специфические типы ui-элементов, ни специфичные для них события.

Такие имена способствуют тому, что View-interface оказывается достаточно отвязан от деталей его представления в Android UI, и, кроме того, достаточно устойчив к любым косметическим и презентационным изменениям. Менять эти имена потребуется только при изменениях, касающихся какой-то презентационной логики.

Не называйте intent-ы в прошедшем времени

Неправильно:

interface View {
  fun messageClosedIntent(): Observable<Unit>
  fun continueRequestedIntent(): Observable<Unit>
}

Правильно:

interface View {
  fun closeMessageIntent(): Observable<Unit>
  fun continueIntent(): Observable<Unit>
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment