YouTube2Text

Разбор лайвкода в Т-Банк на 450к / Android собеседование — Transcript

by Фабрика Офферов / Артур Илькаев · 2,935 words · 510 segments · language en · Watch on YouTube

Full transcript

  1. 0:00Всем привет я Артур мобильный
  2. 0:01разработчик в этом видео Я разберу
  3. 0:03решение реальной задачи собеседования на
  4. 0:06позицию Android разработчика в т банке
  5. 0:09осенью того года на меня вышел Чар из т
  6. 0:11банка предлагали вилку в районе 400.000
  7. 0:14руб и я решил пройти собеседование после
  8. 0:17первого общения с HR и обсуждения моего
  9. 0:19опыта меня решили прогнать по упрощённой
  10. 0:22системе всего лишь с одним техническим
  11. 0:24собеседованием другие разработчики
  12. 0:26проходят больше технических этапов Я
  13. 0:28хочу показать не только решение но и
  14. 0:31постараюсь раскрыть подход к подобным
  15. 0:33задачам и разберу темы которые в ней
  16. 0:35затрагиваются Лайф кода на
  17. 0:37собеседованиях становится всё больше
  18. 0:40потому что компании хотят понять Можете
  19. 0:42ли вы бегло ориентироваться в коде хотят
  20. 0:45проверить знания конкретных тем умеете
  21. 0:48ли вы выяснять требования объяснять ход
  22. 0:50своих мыслей и непосредственно решать
  23. 0:53поставленные перед вами задачи в этом
  24. 0:55видео разбор только одной из реальных
  25. 0:57задач но у моих учеников есть
  26. 0:59эксклюзивный доступ к разбору более чем
  27. 1:01пти задач из таких компаний как Яндекс
  28. 1:04Авито azon Абан wiber и других крупных
  29. 1:07техов перейдём к задаче которую мне
  30. 1:10давали что мы здесь видим здесь много
  31. 1:13плохо написанного кода для начала
  32. 1:16хотелось бы понять его главную идею что
  33. 1:20здесь вообще происходит Давайте
  34. 1:22попробуем посмотреть на него Ну вот так
  35. 1:24сверху вниз есть какой-то
  36. 1:28object с нй индексом есть г есть класс
  37. 1:35User Data с дишни ком именем и номером
  38. 1:38телефона это всё выглядит как лирика
  39. 1:41которую надо будет исправлять видимо
  40. 1:43Центральный класс здесь и Судя по
  41. 1:46строчкам кода он самый большой это users
  42. 1:49Holder singl Tone давайте взглянем что
  43. 1:51здесь происходит у нас есть Companion
  44. 1:54object с инсо этого класса есть метод
  45. 2:00Get instance который непосредственно
  46. 2:03этот класс возвращает есть какие-то поля
  47. 2:07users execut и метод update который
  48. 2:11принимает айдини пользователя его номер
  49. 2:14телефона его форматирует здесь какая-то
  50. 2:17Лирика и затем делает поиск этого айди
  51. 2:21Ника в массиве если нашёл то заменяет
  52. 2:24значение новым номером телефона Окей то
  53. 2:27есть здесь главный идея этого класса в
  54. 2:31том что у него есть метод update для
  55. 2:33изменения номера телефона и он хранит
  56. 2:36юзеров То есть sone он потому что
  57. 2:40реализует паттерн Гоф sone ЛР потому что
  58. 2:46хранит список пользователей и на
  59. 2:48самом-то деле главное за что он отвечает
  60. 2:51- это изменение номера телефона поэтому
  61. 2:53я бы Ещё назвал его апдейтер Или
  62. 2:57апдейтер давайте это сделаем
  63. 3:01US Up
  64. 3:03Hold где-то плачет Роберт марсон Ну
  65. 3:05кажется что здесь нам придётся
  66. 3:07исправлять всё подряд как будто бы можно
  67. 3:10это делать Прямо сверху вниз так смотрим
  68. 3:12на ко где у нас это используется тут нам
  69. 3:15в помощь Ctrl F Ага в переборе списка
  70. 3:21пользователей проходим по индексам Ну мы
  71. 3:24знаем что у нас вве в кот
  72. 3:27индексация поэтому
  73. 3:30Нам нужно поменять на ноль и как будто
  74. 3:33бы не нужно выносить это в отдельную
  75. 3:36константу и можно написать прямо вот так
  76. 3:38и это убрать дальше Раз уж мы тут начали
  77. 3:42смотреть этот for то у нас здесь выход
  78. 3:44за пределы массива потому что индексация
  79. 3:47у нас от нуля до Сай -1 поэтому можно
  80. 3:51написать Вот таким образом либо есть
  81. 3:54функция until которая за нас делает
  82. 3:58работу и э будет проходиться от нуля до
  83. 4:01Сай -1 либо можно сделать это ещё проще
  84. 4:05и написать for I until users indices
  85. 4:11простите за мой английский дальше у нас
  86. 4:13есть тег где он
  87. 4:16используется а в логе и тогда непонятно
  88. 4:20А зачем этот тег вынесли на Top level
  89. 4:26уровень как будто бы можно это перенести
  90. 4:28в Companion object непосредственно в
  91. 4:32класс и заменить
  92. 4:35на компилятор ную константу const W А
  93. 4:40зачем это нужно const - это компилятор
  94. 4:43ная Константа то есть значение
  95. 4:45вычисляется на этапе компиляции и
  96. 4:50заменяется в месте использования что
  97. 4:52ускоряет выполнение кода в ранта О'Кей
  98. 4:55Давайте пойдём дальше у нас есть класс
  99. 4:59User
  100. 5:00сразу видим что здесь изменяемые
  101. 5:03свойства этого класса Ну кто хоть
  102. 5:06немного работал с котле знает что Бест
  103. 5:08практи сом является использование дата
  104. 5:10классов Ну почему как минимум мы получим
  105. 5:13equals и шкод для использования в
  106. 5:15коллекциях которые базируются на
  107. 5:17вычислении хэш-функции от ключей и
  108. 5:19сравнении объектов дополнительно мы
  109. 5:22получим метод копи для создание нового
  110. 5:24инстанса с изменёнными полями класса и
  111. 5:28вот это ко которая принимает в себя
  112. 5:33старый р ID и номер телефона для
  113. 5:36изменения и затем создаёт новый инстанс
  114. 5:39нам на это намекает А если сделать все
  115. 5:41поля неизменяемыми то класс станет
  116. 5:43иммутабельность
  117. 6:00Давайте же
  118. 6:07[музыка]
  119. 6:09поменяем идём дальше к нашему главному
  120. 6:13классу он Open то есть открыт для
  121. 6:17наследования но внутри этого класса все
  122. 6:21методы и поля Они то есть мы насле этот
  123. 6:26класс ничего не сможем переде
  124. 6:30уме не делать его открытым для
  125. 6:33наследования сделать его смотрим дальше
  126. 6:36у нас конструктор Ну это для того чтобы
  127. 6:39мы создавали экземпляр класса в методе
  128. 6:43тут всё окей смотрим Что передаётся в
  129. 6:47Конструктор передаётся контекст и
  130. 6:50репозиторий про передачу контекста Я
  131. 6:53думаю поговорим отно миним э сде при
  132. 7:00было доступа и соблюсти
  133. 7:06инкапсуляция Давайте перейдём Дальше он
  134. 7:09наследуется от р
  135. 7:12провайдер Видимо для того чтобы получить
  136. 7:16Вот это значение для Гера уместно ли
  137. 7:21наследовать sone
  138. 7:24от Я думаю
  139. 7:28нече вопрос про разницу композиции и
  140. 7:32наследования В общем случае предпочтения
  141. 7:34стоит отдавать композиции а не
  142. 7:36наследованию наследование стоит
  143. 7:38использовать когда у классов есть чёткая
  144. 7:40связь из A при наследовании мы берём всё
  145. 7:43из суперкласса это может привести к тому
  146. 7:45что у нас будет функциональность которая
  147. 7:47нам не нужна А это уже нарушение
  148. 7:49принципа Interface segregation при этом
  149. 7:51при композиции мы зависим только той
  150. 7:53функциональности которую сами вызываем
  151. 7:57также наследование ломает капсуляции
  152. 8:00хороший пример приведён в книгах
  153. 8:01effective Java и effective cin в котором
  154. 8:04был создан Наследник Хеш сеете в котором
  155. 8:07просто был подсчёт количества Всех
  156. 8:09добавляемых элементов За всё время мы
  157. 8:11там
  158. 8:14переопределить на один а в методе Add
  159. 8:17All суммировать на размер добавляемое
  160. 8:19коллекции Казалось бы всё Логично но
  161. 8:22если у этого наследника Хеш Сета вызвать
  162. 8:24метод Add All то результат будет в два
  163. 8:27раза больше ожидаемого потому что под
  164. 8:29капотом шс в методе Add All вызывается
  165. 8:32метод Add этой проблемы можно было бы
  166. 8:34избежать Когда наш новый сет содержит в
  167. 8:37себя Хеш сеет а не является его
  168. 8:39наследником Ну и композиция более гибкая
  169. 8:42потому что наследовать можно один класс
  170. 8:45а содержать в себе можно сколько угодно
  171. 8:47и при наследовании мы берём всё из
  172. 8:49суперкласса и у нас меняется поведение
  173. 8:51всех дочерних классов а при композиции
  174. 8:54Конечно можно за
  175. 8:59из зависимого класса используется и у
  176. 9:01нас конечно же написаны на этот тесты
  177. 9:03при надобности мы вообще можем замакима
  178. 9:06класс поэтому здесь я с большим
  179. 9:09удовольствием не буду наследоваться от
  180. 9:11loger провайдер
  181. 9:13а
  182. 9:15сделаю буду передавать его в
  183. 9:20Конструктор и буду получать лоер из лоер
  184. 9:25провайдер Давайте разбираться что
  185. 9:26происходит вот здесь с методом Get
  186. 9:30instance с получением экземпляра этого
  187. 9:32класса во-первых у нас метод Get
  188. 9:35instance содержится не в comp обк а в
  189. 9:38самом классе и поэтому чтобы его вызвать
  190. 9:41нам придётся как-то создать экземпляр
  191. 9:44этого класса и только потом мы сможем
  192. 9:46вызвать метод Get это не статичный метод
  193. 9:49поэтому его нужно перенести в comp
  194. 9:53object Окей давайте
  195. 9:56форматируем код сразу же
  196. 10:00дальше instance у нас латай Что здесь
  197. 10:04происходит получается в нём мы проверяем
  198. 10:06что если инс пустой точнее лабильный мы
  199. 10:10его создаём и только после этого
  200. 10:13возвращаем на самом деле здесь может
  201. 10:16произойти Race Con Если два потока
  202. 10:19одновременно зайдут в этот метод и
  203. 10:22первый прочитает значение instance оно
  204. 10:25будет нула бельм второй тоже зайдёт в
  205. 10:28этот метод прочитает значение instance
  206. 10:30оно будет нула бельм оба выполнят
  207. 10:32проверку и оба создадут
  208. 10:35экземпляр этого класса и у нас будут
  209. 10:39невалидные данные А мы хотим создать
  210. 10:42экземпляр только строго один раз кстати
  211. 10:45здесь нужно поменять название класса и
  212. 10:48здесь ещё такой момент что в параметр
  213. 10:52метода передаётся л в этом нет никакого
  214. 10:56смысла этот код не
  215. 10:59в параметры метода мы передаём ссылки на
  216. 11:04экземпляры каких-то классов и Вал у нас
  217. 11:06используются только в первичном
  218. 11:09конструкторе чтобы сделать передаваемый
  219. 11:11параметр свойством класса здесь этого
  220. 11:14делать Нет смысла Да по поводу проблемы
  221. 11:17с рейс кондишен как же нам сделать так
  222. 11:19чтобы при использовании этого метода в
  223. 11:22многопоточное среде у нас не создавалось
  224. 11:26несколько экземпляров этого класса ну
  225. 11:29первое что мне приходит в голову можно
  226. 11:31просто пометить этот метод Синай Что
  227. 11:34будет в таком случае здесь у нас будет
  228. 11:36страдать перф потому что мы хотим
  229. 11:38создать экземпляр всего лишь один раз а
  230. 11:41все остальные разы уже читать значение
  231. 11:44Как по мне чтобы сделать этот код более
  232. 11:47эффективным нужно использовать паттерн
  233. 11:50многопоточного программирования под
  234. 11:52названием Double Checking для чего он
  235. 11:54нужен для того чтобы ограничить доступ к
  236. 11:56критической секции доступ этот должен
  237. 11:59быть на запись По какому-то условию и мы
  238. 12:02хотим при выполнении вот этого условия
  239. 12:05делать эту операцию строго один раз а
  240. 12:08все остальные разы когда эта операция
  241. 12:11когда эта проверка не выполняется мы не
  242. 12:13хотим выполнять никаких синхронизации
  243. 12:15что здесь нам нужно сделать нам нужно
  244. 12:17убрать synchronized потому что это
  245. 12:18страдает потому что это affect
  246. 12:20performance что нам нужно сделать после
  247. 12:22проверки что instance равен Ну следите
  248. 12:25за руками я выставляю блок сирона
  249. 12:30здесь ещё раз делаю вот эту
  250. 12:34проверку и уже после этого
  251. 12:38Я заполняю экземпляр инстанса это на
  252. 12:43самом деле реализация паттерна dou
  253. 12:45Checking Что здесь происходит Мы первый
  254. 12:48раз делаем проверку без синхро Найда
  255. 12:51если эта проверка проходит успешно мы
  256. 12:53как раз-таки
  257. 12:55начинаем критический блок и в этом
  258. 12:58критическом блоке мы ещё раз проверяем
  259. 13:00наши условия и делаем нужную нам
  260. 13:03операцию выглядит немножко странно но
  261. 13:06это паттерн Double Check loing как
  262. 13:09раз-таки для того чтобы мы делали запись
  263. 13:12только один раз а все остальные разы
  264. 13:14читали без блока синхро найд на самом
  265. 13:17деле этот паттерн может использоваться
  266. 13:19не только в Гоф синглтон это нужно в
  267. 13:24целом для ограничения доступа к
  268. 13:27критической секции по какому условию для
  269. 13:30предотвращения Рей конди это может быть
  270. 13:32полезно Например у вас есть какой-то
  271. 13:36интерсек для вашего Ок http вы хотите
  272. 13:39обновлять там ваши Access токены если
  273. 13:42они протух и если вы повесить
  274. 13:45synchronized на весь метод intercept у
  275. 13:47вас не будет параллельных запросов у вас
  276. 13:50каждый запрос будет идти последовательно
  277. 13:52что affected performance и вы внутри
  278. 13:54этого интерсек можете проверять что если
  279. 13:56Вам пришёл ответ о том что ваш токен
  280. 13:59протух то только тогда Вы заходите в
  281. 14:03блок сирона делаете проверку Ещё раз
  282. 14:05чтобы только один из запросов обновил
  283. 14:09токен И после этого обновляет токен и
  284. 14:12ваши проверки Вот это эта проверка не
  285. 14:14будет пройдено и вы будете выполнять ваш
  286. 14:17оставшийся код ваш оставшийся запрос
  287. 14:18Окей кажется что мы с дабл чек Кингом
  288. 14:22разобрались Давайте пойдём дальше у нас
  289. 14:24есть поля users и exec Давайте посмотрим
  290. 14:27используется ли где-то
  291. 14:30Вообще нигде не используется поэтому его
  292. 14:32можно удалить что дальше users Здесь мы
  293. 14:36получаем значение из репозитория и при
  294. 14:39этом здесь есть важный момент что на
  295. 14:41самом деле это работает вот так и мы
  296. 14:43Каждый раз при обращении users будем
  297. 14:46получать значение актуальное из
  298. 14:48репозитория и у нас эта переменная
  299. 14:51mutable во-первых этот код не с
  300. 14:53компилируется потому что такой мы можем
  301. 14:58сделать для иммутабельность
  302. 15:02у нас это поле используется для поиска
  303. 15:08нужного нам айдини мы получаем значение
  304. 15:11и затем меняем это значение в листе но
  305. 15:14при этом это значение меняется
  306. 15:18локально и никак не прокиды ется в
  307. 15:22репозитории чтобы записать на диск или
  308. 15:25отправить куда-то запрос в сеть и как
  309. 15:29будто бы здесь допущена ошибка в том
  310. 15:32плане что если мы изменим локально наших
  311. 15:36юзеров то при перезапуске приложения эти
  312. 15:39эти данные потеряются Я предлагаю
  313. 15:42добавить метод в репозиторий метод
  314. 15:45апдейт который будет обновлять по айдини
  315. 15:47номер телефона чтобы
  316. 15:49данные были актуальными при перезапуске
  317. 15:53приложения Давайте добавим сюда
  318. 15:56айдини и добавим сюда новый номер
  319. 15:59телефона что здесь я предлагаю делать мы
  320. 16:03будем получать в методе актуальный
  321. 16:06список юзеров
  322. 16:08[музыка]
  323. 16:14Ага Так здесь я получаю список
  324. 16:17пользователей и когда я нахожу нужного
  325. 16:21пользователя получается
  326. 16:27что и затем нам нужно прокинуть
  327. 16:31обновлённого пользователя в репозиторий
  328. 16:34То бишь здесь у меня
  329. 16:36будет
  330. 16:37[музыка]
  331. 16:40будет новый номер телефона это фор всё
  332. 16:46здесь мы тогда это убираем локально мы
  333. 16:49не изменяем и это конда нам боль нуж
  334. 16:55какие здесь есть
  335. 16:59фона Обращаемся к ресурсам видимо где
  336. 17:03задан какой-то паттерн и передаём
  337. 17:05параметр собственно этот номер телефона
  338. 17:08вообще использование контекста Здесь нам
  339. 17:11может создать проблем Почему как минимум
  340. 17:14важно гарантировать чтобы этот контекст
  341. 17:16был Application контекстом если это
  342. 17:19будет активити контекст то при смене
  343. 17:21конфигурации у Activity или при
  344. 17:24уничтожении её у нас будет утечка памяти
  345. 17:27потому что этот класс держит ссылку на
  346. 17:30активити как это можно решить Ну самый
  347. 17:32простой вариант - это при при создании
  348. 17:35этого экземпляра мы можем сделать вот
  349. 17:37так вот контекст Application котек и
  350. 17:40проблему с утечками мы решим Но даже
  351. 17:42если мы решили проблему с утечками
  352. 17:44контекст нас жёстко привязывает к
  353. 17:46Андроиду и не даёт уйти в котлин
  354. 17:50платформ или у нас будет проблема что
  355. 17:53при тестировании Нам нужно будет мокать
  356. 17:55контекст кто мока контекст ПС чат знает
  357. 17:59какая это проблема поэтому я бы создал
  358. 18:01отдельный интерфейс для форматирования
  359. 18:04номера телефона То бишь у нас был бы
  360. 18:07интерфейс
  361. 18:09НФ где был бы метод
  362. 18:13Format который вы принимал номер
  363. 18:15телефона и возвращал бы форматированный
  364. 18:20номер телефона и вместо контекста
  365. 18:23Давайте использовать нфор
  366. 18:29соответственно нам нужно передавать этот
  367. 18:32фон форматер в
  368. 18:34instance и передавать его при создании
  369. 18:37экземпляра класса И что мы будем здесь
  370. 18:39делать формат фон -
  371. 18:41[музыка]
  372. 18:49это какое преимущество нам это даст мы
  373. 18:52получим больше гибкости мы сможем нфор
  374. 18:55переопределить
  375. 18:57зайка этот интерфейс при тестировании мы
  376. 19:00не привязываем к контексту и если будем
  377. 19:03уходить в н платформ то сможем при
  378. 19:07помощи expected
  379. 19:09actual сделать это для Android iOS и
  380. 19:12других таргетом поэтому предлагаю
  381. 19:14ставить таким образом Давайте дальше что
  382. 19:16ещё здесь смущает Давайте посмотрим есть
  383. 19:18ли ещё какие-то проблемы в Козе и можно
  384. 19:20ли его как-то улучшить или упростить
  385. 19:24получается что здесь происходит Мы рым
  386. 19:26по списку пользователей смотрим Есть ли
  387. 19:31пользователи с нужным нам айтишником
  388. 19:33чтобы изменить номер телефона и передать
  389. 19:35эти изменённые данные в репозитории как
  390. 19:38будто бы
  391. 19:39хочется немножко упростить и сделать
  392. 19:43что-то вроде
  393. 19:45такого найти пользователя можно просто
  394. 19:48через
  395. 19:50ляду ID ра ID
  396. 19:59то мы можем выйти из этой функции в
  397. 20:03таком случае можно форматировать номер
  398. 20:05телефона позже чтобы не делать лишних
  399. 20:09операций Окей Допустим мы нашли
  400. 20:11пользователя отформатировано телефона и
  401. 20:14дальше мы вызываем наш
  402. 20:16метод вызываем
  403. 20:20логирование здесь меняем
  404. 20:27на е есть проблемы нам репозиторий с
  405. 20:30пользователями возвращает linked list В
  406. 20:34чём здесь проблема то есть репозиторий
  407. 20:37предоставляет наружу конкретную
  408. 20:39реализацию класса list и для меня как
  409. 20:42для пользователя этого репозитория это
  410. 20:44не должно иметь значение Мне важно
  411. 20:46просто получить этот список Если вдруг
  412. 20:49мы захотим поменять под капотом linked
  413. 20:52list на array list или Copy onr list то
  414. 20:55в местах использования сломается
  415. 20:57компиляция если мы я указываем тип при
  416. 21:00вызове если мы начали зависеть от
  417. 21:02конкретных методов linkit листа например
  418. 21:04методы Push Pop пик А я напомню linked
  419. 21:07list ещё и реализует интерфейс theq
  420. 21:12двустороннюю очередь то клиенты могут
  421. 21:14должны будут избавляться от
  422. 21:15использования этих методов Итого это не
  423. 21:18гибко и тоже ломает инкапсуляции давайте
  424. 21:21мы поменяем просто на лист здесь у нас
  425. 21:24при вызове это не имеет значения какой
  426. 21:27конкретно лист и как будто бы для
  427. 21:30эффективного поиска э хочется не
  428. 21:34итерироваться каждый раз по этому списку
  429. 21:37потому что у этого Линейная сложность А
  430. 21:39хочется За константное время проверять
  431. 21:41Есть ли этот пользователей в нашем
  432. 21:43репозитории и Для этого нам лучше
  433. 21:46подойдёт не лист а Map Тем более что
  434. 21:50если мы хотим сделать репозиторий гибки
  435. 21:52если внутри есть какой-то in Memory cash
  436. 21:54то мапы здесь как нельзя Кстати если мы
  437. 21:57часто из
  438. 21:59конкретно адини поэтому Предлагаю
  439. 22:02поменять
  440. 22:04на То бишь у нас будет ключом это
  441. 22:08наш дишни а значением User таким образом
  442. 22:13что мы получаем мы получаем маку со
  443. 22:15списком
  444. 22:16[музыка]
  445. 22:16[аплодисменты]
  446. 22:18пользователей in
  447. 22:21User Как найти юзера мы можем
  448. 22:25сделать от ID И если мы его не нашли то
  449. 22:31прерывать выполнение этого метода дальше
  450. 22:33мы форматируем и репозиторий уже сам
  451. 22:38решит Как нам обновить внутри хш маку то
  452. 22:41есть обновить in Memory cash сходить
  453. 22:43куда-то в диск или в сеть и мы
  454. 22:47собственно дальше логи смотрите какие
  455. 22:50здесь ещё есть проблемы после того как
  456. 22:53мы улучшили метод Аде нам как будто бы
  457. 22:57не нужно делать из этого класса силтон
  458. 23:00потому что у нас внутри этого класса
  459. 23:04ничего не хранится в сингл Тоне просто
  460. 23:08нет смысла мы просто Будем держать
  461. 23:10Постоянно в памяти инстанс этого класса
  462. 23:12при этом в нём даже не содержится
  463. 23:15Никаких данных которые нужно ну
  464. 23:17постоянно держать актуальными поэтому от
  465. 23:20сингл тона Я предлагаю
  466. 23:23избавляться в нём нет смысла Ага У нас г
  467. 23:28нужно ставить соответственно это больше
  468. 23:31не sone и он не холдер потому что он не
  469. 23:34хранит список пользователей То есть
  470. 23:36сейчас это просто н апдейтер по айдини
  471. 23:40как будто бы это уже напоминает нам
  472. 23:42некий кейс Да на нам ещё брать Private
  473. 23:46конструктор чтобы мы могли создавать как
  474. 23:48будто бы это уже просто кейс который мы
  475. 23:51сможем использовать нашем entation слою
  476. 23:53для обновления номера телефона Давайте
  477. 23:55поменяем это просто use Update
  478. 24:01вроде бы всё на самом деле этот код
  479. 24:04можно улучшать и дальше в
  480. 24:06частности Мы в кейсе То бишь в бизнес
  481. 24:10логике в домейн слое самостоятельно
  482. 24:13выполняем поиск пользователя делаем
  483. 24:16проверку Есть ли этот пользователь в
  484. 24:19репозитории и как будто бы это не
  485. 24:22ответственность бизнес и нам бы в кейсе
  486. 24:27хотелось бы просто послать запрос в
  487. 24:29репозиторий А репозиторий уже сам решит
  488. 24:32Нужно ли обновлять Не нужно искать
  489. 24:34пользователя или создавать нового под
  490. 24:36него поэтому я бы предложил отсюда это
  491. 24:40убрать и мы бы просто форматировать при
  492. 24:43визовы метода update форматировать бы
  493. 24:45номер телефона и отправляли его в
  494. 24:47репозиторий репозиторий уже сам решит
  495. 24:49что ему нужно делать также у нас здесь
  496. 24:52есть лоер Я считаю что не
  497. 24:56ответственность кейса
  498. 24:59делать какие-то логирования это нужно
  499. 25:01делать либо на стороне дата слоя внутри
  500. 25:05репозитория либо на стороне entation
  501. 25:08слоя например во VI модели ну здесь Всё
  502. 25:11зависит от вашей бизнес логики поэтому
  503. 25:14логирование я также предлагаю
  504. 25:18убрать убираем убираем соответственно
  505. 25:20comp object и убираем из
  506. 25:22конструктора Также хотелось бы
  507. 25:25переименовать репозитории
  508. 25:32и код стал уже Чуть более чистым мы
  509. 25:36убрали Ну типа процентов 80 кода
  510. 25:40предлагаю на этом завершать

About this transcript

This page contains the full transcript of Разбор лайвкода в Т-Банк на 450к / Android собеседование by Фабрика Офферов / Артур Илькаев, generated from the public captions YouTube serves with the video. The transcript has 2,935 words across 510 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.

What you can do with it

Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.

Free YouTube transcript tool

YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.