Middle+
143
questionbank
Что ты считаешь плохим в коде и что бы ты хотел сразу заменить?
Answer from AI
sobes.tech AI
- Глобальные переменные (
val,varна уровне объекта, к которым много прямого доступа). - Использование
lateinit varбез особой нужды (предпочтительнее nullablevalили инициализация). - Длинные, сложные функции (более 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" // Безопасно, типобезопасно
}
}