Вопрос проверяет навыки организации кода и поддерживаемости экранов со списками.
Вынос в extensions делает код чище и легче читать. Протоколы UITableViewDataSource и UITableViewDelegate занимают много методов и перегружают основной класс. Разделение помогает быстрее находить нужную логику. Также упрощается рефакторинг и перенос кода. Это базовая практика для аккуратной структуры контроллера.
Табличные экраны быстро разрастаются: появляются секции, разные типы ячеек, хедеры, обработка selection, prefetch и т.д. Если держать все это в одном месте, контроллер начинает «тонуть» в деталях.
Перед тем как говорить о плюсах, важно понять проблему: методы таблицы — это отдельный большой блок логики.
Что дает вынос в extension:
Основной класс остается компактным: lifecycle, bindings, actions.
Методы таблицы сгруппированы отдельно.
Быстрее искать нужные части кода через список символов.
Пример структуры:
final class FeedViewController: UIViewController {
// lifecycle, setup, bindings, actions
}
extension FeedViewController: UITableViewDataSource {
// numberOfRows, cellForRow
}
extension FeedViewController: UITableViewDelegate {
// didSelectRow, heightForRow
}
Даже если это все еще один класс, разделение по extensions помогает удерживать границы:
Контроллер отвечает за экран.
Extension отвечает за протоколы таблицы.
Это уменьшает хаос и облегчает постепенный рефакторинг.
Вынос в extension часто становится первым шагом к следующему улучшению:
выделить DataSource в отдельный тип;
внедрить адаптер;
использовать diffable data source.
Когда методы уже собраны вместе, их проще перенести.
В командной разработке extensions помогают:
разным людям менять разные части файла;
уменьшать merge-конфликты;
поддерживать единый стиль.
Если экран сложный, extensions можно сделать более тематическими:
UITableViewDataSourcePrefetching
UIScrollViewDelegate (для пагинации)
обработка UITableViewDiffableDataSource
Вынос dataSource и delegate в extensions — простой прием, который делает контроллер структурнее, облегчает чтение и подготавливает код к дальнейшей декомпозиции (например, к выделению отдельного data source объекта).