Подготовка к собеседованию на C/C++ Developer
Менторы
Специалисты своей области, которые смогут помочь вам
Middle .Net Developer
Senior Product Manager
Middle Python Developer
Ведущий программист
Backend Software Engineer (PHP)
Senior .NET/C# developer
Middle DevOps Engineer | Tbilisi, Georgia
Middle C# .NET
Senior PHP-разработчик
Middle python developer
Каналы
Полезные Telegram каналы и чаты
Транскрипция видео:
Всем привет э Вы на канале мбуш Дракон и Сегодня у нас пробное собеседование на позицию мидлси плюс девелопер и на связи с нам с нами Данил Данил Здравствуй всем привет Итак перейдем к нашему собеседованию Начнем с того что я тебя попрошу рассказать о своём опыте как профессиональном так и любительском как это связано с++ Расскажи пожалуйста я начал учить ещё в универе там у нас были программирование и мы там изучали углубленности плюс начали с основ а потом уже перешли к классам и всяким тонкостям еще будучи студентом начала
00:00:00 - 00:01:21
сказать работу но на работу никто не хотел брать жена поэтому попал на курсы на курсы и после курсов Мне предложили работу проработал в компании 1 год после чего поменял её на текущее место работы Где сейчас работает по сей момент Понятно Скажи пожалуйста какие задачи на текущем месте решаешь задачи разработка нового функционала поддержка старого дописываю модули уже в существующую архитектурную систему используем 17 стандарт плюсов 17 неплохо работаете коллекции Estel используете ли свои используем свои
00:00:41 - 00:02:14
Я понял значит свой какой-то движок Ясно хорошо хорошо но вообще состоянием ты как бы знакомым отлично Окей тогда давай переходить к технической части нашего собеседования такой вопрос немного на порассуждать Вот скажи пожалуйста что ты знаешь про ключевое слово override выбирает помогает нам при наследовании брать самый глубокий самый глубокий определение то есть оно меняет поведение объекта то как нам надо ну подожди овирайт у нас используется на методы так да И что он сделает с методом если мы используем оверайт
00:01:26 - 00:03:07
мы его переопределим Ну знаешь А если бы чуть более точными именно оверайт переопределить метод или без обирайда это тоже будет работать Для этого нам нужен виртуальный метод и виртуальный метод после Райдера будет именно переопределен с этим же параметрами что его родительского класса Да ну тут такой подвох вот может знаешь в каком стандарте появился выбирать думаю что в одиннадцатом Да все верно в одиннадцатом стандарте Ну то есть но не могло же быть такого что до 11 стандарта у нас переопределение не работало
00:02:23 - 00:03:42
Да не могло при определении было раньше я думаю Что же делает тогда кроме смены поведения [музыка] тут я наверное даже не скажу но это как перегрузка самодис Кого Ну да это понятно в других языках программирования Ну там например javacy Sharp возьмем она так и будет работать ну точнее в джаверать не нужен Джаве есть скажем так аннотация Вера Это для души Но вот все шарпе овирать будет именно для переопределения использоваться отвечу на вопрос Чтоб ты знал В общем все плюс плюс переопределения не обязательно для
00:03:03 - 00:04:22
переопределения обязательно указать просто метод с такой же сигнатурой как и базовый метод и этот базовый метод должен быть виртуально то есть нам достаточно его опять-таки объявить и определить и мы его по сути переопределим если он был виртуальную в базовом классе а вероятность нужен для того чтобы мы в текущем месте переопределении и действительно проверили переопределяем что-то или нет потому что давай мы сейчас разберем пример кода чтобы это было понятнее и тогда это будет все Чуть более наглядно я тебе
00:03:58 - 00:05:14
пошарю ссылочку Открой пожалуйста код Шер так так так так Сейчас я найду Угу Вот она Включи пожалуйста демонстрацию экрана И тебя уже должен код появиться да Отлично вот давай рассмотрим как бы вот этот случай да то есть у нас по сути получается мы делаем в базовом классе структуре в данном случае виртуальный метод и получается все структуры дальнейшие его переопределят потому что мы его по сути просто определили а вероятно будет нужен только в ситуации если например мы уберем Виртуал Да объявим место такой же сигнатурой и
00:04:36 - 00:06:14
попытаемся ему написать нам скажет что мы на самом деле ничего не переопределяем и будет ошибка компиляции Потому что при определении нет то есть если более правильно выражаться опирает это такой синтаксический сахар чтобы действительно понять переопределяешь ты что-то или нет потому что вот какая у тебя Вот скажи мне какая проблема представим что проект у нас комплексный Да классов много объектов много вот ты например работаешь с этим классом Child Chart и как бы какая тут будет очевидная проблема что
00:05:56 - 00:07:05
по бейс-фунг вообще не понятно ФБС фанк Нол 0 собственно это метод Или же он тянется из родительских причем Даже будет непонятно тянется у его родительского тянется ли он откуда-то и для вирту Нужно обязательно определить она ощущение Соберется проект Вот но данный код он как бы соберется и отработает переопределением и все переопределение Тоже сработает Как ни странно вот поэтому как бы и важно иметь овирает потому что Ну это конечно гораздо больше помогает читать код Окей хорошо В общем спрашивают Так что возьми на заметку и
00:06:31 - 00:07:55
Давай двигаться Дальше смотри оставляй демонстрацию экрана я сейчас подкину новый код как бы такой теоретически практически вопрос будет Так а как кот появился но немного сдвиги не страшно Ну вот пусть будет так можешь немного увеличить экран увеличить зазумить вкладку да да вот так отлично Спасибо что ж Вот посмотри на этот класс да но определение методов Нет это и не важно да то есть в данной ситуации Как думаешь все ли тут нормально или что-то может быть ненормально так давай немного подтолкнул в нужную
00:07:13 - 00:08:44
сторону до чтобы лучше думалось смотри знакомый ли тебе принципы Солид Да знакомы Хорошо давай с этой точки зрения посмотрим на данный класс менеджер получается делает все что угодно и файл сохраняет и читает из файла и база данных и на сервер нужно сделать отдельно Fire Reader Fire Rider или это будут два метода просто в файл менеджер Таким образом ios-менеджер у нас уже нарушает s в принципе единственная ответственности Так хорошо тут все хорошо Все правильно давай преобразуй пожалуйста вот так
00:08:23 - 00:09:58
чтобы это не нарушал принципе единственное ответственности как ты это видишь и дальше Потом про это продолжим хорошо значит чтобы сделал Я может даже скажешь как называется назовем это антоним если у нас есть принцип сингл но сингл респансибилити как будет антоним как мы этот объект могли бы обозвать с точки зрения тоже тех более-менее академических названий мульти менеджер какой-нибудь в общем есть такое понятие Божественный объект то есть объект который делает все слишком много Давай попробуем разбить на Разные классы
00:09:15 - 00:10:36
посмотреть как у нас чтобы у нас принцип единственная ответственности не нарушался [музыка] значит берем этот метод файл [музыка] отсюда эти методы это будет Data Base Manager и последний у нас будет сервер менеджер можно было бы сделать отдельно мне нравится больше что сказал Я хотел спросить как бы Какой еще вариант можно предположить Так что да ридер Райдер тоже верно но я бы сам если бы реализовал то я бы остановился на варианте с скажем так зоны ответственности файл база данных и сервер но под сервером я подразумевал
00:10:03 - 00:11:59
например что-то в духе на FTP загрузку протокола Вот смотри хорошо тут все хорошо давай тогда вот что тут можно улучшить архитектурно что если мы хотим перейдем У нас есть еще другие принципы что если мы например хотим У нас есть какой-то один например будет одна какая-то строка Да и мы для этой строки Ну пусть у нас Save to File это тоже был бы Например URL что в принципе легально мы как бы путь к файлу тоже можно в формате URL передавать Вот вот скажи что если если мы и хотим например объединить что нам
00:11:11 - 00:12:47
будут пригодилось с ними сделать как бы мы могли этот код рефакторить чтобы они как-то были более-менее взаимосвязаны между собой так-то функционал для них общий интерфейс и сделал бы этот те методы абстрактными и уже в классах наследников их реализовывал Хорошо давай так сделаем Давайте перефакторием в эту сторону ой ой не туда абстракт нету такого ключевого слова все плюс плюс я понял метод без реализации интерфейс забыл от ключевое слово равно 0 в конце то есть объявляешь метод и его получается приравниваешь нулю но такой
00:11:59 - 00:13:32
довольно странный синтаксис и получается файл менеджер и хорошо я думаю можно было бы все две строчки сразу пока первый вставлять везде так хорошо Все круто Окей Смотри вот сейчас у нас мы плавно переходим еще к этому принципу может знаешь как называется принцип на букву о Open closed Хорошо О чем она говорит о том что мы не должны во-первых взаимодействия с ними и все должно через гетеросеторы суть сеттера в том что если мы просто об этом скорее менее закрыт для только наоборот Наоборот закрыть
00:13:12 - 00:14:55
изменения на открытом исследования для расширения расширения То есть получается Здесь Да если мы хотим добавить Например если мы вернемся в нашу изначальную концепцию дата внести какие-то изменения тяжеловато да то есть нам надо менять Большой объект в данной ситуации получается Если мы хотим Добавить какой-то новый функционал какую-то новую возможность его возможность называем это так то есть мы просто наследуемся и добавляем новый функционал Хорошо смотри если мы вот наследуемся добавим какой-то новый
00:15:00 - 00:16:10
функционал и предположим один из методов он будет не актуальный предположим у нас появится какой-то объект Да сложно Выдумать ситуацию просто предположим для которого будет актуально сейф но не актуальный Рит То есть он будет работать например в один конец и Рид у нас по такой по традиции будет ну в кавычках бросать исключение например то что что-то в духе над имплемент Exception что мы тогда нарушим если он будет бросать исключение А мы нарушим дисков институшен то есть принцип установки Барбара Лескова он гласит то
00:15:34 - 00:17:00
что если есть грубо говоря класс Наследник то он должен работать с тем же чем базовый класс то есть там Y есть подмножество X если что-то проводило для их Саныч и проводила для игры Ну скорее было бы наверное сказать что код который использует класс базовый также должен уметь использовать класс Наследник и не задумываться о том который какой класс он использует Вот хорошо хорошо знаешь тут Давай теперь поговорим С практической точки зрения вот мы обсудили три принципа таких важных дальше уже как бы не пойдем Вот скажи
00:16:20 - 00:17:57
пожалуйста например на практике выглядит как бы красиво да естественно Так выглядит красивее но иногда Например можно сказать что разработка будет замедляться иногда приятнее на костылять в один класс это все это все сделается быстрее но если смотреть какой-то более долгоиграющей перспективе Какое например у нас будет преимущество данного подхода который мы сейчас видим на экране от изначального хиты можешь выделить преимущество тут я сразу скажу тут нету как бы идеально верного ответа да тут скорее на подумать Но
00:17:09 - 00:18:21
порассуждать мне интересно твоя точка зрения Почему например вот как минимум то что я здесь больше говорю про синглоресибилити и openclosed чем они важны чем они лучше чем просто используют вот эти вот огромные божественные объекты намного проще потом поддерживать Вот и случаи ошибок находить Эти ошибки наверное Ключевое потому что разработчики чаще читают код чем его пишут и вот во-первых чтение значительно проще становится за счет отсутствия гигантского количества методов начинаем код открываем хедер смотрим headery на
00:17:45 - 00:19:07
методы которые там есть если у нас 6 метров вместо двух Это увеличивает время Ну и например приложение падает мы смотрим по сдеку вызовов и четко видим хотя бы какой класс Да кстати пока демонстрация экрана наверное можно брать сейчас уже есть общаемся Вот это не нужно смотри хорошо ты сказал про чтение класса получается меньше читать удобнее Да давай что еще есть важное у то есть программисты не только пишут код на что они еще там делают они его правят в случае наличия багов после того как на код поправили что нам
00:18:26 - 00:19:54
надо сделать расширять его как мы убеждаемся что багов нет либо по Юнит тестам либо уже давать какую-то фичу в Ну и не покрывают сто процентов все случаев но какие-то самые распространенные всплывут Ну вот смотри Да я вообще говорил типа что мы Тестируем Код Да чтобы убедиться что ошибок у нас нету Если у нас Много мелких файлов то на что это может хорошо повлиять на какой такой процесс скажем так Ну как раз таки на тестирование А почему Потому что Много мелких файлов если у нас в каком-то моменте происходит
00:19:16 - 00:20:57
неправильный тест не пройден то область поиска значительно уже чем если бы у нас был Божественный класс ну и соответственно если ты что-то изменяешь твоя эффект радость класс который дополняет Хорошо хорошо тестированием и знаешь есть еще один интересный момент почему это тоже бывает Хорошо я вот просто недавно на практике столкнулся прямо очень сильно решил вот что можно это на собеседование поставить Вот что с параллельной разработкой скажем так у нас же всегда много программистов работает когда во-первых значительно легче и
00:20:05 - 00:21:27
мерджи происходит и время миржа ветки в ветку Это больше чем кажется на крупных проектах И когда у нас мелкий файл добавляется к большому пулу файлов даже не нужно решать конфликты А если вносить Божественный класс и его параллельно в двух веках правят того человека который будет мерять позже просто сойдет сама Да да все верно и в целом еще как бы ситуация с тем что чем меньше мелких классов тем по сути больше разработчиков могут работать над одной задачей одновременно Но если мы стараемся избежать конфликтов
00:20:49 - 00:22:13
Вот хорошо хорошо мне все нравится давай переходить то переходить дальше Давай снова вернемся к демонстрации экрана я сейчас подкину новый код на разобрать так так так хорошо сейчас мы добавим далее Далее такой вопрос больше на знание основ скажем так вот смотри у нас получается ситуация есть наша какая-то коллекция она тем или иным образом расширяет функционал рея Вот и мы хотим ее использовать в Range Base цикле вопрос Будет ли работать Что будет с этим кодом он не будет работать потому что мы
00:21:29 - 00:22:56
должны юзер Collection Cole должны сказать что конкретно мы от него хотим то есть хотя бы так Ну да Так естественно будет работать потому что для векторов цикла не работают Вот А как что мы можем сделать с юзер Collection чтобы ее можно было использовать в как ну как классическую коллекцию чтобы ее можно было брать как вообще работает значит нам нужно получается перегрузить оператор круглые скобочки И если мы будем возвращать круглых скобочках Ra и тогда он будет к нему проходить не то не то не туда
00:22:46 - 00:24:19
круглые скобочки это ты имеешь ввиду что мы сделали функциональный объект и в общем это все скорее больше в сторону если в какой-нибудь из стадифович хотим это дело положить Вот Но тут все-таки Range Best в общем Смотри какой есть у нас Ну вот по сути Мы возьмем например два способа откинем Range paced Да и например вот обходя тот же Рэй Да какие два основных способа ты можешь выделить чтобы его войти это доступ по итератору когда мы конкретно говорим взять нулевой ячейку здесь первую ячейку либо же берем
00:23:36 - 00:25:07
через форавто и проводимся по всем объектам То есть он возвращает прям объектом вот ну фор- авто это тоже будет Range Place в общем смотри вот это дело оно относится как бы к операторам То есть если ты хочешь чтобы твоя коллекция поддерживалась Ну точнее работала компилировалась когда ты кладешь в Range Base цикл то два варианта которые мы должны можем сделать в коллекции должен быть реализован метод должны быть реализованы методы Бин and которые вернут литератор либо должна быть определена это
00:24:23 - 00:25:42
шаблонная функция beginosta and которая принимает наш объект и также возвращает какой-то объект который отвечает требованиям итератора Вот это такое скажем так базовый но не простой Да по аналогии можем провести с айнумератор и номер в все шарпе и в Джаве есть по моему it Raider и тоже был в общем тоже спрашивают Так что Обрати внимание на будущее чтобы если что ответить так хорошо демонстрацию экрана не убираем переходим к еще одному интересному моменту с точки зрения особенности C плюс вот так смотри
00:25:02 - 00:26:42
вот у нас значит такой код Угу итак по сути есть структура есть две функции так но представим что это лежит в рамках класса Да поэтому как бы у нас вторая функция одна из функций константная как бы этот я сейчас все-таки до 4 не совсем правильно сделал пусть будет лучше Вот так не весь код скопировал но теперь это более логично то что один из методов У нас константный вот ну и получается что у нас ну давай сразу перейдем уже к вопросу что не так У нас два метода с одинаковым названием с одинаковыми принимающими параметрами но
00:26:16 - 00:27:58
один констант на второй Нет это легальная ситуация это как бы как конст является частью сигнатуры этот код скомпилируется Ну по сути это очень частая ситуация когда ты делаешь и константный гетер [музыка] Давай разберемся что происходит в самих методах и в методе Run как бы который их вызывает [музыка] значит структура с у нас X по умолчанию проинициализирует единицей константная геометрия вот тут у нас получается с это не константный объект и не нужно написать нам comst SS Return S Вот я между const Cast Да чтобы вот этот
00:27:17 - 00:28:59
метод корректно работал Не константные объекты К константным объектам кастится по умолчанию consta нужен только для того чтобы убрать модификатор const Так что нет не то обязательно хорошо вот смотри у нас А ну давай говори Понял у нас нет лошадка скажи Но я я не скажу сразу я как бы подскажу вот ну давай обратим внимание именно на объект на структуру S на экземпляр который создается в методах что у нас с ним как бы на экземпляр который создается в методах но на два экземпляра ситуация [музыка]
00:28:21 - 00:29:47
у нас создается объект S структура где он создается Вот на этом месте Но это понятно я имею в виду где будет храниться он будет храниться в методе когда мы его вернем такие вот переменные хранятся в на куче на стеке А да да мы стыка выходим предыдущий очищается мы записываем на стеке Да конечно и когда мы говорим вот здесь вот гетриф то по выходу из этого метода у нас будет записан в с какой-то мусор Да это правильный ответ как бы про стек надо вспомнить Да вот получается что нельзя возвращать ссылки на временные
00:29:35 - 00:31:29
объекты то есть ссылка на временный объект объект по выходу из функции он нас разрушается то есть на самом деле дальше у нас как отработать Как нет работать никто не знает Вот то есть это уже хорошо Ну то есть вообще как бы я когда это все тестировал то есть в зависимости от того какой я сделал комбинацию методов я мог получить например на вывод 1 мог получить новый год мусор но ни разу не скрашивать я думаю можно искрашить при желании вот так ну в общем про стек про временные объекты про ссылки это Это важно Это
00:30:41 - 00:32:06
надо знать так хорошо А теперь давай мы уже перейдём к именно задаче будем решать задачу вот ну то есть сейчас это были так э больше теоретические вопросы с демонстрацией Кода да А сейчас уже конкретно прямо сделаем лайф кодинг Вот смотри задача довольно-таки классическая вот Но получается что мы имеем бинарное дерево и соответственно функцию которая принимает на вход два корня бинарных дерева и должна сказать является ли эти деревья одинаковыми одинаковые значит что у них одинаковая структура и все значения в ячейках тоже
00:31:28 - 00:33:03
одинаковые вот задача Так значит напишем и Давайте Сначала с рассуждений с объяснением что потом можно сделать совершенно обход нам нужно сделать совершенно обход будем идти с вершины дерева поверхностное дерево влево как только слева мы встретим Новый ПТР мы будем идти вправо но один раз как только мы пойдем вправо один раз снова идем постоянно влево пока И если после вершинного обхода Мы полностью конкурентно функции нашего раскрутили и ни разу не встретили Фолз значит деревья одинаковые если хотя бы раз
00:32:29 - 00:34:03
встретили тогда деревья разные Ну то есть ты предлагаешь сделать обход в глубину прямой Если я правильно понял Хорошо как бы что-то подразумеваешь под встретили Фолз если в какой-то момент п не равно Q или же левая надо п Ну ПТР а лево надо Кио Не ну ПТР то в таком случае Фолс Ну и правая в зависимости от того На каком этапе Если же все P равно все Q и одновременно и океан лптр тогда возвращаем True хорошо есть один момент который Меня смущает но в целом я думаю можно переходить к реализации по ходу дела разберемся Вот
00:33:23 - 00:35:16
Но я имею до второго объяснения но в целом звучит как бы здраво поэтому давай превращать твое видение в код включается и КС равно равно X значит здесь сделаем питон [музыка] и Да и рай ой и чего [музыка] стоит еще какой-то проверочку сделать Сейчас я подумаю если у нас есть левые левая надо и травы надо при работе с указателями что в первую очередь мы проверяем проверяем их навалилось то что они не на опыты пайки это указатели да я сразу вот эти показатели думаю но думаю вроде Здесь проверился нормально
00:34:20 - 00:36:26
получается Ну ладно реализовывай Но конечно есть замечание тут смотри какая ситуация например то что п и Q от предположим мы пришли в нашу функцию Да у нас здесь сейчас п икью оба нал Да например что мы в этой ситуации вернём Почему Потому что у нас не пройдет первая проверка хорошо а должны что вернуть Хорошо давай тогда это сделаем и если не п и никю пусть будет так и и напишем если один из них мало а второй не знал Ой уже много скобочка так [музыка] Согласно сработать и Смотри такой занятный момент по поводу
00:36:10 - 00:37:57
передачи и проверки вот Обрати внимание на начало своей функции Да вот объективно учитывая Начало этой функции у нас рекурсия Нужно ли тебе проверять то что они не Нал и то же самое По поводу Ты копируешь да Ну там тоже райт ты не дописал вот [музыка] получается смотри мы проверку уже как бы сделаем да то есть соответственно точнее проверку мы сделаем в будущем да то есть дальше при курсе мы эту проверку сделаем то есть объективно нам потому что например ты проверяешь как бы плевт а что потом проверять plf Left или P
00:37:55 - 00:39:27
Left Right Ну то есть надо стараться В общем В таких ситуациях оставаться как бы на своем уровне То есть у тебя есть как бы твои ноды да Именно ты пришел в Pak you например ты всё что нужно сделать на уровне пью делаешь Да и потом получается переходишь уже дальше при курсе и соответственно дальше в курсе они придут на свой уровень и тоже все что нужно сделать это один момент и такая рекомендация на будущее решая рекуррентную задачу первую очередь реализуем как бы точки завершения рекурсии так гораздо больше
00:38:44 - 00:40:06
проще построить логику то есть гораздо более сложно Задача в том числе для интервьюера будет выглядеть если ты например пишешь какой-то If в нем например ты куда-то уходишь в рекурсию и потом где-то снаружи Фолз В общем всегда сначала лучше на костылять вначале В общем а потом уже написать свою логику понимаешь что я имею в виду Давай попробуем вот отталкиваться от концепции того что мы делаем все что мы должны сделать в нашей точке В первую очередь а потом уже работаем по рекурсии тут не ритуал нам нужно еще правые
00:39:25 - 00:40:38
деревья Как там справа перейти влево сейчас подумаем слева перейти направо смотрим если у нас есть пайки и их вершины равны в таком случае возвращаем и в cm3 Plus значит и торрент Т да [музыка] мы находимся в вершине У нас два одинаковых дерева есть они есть спускаемся налево слева они есть Они совпадают но вызываем для Plus возвращаем True значит здесь вернули True значит идем направо но я думаю что вот этот код будет работать да Для меня тоже выглядит рабочим Возможно есть какой-то острый момент моя претензия по большому счету к
00:40:16 - 00:42:28
этому коду только его усложненная читаемость Да попробуем его привести к более Вот смотри давай мыс Как переделаем твой код во-первых один момент к чему сразу могу прицепиться Да и к чему скорее всего на интервью тоже к тебе потенциально прицепится вот твоя реализация Начиная с 19 до по 22 строку но слишком много If Если уж решаешь то Ну как найти их можем преобразовать чтобы не было вот этого бесконечного вложенного Ифа чтобы не было бесконечно Как мы можем объединить что мы тут могли бы написать
00:41:42 - 00:43:17
Можем написать здесь и вот так нас оператор прекратит свое выполнение как только встретить первые условия значит дальше мы тоже можем объединить так но большой и что тоже плохо так я говорю что их тебе тут вообще не нужен в твоём этом месте Ну практически практически есть проблем когда Ну то есть ты Дальше можешь объединить Вот смотри по сути да к чему я веду если ты сначала учтешь крайние случаи Да крайние случаи например когда ты точно Можешь вернуть труп когда ты точно Можешь вернуть Фолз Я например
00:42:28 - 00:43:54
вижу крайний случай такие то есть с точным возвращением тру это Например если они оба равны на опыта ты это проверил всё хорошо далее точный момент когда ты тоже можешь вернуть Фолз 100%. это когда один равен на ПТР другой не равен опыт Эр так соответственно ты в этой ситуации тоже можешь вернуть Фолз получается один равен опыта второй неравенного ПТР им сразу же возвращаем Фаст тут да получается что у тебя вот вместе с этим условием объединено и вся остальная Твоя часть то есть смотри Давай попробуем после
00:43:18 - 00:44:38
IFA добавить If на то что один равен и другой не равен насколько потом увидишь насколько преобразуется в лучшую сторону решения [музыка] если не P или ничего но я бы еще конечно добавил если они например не равны что-нибудь такое Ну типа чтобы это чуть больше читалось но вообще если не P и не Q и это условие то что они оба мы уже проверили да Тогда хорошо тогда будет хорошо и смотри что нам тогда остается Как мы можем преобразовать наш оставшиеся их Да это условие отваливается Как мы можем вообще
00:43:57 - 00:45:22
избавиться от последнего Ифа от последнего не от первого до последней их Да вот это вся но по сути последний мы могли бы сделать как будто это и fls Да И вот это ритуал из из м3 л Фолз Но мы же можем сделать и по-другому мы же можем вообще сделать один ритуал а сделать один Так давай сейчас подумаю значит приторно иссеим 3 мы можем сделать Типа такого сначала проверим что сейчас если я сразу скажу больше If нам не понадобится Давай в эту сторону вообще нити то есть вот эти два твоих верхних Ифа Это все что тебе нужно с точки
00:44:49 - 00:46:27
зрения If с точки зрения проверки крайних случаев Типа такого из и [музыка] Смотри я вот на чем я вот нашел ты спотыкаешься такой момент если ты хочешь вернуть у тебя Бул возвращается да то в принципе не обязательно вот эти вот например Знаешь это как выглядит по большому счету их True Return True If Nitro ритуальную Фолз Давай придем уже подскажу что я имею ввиду во-первых просто достаточно сделать что-то типа сейчас я подкину код так так так так я тут твое подотру Вот то есть твой код до этого тоже рабочий
00:46:14 - 00:48:00
То есть все верно задача была решена но как бы Согласись что с такой точки зрения читать и решать гораздо легче то есть мы с 16 по 21 строку мы как бы крайний случай закрыли Да дальше начинается наша логика если текущие значения равны если равны левая под дерево если равны правая потери Ну то есть всё это все это идет через один Return так получится гораздо как бы красивее гораздо гораздо более читаемым вот тут понятно Да тут понятно Ну в общем для такого рекомендую порешать задачи и рекомендую придерживаться вот этих вот
00:47:18 - 00:48:44
назовем это техник что ли Да когда ты сначала заканчиваю как бы вот эти вот заканчивающие делаешь какие-то ифы Да и всегда стараемся оставаться на своем уровне то есть не уходить в проверке Left не уходить они проверятся вот этими заканчивающими ифами на следующий как бы итерации рекурсии вот хорошо Сейчас ещё подумаем так все можешь убирать демонстрацию экрана Последний будет такой теоретический вопрос Вот смотри синглтон Да вот на недавном собеседовании мы реализовывали синглтон сейчас принято синглтон как бы не любить так и
00:48:04 - 00:49:40
называть его антипатерным Какие вообще что в нем что не так вообще синглтона ты можешь рассказать По своему опыту Может просто знаешь почему его Какие к нему предъявляются претензии скажем так Том можно вернуться к началу собеседования пройти божественные классы Главное чтобы в какой-то момент наш синглтон не стал божественным классом который делает абсолютно все из всех мест в принципе не вижу ничего плохого в умеренном использовании в том же Unreal корректор у него есть [музыка] контроллер вроде бы и он тоже сделан
00:48:51 - 00:50:15
через синглтон и [музыка] получается что выполняется в принципе единственная ответственности и там он уместен один игрок один контроллер нельзя наворотить больше логики Это основное наверное упущение синглтона по сравнению с ооп когда мы используем множество объектов Для различных целей вернемся к принципу единственное ответственности подскажи пожалуйста почему синглтон его в принципе всегда нарушают потому что он из всех мест вызывается и делает почти все скорее я имел ввиду то что синглтон как
00:49:38 - 00:51:19
минимум несет две ответственности это инициализации и еще какое-то функционал Да вот это как бы проблема но это такое Ну более философское То есть если давай подумаем С точки зрения тестирования Что может быть не так при использовались нельзя покрытие не тестами большая проблема то есть у нас вводится глобальное состояние да и у нас порядок тестов может состояния мы не можем тестировать такой код Давайте Ну можем конечно и все можно но сложно вот хорошо В общем на этом У меня все сегодня по вопросам по собеседованию
00:50:28 - 00:52:05
Давай краткий фидбэк пройдемся Сейчас я скажу Ну момент со стеком надо подтянуть надо знать когда солидом мне понравилось было хорошо было по делу и порешать задачки надо на деревья чтобы рука была больше набита в сторону Вот таких вот рекурентных задач такие ну задача на деревья скажем так на уровне от джунио до там Middle Plus очень популярная тема поэтому рекомендую подтянуть как бы ну на собеседование вот плюс они такие классные красивые вот так на этом на этом наверное у меня все сейчас я пытаюсь вспомнить
00:51:21 - 00:52:57
саранч Base Да еще был момент Но это как просто как на общую эрудицию на общие знания лишь не бывает тоже рекомендую ознакомиться с информацией вот так на этом У меня все давай прощаться со зрителями В общем все пока там ставьте лайки Подписывайтесь
00:52:14 - 00:52:53