Sobes.tech
Middle+
143
questionbank

Что ты считаешь плохим в коде и что бы ты хотел сразу заменить?

Answer from AI

sobes.tech AI

  • Глобальные переменные (val, var на уровне объекта, к которым много прямого доступа).
  • Использование lateinit var без особой нужды (предпочтительнее nullable val или инициализация).
  • Длинные, сложные функции (более 10-15 строк бизнес-логики).
  • Отсутствие или недостаточность тестов (юнит-тесты, инструментальные).
  • Дублирование кода (copy-paste).
  • Жесткая связанность компонентов (Class A напрямую создает/использует Class B вместо использования DI или интерфейсов).
  • Недостаточные комментарии для неочевидных частей кода.
  • Отсутствие обработки ошибок или использование пустых catch блоков.
  • Зависимость от конкретных реализаций вместо абстракций (например, прямое использование Context в ViewModel).
  • Неоптимальное использование коллекций (например, frequent list manipulations instead of sets/maps).
  • Игнорирование рекомендаций линтера (Checkstyle, Detekt).

Я бы сразу заменил:

  • Использование findViewById на View Binding или Data Binding.
  • Прямое использование AsyncTask на Coroutines, RxJava или WorkManager.
  • Ручное управление жизненным циклом (например, добавление/удаление слушателей в onResume/onPause) на Ktx-extensions или Lifecycle-aware компоненты.
  • Использование старых подходов к навигации на Navigation Component.
  • Использование Bundle для передачи сложных объектов между активностями/фрагментами на Safe Args, Parcelize или сериализацию.
// Пример плохого кода: Глобальная переменная
class BadExampleActivity : AppCompatActivity() {
    var globalCounter = 0 // Плохо, сложно отследить изменения

    // ...
}

// Пример лучшего подхода: Переменная локального scope
class GoodExampleActivity : AppCompatActivity() {
    private var localCounter = 0 // Видима только здесь

    fun incrementCounter() {
        localCounter++
    }
    // ...
}
// Пример плохого кода: lateinit var без особой нужды
class AnotherBadExample {
    lateinit var data: String // Может выбросить UninitializedPropertyAccessException
}

// Пример лучшего подхода: Nullable val или инициализация
class AnotherGoodExample {
    val data: String? = null // Безопасно
    // Или:
    val initializedData: String = "Initial Value"
}
// Пример плохого кода: findViewById
class FindViewByIdActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val textView = findViewById<TextView>(R.id.myTextView) // Бойлерплейт, nullability проблемы
        textView.text = "Hello"
    }
}
// Пример лучшего подхода: View Binding
class ViewBindingActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.myTextView.text = "Hello" // Безопасно, типобезопасно
    }
}