denisskin / todoapp

Ya To Do Flutter Application
0 stars 0 forks source link

Homework 2 review #3

Open wupididu opened 1 year ago

wupididu commented 1 year ago

Чистота кода:

Readme: 0.5/1 - нет описания и скриншотов flutter_lints: 1 форматирование кода: 1 Код разбит на фичи и слои: 1/2 - Код разбит на слои, но есть проблемы с тем, что поход в сеть лежит и вызывается в БД. Лучше такие вещи разделять


Стейт менеджмент

стейт-менеджмент: 2.5/5 - используется стейт фул виджет. Минус в том, что стейт берется прям из БД, то есть виджет завязан на дата слое. Лучше создавать отдельно стейт(хотя бы задать переменные) в виджете, который изменять в зависимости от дата слоя косистентность: 3


Получение и хранение данных

релизована работа с бэком: 3 слой для бэка: 1/2 - Слой выделен в отдельный слой. Но сам класс похода в бэк предоставляет на прямую досуп в слой БД. И выходит, что слой бэка совсем не отделен от бд. Минусы такого подхода в том, что нельзя будет далать нормальные запросы напрямую в бэк не через БД. реализована работа с бд: 3 слой для бд: 0 - БД на самом деле не выделен в отдельный слой. Мы на прямую обращаемся в БД из слоя презентации (виджетов)

Можно было бы выделить слой БД Выделить слой для похода в бэк

Создать домэйн слой, который бы вызывал нужные методы у двух этих слоев

А сам виджет вызывал бы методы у домэйн слоя. Тогда виджет не был бы напрямую завязан на дата слое(это бд и бэк)

А также можно почитать про MVC или про MVVM такие паттерны помогут разобраться с разбиением на слои


Разное

работа с асинхроннкой: 1 интернационализация: 0 - ее нет


Результат: 17

wupididu commented 1 year ago

Не очень понятно для чего это используется https://github.com/denisskin/todoapp/blob/f52d503a35a8be1da1eaecee0bd4d26b5085ebd6/lib/db.dart#L9-L11

Если хотелось сделать синглтон, то можно было сделать TaskDB абстрактным, создать приватную имплементацию и создать ее инстанс Например так

abstract class TaskDB {
  // lazy инициализация
  static TaskDB? _instance;
  static TaskDB get instance => _instance ??= TaskDBImpl();

   // Здесь методы, которые должны быть доступны снаружи
}

class _TaskDBImpl implements TaskDB {
  // Заимлементить все методы
}

Так выходит, что снаружи никто не сможет случайно вызвать конструктор твоего класса не ожиданно, но при этом он имеет доступ к методам, которые ты ему позволил

wupididu commented 1 year ago

https://github.com/denisskin/todoapp/blob/f52d503a35a8be1da1eaecee0bd4d26b5085ebd6/lib/db.dart#L20-L31

Лучше поход в сеть и БД в конструкторе не вызывать, а создать для класса методы жизненного цикла init() dispose() которые сам определишь когда нужно вызывать. Например при старте и стопе приложения.

wupididu commented 1 year ago

https://github.com/denisskin/todoapp/blob/f52d503a35a8be1da1eaecee0bd4d26b5085ebd6/lib/homepage.dart#L13-L21

Для стейт менеджмента можно было завести себе в виджете переменные (список тасков, возможно еще что-то)

А подписавшись на изменение БД забирать оттуда, то что нужно(список тасков мб) и задавать их в стейте и обновлять setState