Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bring mvvm architecture + colorscheme usage #5

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

mike56k
Copy link

@mike56k mike56k commented Aug 27, 2022

  • Выделил главный экран в виде отдельного модуля Feed
  • В рамках модуля есть FeedView и FeedViewModel
  • FeedViewModel взяла на себя ответственность за обращение к RazrabsApi
  • В рамках каждого модуля будет создаваться экстеншн на Color, как в данном случае Color+Feed
  • Добавил бэкграунд цвет как на сайте для FeedView зависящий от ColorScheme

Copy link
Collaborator

@fnc12 fnc12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

спасибо за ПР, но есть проблема: у меня локально уже сделана ViewModel. Если я ее запушу ты получишь мерж конфликты. Если ты тоже хочешь участвовать в проекте, то давай лучше это сначала обсудим чтобы как минимум иметь одинаковые взгляды на реализацию. А иначе получается лебедь, рак и щука

@@ -0,0 +1,56 @@
import SwiftUI

struct FeedView<VM: FeedViewModel>: View {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

зачем модель выделять как аргумент дженерика?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это способ, с помощью которого можно закрыть вьюмодель протоколом и использовать во View.
реализацию вьюмодели можно подменять, полезно для тестов

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@Published var feedItems = [FeedItem]()
private let razrabsApi: RazrabsApi

init(razrabsApi: RazrabsApi) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

зачем делать активную модель? RazrabsApi это сервис. Модель, которая стучится в сервис выглядит как очень странный архитектурный подход. Логичнее оставить взаимодействие с сервисами у страницы, которая по сути является тем, чем раньше был контроллер, а модель оставить пассивную

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в моем понимании mvvm подразумевает как раз активную viewmodel, отвечающую за бизнес логику и взаимодействие с сервисами.
есть пассивные model, просто структуры данных.
view нужна для отображения данных полученных из viewmodel, в ней желательно чтобы была только верстка

Copy link
Collaborator

@fnc12 fnc12 Aug 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

понятно. Я активный несторонник активной модели просто потому что кода получается больше, а выглядит он крайне нетипично. По факту мы события из view пересылаем в модель, хотя можем сами на месте разрулить эту логику. MVVM не ограничивается только вариантом с активной моделью. Это корпоративные варианты реализации данной архитектуры иногда так делают видимо в порыве сделать что-то похожее на ту архитектуру, которую Apple показывает в примерах (а у них модель активная). Как по мне активная модель это такая архитектура джуна просто потому что в самых разных языках и фрэймворках чаще всего модель не активная. Я лично не вижу смысла следовать идеям Apple в плане архитектуры потому что в архитектуру они точно не умеют. Потому мой вариант очень похож на классический MVC только большая часть кода контроллера упакована в биндинги благодаря SwiftUI, а класс MainView, например, имеет отображение в свойстве body и логику в событиях как это раньше делал контроллер

}

case .failure(let error):
print("error = \(error)")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

как репортить в отображение факт того, что случилась ошибка?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

создать во ViewModel published свойство isErrorOccured и обычное свойство errorDescription. при возникновении ошибки записывать в errorDescription текст ошибки и ставить isErrorOccured = true. во view сделать условие
if viewModel.isErrorOccured {
Text(viewModel.errorDescription)
}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

понятно. Да, можно так, но если эту же логику реализовать во view, то кода тупо будет меньше

enum Feed {

static func background(colorScheme: ColorScheme) -> Color {
return colorScheme == .dark ? Color(r: 31, g: 32, b: 37) : Color(r: 247, g: 248, b: 252)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

почему не ассеты?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants