e-d-w-i-n / recipeapp Goto Github PK
View Code? Open in Web Editor NEWSimple recipe app for my internship
Simple recipe app for my internship
Change recipe details UI to match design from Figma
Достаточно большие функции onViewCreated
в классах фрагментов. Эта функция, по сути, является точкой входа исполнения твоей логики во фрагменте, поэтому желательно делать эти функции максимально короткими и разбивать на функции поменьше.
Встречаются куски с достаточно большой воложенность. Если вложенность становится больше 3, то стоит задуматься над переносом внутренней логики в отдельную функцию
collect'ы лучше обрабатывать в классах ViewModel'ей, так как бОльшая часть логики должна находится именно там. Классы View должны отвечать в основном только за отображение данных.
Попадаются "магические константы". Их лучше выносить в отдельные переменные если они повторяются несколько раз, так как если придется их поменять, то придется искать по всему проекту и менять их. Это касается как числовых, так и каких-либо других констант
Есть повторяющиеся куски кода, к примеру загрузка изображения через Glide. Лучше такие куски кода выносить в отдельную утилиту или экстеншн и потом переиспользовать во всем проекте
Транзакции в бд лучше делать в самом Dao
классе. Так и логика добавления будет в одном месте и можно будет сразу передавать только нужный Dao
в класс репозитория, а не весь RecipeDatabase
Не очень ясна необходимость в PreferencesManager'е. Первое на что хотелось бы обратить внимание, это то, что для хранения сортировки вполне достаточно хранить и обновлять в нужной вью модели. Второе, если всё же и использовать preferences, то сами они больше относятся к логике data, поэтому желательно и хранить их в соответсвующей директории. Тоже касается и networkBoundResource
. Он используется для работы с data сущностями, получением запросов с сервера и обращению к бд, поэтому его нахождение вне data немного выбивается.
Лишняя вложенность в xml файле с деталями фрагмента. Можно было оставить либо только LinearLayout
, либо ConstraintLayout
у ScrollView
чайлда
Лучше давать названия классам исходя из того, для чего они нужны. К примеру название Pager2ViewHolder
не дает информации для чего конкретно нужен данный класс. Лучше переименовать примерно как ImagesViewHloder
или PictureViewHolder
. Тоже касается и его вьюхолдера
Чтобы избежать лишней вложенности в функциях, в которых почти постоянно используется один элемент, можно писать конструкцию fun sth() = with(useditem) {...}
. Важно заметить, что при такой записи будет возвращаться результат последней строчки этой функции
Лучше не использовать Deprecated функции, студия сама подскажет как лучше сделать, достаточно навестись на deprecated метод и там будет подсказка что лучше всего использовать.
Current error screen is kinda ugly, this app needs a new one.
Images in ViewPager blinking before loading
Rework retrofit stuff to parse "Recommended recipes" properly
В проекте перемешалось объявление функций и переменных. Удобнее всего, когда идет блок объявления переменных, а потом функций, не перемешивая их объявление
Повторяется написание функции Toast
. Как можно заметить, в основном там меняется только отображаемая строка. Поэтому вызов Toast
можно вынести в отдельную extention функцию к фрагменту, где на вход будет только нужная строка или ресурс.
RecipePictureFragment
В некоторых моментах нарушен котлиновский кодстайл:
ContextCompat.checkSelfPermission(
requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED -> {
saveImage()
}
По котлиновскому кодстайлу будет
ContextCompat.checkSelfPermission(
requireContext(),
Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED -> {
saveImage()
}
Двойные табуляции там, где их не должно быть. Пример LoadImage.kt
:
Glide.with(context)
.load(imageUrl)
.placeholder(ColorDrawable(Color.WHITE))
.into(this)
val updateDate: String = SimpleDateFormat("dd.MM.yyyy", Locale.getDefault())
.format(Date(lastUpdated * 1000))
Converters
название функций fromString()
и toString()
по сути неправильны тут. Так как в этом классе есть еще и другие конвертеры, кроме как для List<String>
, то название функций не дает информации для какого типа данных они предназначены. Назвать функции в таком случае стоит fromStringList
и toStringList
SaveImage.kt
Указание аннотации @Suppress("DEPRECATION")
избавляет от варнинга студии, что используется deprecated код, но это не избавляет от того факта, что такой код всё еще используется и его использования нужно избегать)
Refactor and simplify it
Right now this buttons only responsive in the text area.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.