Giter Site home page Giter Site logo

todoapp's People

Contributors

denisskin avatar

Watchers

 avatar

todoapp's Issues

Homework 2

Дай пожалуйста ссылку на apk

Homework 2 review

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

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


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

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


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

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

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

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

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

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


Разное

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


Результат: 17

Stage 4 homework review

Привет! Сделано всё очень аккуратно и строго, выглядит тоже классно :)

Пункты.

Все совсем неплохо, только не сделана большая часть с Firebase и CI, из-за этого пришлось снять много баллов, к сожалению.
Твой проект у меня не собрался, так что оценивал по апк + смотрел код, конечно.
Если считаешь, что я где-то неправильно оценил, либо уверен, что ошибка только у меня - можешь писать мне в телеграм! @Kondraschov
Сумма баллов: 10

Чистота кода и общая структура проекта (max 5 баллов):

  1. Не выполнено - 0 баллов. С ридми не очень, потому что оно у тебя почти пустое, ты его не обновляешь и непонятно, валидный/актуальный ли апк, скриншотов нет, получается, что критерий совсем не выполнен.
  2. Выполнено, 1 балл
  3. Выполнено, 1 балл
  4. Выполнено, 2 балла
    Итог по пункту: 4/5 баллов

Навигация, UI, animations (max 8 баллов)

  1. Выполнено, 1 балл
  2. Не выполнено, 0 баллов
  3. Выполнено, 1 балл Когда ночная тема включена на устройстве - все равно ничего не меняется, но я вижу, что она у тебя есть в коде, так что ставлю полный балл! Но надо было синхронизировать с устройством, всё-таки, а не пытаться её тянуть с remote config'а, например
  4. Не выполнено, 0 баллов
  5. Выполнено частично, *1 балл. Судя по всему, ты вообще ничего не добавлял к этому этапу, чтобы ориентация и поддержка больших экранов работала как-то работала, но в наших тудушках все и по умолчанию выглядит нормально. У тебя ничего не съезжает и тд, так что половина баллов
  6. Выполнено частично, *1 балл. Тоже самое, что и выше
    Итог по пункту: 4/8 баллов

Firebase (max 3 баллов)

  1. Выполнено частично, 1/2 баллов. Remote config подключен, но вроде как он вообще никак не относится к цвету важности, а ты что-то делаешь с темной темой, хотя непонятно зачем, ведь в критерии сказано вообще другое. Так что тут половина баллов.
  2. Выполнено, 1 балл
    Итог по пункту: 2/3 баллов

Build & Release (max 8 баллов)

  1. Не выполнено, 0 баллов
  2. Не выполнено, 0 баллов. Советую посмотреть, как сделано у других участников ШМР, например, либо просто примеры на ютубе, CI на гитхабе делается буквально одним простым yaml файликом, так что наверняка быстро разберешься!
  3. Не выполнено, 0 баллов
    Итог по пункту: 0/8 баллов

Разное (max 2 балла)

  1. Не выполнено, ничего нет - 0 баллов
  2. Не выполнено, тоже ничего нет - 0 баллов
    Итог по пункту: 0/2 баллов

hw3_notes

В принципе неплохое приложение получилось, но есть замечания.

Критические замечания.

  1. Репозиторий на GitHub-e (или любом другом Git-репозитории) - лицо приложения. Оно должно содержать в полном объёме:

    • Что приложение может (основные функции);
    • Какие есть у него особенности (фичи именно этого приложения, подчёркивающие его индивидуальность);
    • Очень желательно скриншоты приложения (чем больше, тем заинтересованнее будут другие);
    • Контроль версий приложения, путём хранения их в разделе Releases.

    За оформления пол балла заберу. Не потому что я такой душнила или злюка (;⌣̀_⌣́), так человеческий мозг устроен, который любит картинки, а не текст, а также любит пользоваться тем, у чего есть подробнейшее описание. Стоит сразу практиковаться оформлять свой проект.

  2. Нет чётко-организованного менеджера состояния. Для его реплизации можно было бы воспользоваться разными фреймворками (BloC, ChangeNotifier, ...), но постоянное обновления состояний через setState((){}) - это плохо.

  3. Думаю тут и так понятно, что нет DI, уж слишком всё друг от друга зависит. К тому же, тесты производятся над реальными данными, что плохо.
    Если кратко, то DI - это паттерн, который подразумевает, что если компонент зависит от какой-то внешней сущности (виджет завит от менеджера состояний, который зависит от внешних репозиторий), то в таких случаях просто можно передать ему эту зависимость, через которую он и будет обращаться. Тем самым, компонент перестаёт получать "неконтролируемый доступ" во внешнюю среду (снаружи компонента).
    Если видишь, что компонент (или просто файл) лезет куда-то в наружу (не через библиотеку), то стоит попробовать эту зависимость прокинуть через параметры, если это конечно необходимо (т.е. без фанатизма подходить к данному паттерну).

  4. Не реализован интеграционный тест. Да, присутствуют widget-тесты, но интеграционный следовало сделать отдельно. Он должен запускаться на реальном устройстве, а не на виртуальном, как это происходит в widget-тестов. Здесь подробно описано о том, как это можно сделать.

  5. Используется Navigator 1.0, а не 2.0. Стоит присмотреться к go_router. И соответственно нет реализации deeplink-ов. На самом деле в нём (go_router-e) нет ничего сложного, его очень легко интегрировать заместо navigator 1.0. Есть даже кучу гайдов по переезду между ними. Подробнее про go_router можно почитать здесь. Главное не делай как было в лекции (там ересь) (>m<);

  6. Работа приложения без интернета невозможна. При установке apk (который лежит в дириктории dist), приложение не сохраняет состояния, сбрасывая количество задач к нулю. Если попытаться собрать приложение, то будет выведено следующее:

    ../../../../.pub-cache/hosted/pub.dev/device_info_plus-9.0.2/lib/src/model/android_device_info.dart:6:8: Error: Error when reading '../../../../.pub-cache/hosted/pub.dev/device_info_plus_platform_interface-7.0.0/lib/zmodel/base_device_info.dart': No such file or directory
    import 'package:device_info_plus_platform_interface/zmodel/base_device_info.dart';
           ^
    ../../../../.pub-cache/hosted/pub.dev/device_info_plus-9.0.2/lib/src/model/android_device_info.dart:11:33: Error: Type 'BaseDeviceInfo' not found.
    class AndroidDeviceInfo extends BaseDeviceInfo {
                                    ^^^^^^^^^^^^^^
    ../../../../.pub-cache/hosted/pub.dev/device_info_plus-9.0.2/lib/device_info_plus.dart:100:16: Error: A value of type 'Future<AndroidDeviceInfo>' can't be returned from an async function with return type 'Future<BaseDeviceInfo>'.
     - 'Future' is from 'dart:async'.
     - 'AndroidDeviceInfo' is from 'package:device_info_plus/src/model/android_device_info.dart' ('../../../../.pub-cache/hosted/pub.dev/device_info_plus-9.0.2/lib/src/model/android_device_info.dart').
     - 'BaseDeviceInfo' is from 'package:device_info_plus_plaform_interface/model/base_device_info.dart' ('../../../../.pub-cache/hosted/pub.dev/device_info_plus_platform_interface-7.0.0/lib/model/base_device_info.dart').
            return androidInfo;
                   ^
    ../../../../.pub-cache/hosted/pub.dev/device_info_plus-9.0.2/lib/src/model/android_device_info.dart:40:14: Error: Too many positional arguments: 0 allowed, but 1 found.
    Try removing the extra positional arguments.
            super(data);
                 ^
    Target kernel_snapshot failed: Exception
    
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Script '/home/master/snap/flutter/common/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 1201
    
    * What went wrong:
    Execution failed for task ':app:compileFlutterBuildRelease'.
    > Process 'command '/home/master/snap/flutter/common/flutter/bin/flutter'' finished with non-zero exit value 1
    
    * Try:
    > Run with --stacktrace option to get the stack trace.
    > Run with --info or --debug option to get more log output.
    > Run with --scan to get full insights.
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 13s
    Running Gradle task 'assembleRelease'...                           14.1s
    Gradle task assembleRelease failed with exit code 1
    

    Что примечательно, если откатиться последнего комита до дедлайна (попробовать собрать приложение (homework#3 8131a4e), то там этой проблемы нет, как и тестов. Скорее всего проблема связана с пакетом device_info_plus.
    Поскольку это может быть проблема с моей стороны, то за это душнить не буду, поскольку версия приложения из последнего коммита до дедлайна работает сносно как online, так и offline, хотя есть заметные подтормаживания. Да минусов и так много нашлось уже...

Замечания (не в зачёт, просто на заметку):

  1. Не стоит хранить какие-то секреты (публичные ключи к доступу в БД и т.п.) открыто в публичном репозитории. Стоит почитать на счёт обфускации кода.

  2. Советую присмотреться к одному из менеджеров состояний, поскольку данный вариант не стоит использовать, тем более в продакшене.

    _HomePageState() {
    DB.tasks.onUpdate(() async => setState(() {}));
    }

  3. Стоит поробовать декомпозировать код в home_page.dart и task_page.dart, скинув большую часть кода в подпапку widgets.

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

  5. Множество документации есть, которые реккомендуют (а некоторые даже требуют, freezed к примеру), чтобы классы моделей были неизменяемыми (immutable), а изменения происходили через copyWith. Это действитель во много лучше, особенно это улучшает производительность приложения. Для простоты можешь воспользоваться пакетом кодогенерации freezed.

  6. Не стоит обращаться напрямую к репозиторию из слоя pages. Будет лучше использовать некоторую "прослойку" между ними. Она помогает в дальнейшем рефакторинге кода. Зачастую этой "прослойкой" является менеджер состояний, которому ты просто посылаешь некоторые события, а уже он сам решает как поступать при определённом состоянии.

    openTask(BuildContext context, {String id = ''}) async {
    await Navigator.of(context).pushNamed('/task', arguments: id);
    setState(() {});
    }
    setTaskComplete(Task task, bool f) {
    setState(() {
    task.done = f;
    DB.tasks.update(task);
    });
    }
    removeTask(String id) {
    setState(() {
    DB.tasks.remove(id);
    });
    }

Заключение

Не могу сказать, что приложение плохое. Видно, что некоторые части делались впервые, и по многим критериям приложение проходит, но вот мой совет: попробуй выкрасть время, чтобы рефакторить код под некоторые критерии и паттерны (DI, SOLID, ...).
Не стоит прям переусердствовать, но в дальнейшем это поможет писать такой код, чтобы его было и легко понять, и также легко изменить. Может по времени немного укладываться не будешь, но зато ты всегда будешь уверен в той части кода, которую написал, и всегда будешь готов его дополнить/изменить, причём, что немало важно, без головной боли (сколько я таких проектов написал, что самому не по себе от только воспоминания о них, бррр).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.