Git Product home page Git Product logo

gitget's People

Contributors

zhestovskyys avatar

Watchers

 avatar  avatar

gitget's Issues

Код ревью

Замечания по коду

Рум подключен, но я не заметил, чтобы он где-то использовался.

GitGet/app/build.gradle

Lines 72 to 74 in 9abcfa2

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"

В дата-классах лучше не использовать изменяемые переменные, т.к. это нарушает принцип single responsibility. Если в дата-классе нужно изменить поле, лучше использовать метод copy.

var repoName: String,
var repoUrl: String,
var repoOwner: String,
var lastCommitDate: String

Биндинг занулять не обязательно, его GC соберет автоматически. А вот адаптеры, декораторы и прочие лисенеры у ресайклер вью (и не только) нужно снимать, потому что из-за них течёт память.

override fun onDestroyView() {
_binding = null
super.onDestroyView()
}

Зачем тут кастомная фабрика, если у вью модели используется конструктор по умолчанию? Кастомная фабрика обычно используется, чтобы передать что-то вью модели в конструктор.

private val viewModel: RepoSearchViewModel by activityViewModels {
RepoSearchViewModelFactory()
}

Излишне. Backing property используется для инкапсуляции данных внутри класса. Например:

        class SomeViewModel: ViewModel() {
            private val _viewState = MutableLiveData<ViewState>()
            val viewState: LiveData<ViewState> = _viewState
        }

Это делается для того, чтобы нельзя было менять viewState вне вью модели, т.е. вьюха может только подписаться на изменение viewState и как-то реагировать на изменение, а саму логику формирует именно вью модель.

private var _binding: ItemListFragmentBinding? = null
private val binding get() = _binding!!

!! (force unwrap) - зло! Не используй его пожалуйста! :)

Можно было обойтись без этого метода, подключив либу-делегат вью биндинга. Но это больше вкусовщина.

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val fragmentBinding = ItemListFragmentBinding.inflate(inflater, container, false)
_binding = fragmentBinding
return fragmentBinding.root
}

Излишние комментарии, не несущие никакой смысловой нагрузки.

binding.recyclerView.addItemDecoration()*/
// Attach an observer on the allItems list to update the UI automatically when the data
// changes.

Не вижу смысла использовать let, лишняя вложенность кода.

items.let {
adapter.submitList(it)
}

Лишние пустые строки. Если будет большой проект, где используется сторонний анализатор кода, например SonarQube, то он такое не пропустит.

Зачем эти переменные публичные?

val logging : HttpLoggingInterceptor = HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
val httpClient : OkHttpClient.Builder = OkHttpClient.Builder()
.addInterceptor(logging)

Постфикc Impl тут явно лишний, потому что обычно он используется в том случае, когда репозиторий реализует интерфейс.

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

Непонятная константа, еще и публичная. Константы вне класса можно объявлять только приватные. Публичные константы объявляются внутри класса в блоке companion object. Это связано с тем, что во время билда происходит излишняя генерация геттеров и сеттеров для констант, а это влияет на время сборки. На маленьких проектах это не совсем заметно, но на больших проектах каждая секунда сборки - на вес золота.

Почему здесь не использовал backing property?

get() не обязательно использовать в backing property.

val allRepoItem: LiveData<List<RepoItem>> get() = _allRepoItem

Комментарии обычно используются для того, чтобы объяснить не совсем очевидное решение. Например, у тебя огромный проект, где намешана куча всего: java, kotlin, mvp, mvvm, syntetic, viewBinding и т.п., и тебе пришёл баг в очень старом коде, который непонятно как и кем написан, у тебя нет времени переписывать весь класс или даже весь экран, ты придумал какое-то быстрое, но далеко не идеальное решение. Соответственно, ты должен оставить комментарий, почему ты сделал именно так, чтобы на ревью не было вопросов, и была какая-то информативность для следующих разработчиков, или даже для самого себя, потому что скорее всего через месяц ты забудешь, почему ты это сделал. Вот так работают комментарии. Очевидные вещи комментировать не нужно.

/**
* Retrieve [SimpleRepositoryInfo] from query to the web-server
*/
private suspend fun getRepoSimpleInfo(searchText: String): List<SimpleRepositoryInfo> =

Зачем в функции itemId? он не используется.

private suspend fun getDetails(info: SimpleRepositoryInfo, itemId: Int) {

Пустой комментарий.

/**
*
*/
private fun fillAllRepoItem() {

Зачем тут 2 лайаута? Лишняя вложенность.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="16dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"

Слишком длинная строка. Сторонние анализаторы кода ругаются на это.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

Нельзя использовать match_parent внутри ConstraintLayout.

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"

Общие замечания

  • Излишнее использование Parcelable. Сериализацию лучше использовать по месту требования, не нужно использовать её просто так.
  • Почему не использовал Dagger? Если возникли трудности, нужно разбираться, задавать вопросы.
  • Есть несколько замечаний по неймингу ресурсов проекта, id вьюх, каталогов. Скоро доделаем документацию по неймингу, нужно будет её придерживаться.
  • Репозитории сделаны как singleton, так делать нельзя.

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.