0: Так, ну погнали. Запись, погнали. Запись, погнали. Запись.
1: Все join.
2: Привет. Привет. Меня слышно? Угу. Угу. Супер. А слышно с камерой без, как будет круто, если с камерой, к сожалению, у меня камеры нет, да, без проблем.
3: Да, сейчас все будет. И ты, вы не против, если я буду на ты называть? Давай так лучше на, ты согласен? Все, супер, супер. Я случайно начал так.
4: Видно? Да, отлично. Супер. Ага. Так, ну смотри, давай немножко познакомимся. Ты идёшь у нас на backend разработчика вакансия, соответственно, у нас в проекте
5: Сказать. 2 команды бэкенда. Я тимлид 1 из команд, возможно, подойдёт тимлид, другой команды ещё не знаю. Набираю я себе, ну, то есть именно вот смотрю в мою команду про разницу.
6: Command. Могу сказать, там уже позже, скорее всего, в конце, если тебе интересно. Да, хорошо, давай, как у нас будет проходить собеседование. Сначала я хочу узнать тебя, какие ты кейсы решал, потом у нас будет
7: Небольшие технические задания. Просто показать, что ты понимаешь базу сша, базу дотнета, проведёшь код ревью, и если знаешь, то ещё порешать сиэль. Хорошо. Вот.
8: Так вот, начнём с 1 вопроса. Это вот у тебя 3 года опыта. Соответственно, ты, скорее всего, за этот опыт уже решал какой-нибудь свой самостоятельный, достаточно большой кейс, вот которым ты там, возможно, гордишься, или что-нибудь такое. В общем, что-то такое, чем можно похвастать.
9: Скажем так.
10: Ну, смотри, прошлое место работы, ну, получается, последняя такая вот прям запоминающаяся задача. И, если говорить с точки зрения масштаба, была фича по разработке документа системы докумен,
11: Оборота. Получается, когда я приходил в компанию, у нас продукт вот этот, над которым я работал, был достаточно молод в зарождении, можно сказать, и все те процессы, которые мы впоследствии смогли автоматизировать и нормализовать с помощью нашей црмки.
12: Они были вручную, что достаточно много времени отнимало у операторов, у компании. Ну, это все время деньги, как говорится. И вот, вот эта фича по разработке системы документооборота предполагала свой ком.
13: Комплект документов на каждый тип операции, возможность генерации этих документов в 3 разных форматах. Какие-нибудь
14: Выгрузка комплекта документов, ну вот достаточно длинная по срокам решения задача, которую мы долго поддерживали и разрабатывали вот так вот.
15: Угу, понял, понял. Крутой кейс. На самом деле, смотри, у нас много библиотек, в принципе, существует в проекте, но основные, я думаю, ты сам это понимаешь. Это акор, и эти воркор, соответственно, обычно очень сложно.
16: Определить там, кто что умеет в encore, потому что библиотека общая, практически все нужно уметь, либо ничего. Соответственно, какой у тебя был самый сложный, самый, скажем так, как ты глубоко погружался в библиотеку кора. И это какой-то пример, ну,
17: Нет, я могу вспомнить когда, дабы понять вот этот flow, авторизационный, как работает мидлвар, я погружался во все эти хендлеры там из хендлеров ещё.
18: Какие-то внутренние классы для обработки, авторизации и там каждая под свою схему. Ну то есть если ты имеешь ввиду, куда Копал, то из снета, я могу вспомнить, что вот Копал в сторону авторизации, аутентификации, вот эти мидлвары исследовал и так далее.
19: Вот все, что связано с этим точки. А и мед, мед. На самом деле тебе может показаться, что типа это база, но вот поверь, редко кто их называет, например, то есть уже медлер, что-то
20: Понимаешь, про антикор, что можешь сказать? Кейс был, получается, по, я думал, он достаточно стандартный, но, тем не менее, удалось поработать и с экспрешенами в ходе его решения. Это, ну, реализация.
21: Твоего получается, механизма фильтрации, когда ты вот на основе какого-нибудь мы использовали, к сожалению пост запрос, куда передавали какую-то вот дтошки описанием почём нам нужно отфильтровать
22: И по этой дтшке у нас строилась, строился экспрешен получается который мы в hr засовывали, как бы и фильтровали по этому экспрешен. Понял? У нас есть на самом деле похожая система. Я думаю, если пойдёшь, она тебе, ну она достаточно, видишь, распространённый тако.
23: Кейс, который и почему-то все продолжают свои велосипеды делать. Ну да, согласен. Но, в принципе, я думаю, если было бы какое-то есть какое-то основное решение, я знаю точно, что если вы делаете не рестапи, а одата какой-нибудь
24: Что тоже вполне. Ну вот, да, я хотел сказать тоже есть свои варианты, но не все хотят делать водато, и я, в принципе, могу их тоже понять. Оно такое тоже, когда ты слишком на него полагаешься, сразу такой. А если я хочу кастомное все, дата создалась, нужно
25: Либо нужно разбираться, как в неё сделать кастомно. Ну да, меньше какого-то контроля над этим. Всем согласен с тобой. Вот. Ну, в принципе, да. Я на самом деле согласен с тем, что фильтры должны проводиться каким-то дата ривом, подходу, скажем так.
26: Ну, я понял. Очень крутой на самом деле тоже кейс. Давай перейдём к следующей части. У нас сейчас скину тебе ссылочку в созвон.
27: Пу пу пу пу.
28: Вот такую.
29: Там у нас прошаренный Фальчик, там сейчас написано, hello, world. Угу. Смотри, важно ещё подчеркнуть. Я не вижу, как ты выделяешь что-либо, поэтому нужно говорить строчку, либо писать пробелов, не знаю.
30: Ага, хорошо. Такой прикол надо, наверное, найти вообще другой сайт, потому что нифига неудобно. Смотри, вот скопировал тасочку можно писать в теории, но так немного, потому что если долго писать,
31: Задерживается собеседование. Обычно, смотри, в каждом задании у нас вот таточка есть класс, и он задаётся, и там вызывается что-то в консоль riteline. Обычно, соответственно, в каждом задании основное, основной вопрос это
32: Что выводится в консоль. Угу. Соответственно, здесь тоже самое. Вот жду твоих обсуждений. Так, у нас 2 структу, точнее, класс и структура.
33: Секунду, создаём класс экземпляр, потом создаём экземпляр структуры, выводим сначала мой класс, нам, ну, получается а, не, не выводим, смотрю, вижу.
34: Вижу, так мы передаём.
35: + 1 ничего не случится.
36: Потом мы передаём метод ц.
37: Так, ну смотри, в случае с 1 выводом это у нас будет 1, потому что мы, ну, получается, вот тут передадим копию и то, что
38: Мы тут пере, тебе видно выделение, или я забываю про это выделения нет, но я вижу, ты написал единичку. Ага. Ну, то есть, 32 строка у нас никак не повлияет на то, что, ну, получается. Угу. Угу. На исходную, я поняла.
39: Я конкретно рассматриваю класс, поэтому сразу перешёл к методу ц, в который мы передали экземпляр этого класса, и так как это класс, мы у него заинкрементить это поле.
40: Изменения отобразятся и выведется 1, так как это класс.
41: Угу. Так, дальше структуру рассматри, получается, создаём структуру, передаём в метод п, ну вот, в случае структурой со структурой мы такого поведения не добьёмся, потому что мы передадим
42: Полностью копию и у нас выведется, следовательно, дефолтное значение для интов это 0.
43: Угу. Угу. Окей, понял. Угу. Да, это правильный ответ. Смотри как ты сказал вот метод. А и метод б, они фактически ничего, ну не делают да, можешь объяснить почему, в чем разница между int, май, стракт и классом. Почему?
44: Они по разному работают.
45: И между my стракт и my class, да, ты имеешь ввиду разницу, ну, между интом и майстра ом, и my классом, в общем, между классами. И вот, ну, смотри, у нас ссылочные типы передадутся как копия целиком, ну, то есть, в случае
46: Мы передадим полностью копии, у нас изменения не отобразятся на том, что мы как бы туда передавали, а структура у нас, ну то есть это поведение актуально для ссылочных. Нет, подожди, для значимых
47: Типов. Угу. Для значимых типов, а структура является по умолчанию значимым типом. Поэтому для неё актуально такое же поведение, как в случае с интом, просто int. Это, ну, дефолтная структура, бцл.
48: Угу. Угу. Да. Ну, это оба значимые. Типа, да.
49: Окей, что мы могли бы сделать с методом а или методом б, чтобы они какую-то пользу приносили? Как мы можем поменять это?
50: Ну, метод, а мне вообще кажется достаточно странным, если мы хотим именно имитировать поведение, изменения какого-то свой, ну, в данном случае поля внутри структуры, ну, можно, допустим, написать, насколько я помню.
51: Это будет ref и передавать по рефу, ну то есть по ссылке непосредственно как бы имитировать поведение класса, если можно так выражаться конечно да, на самом деле это в принципе и будет имитироваться на переда.
52: Ну да, вот как, как в случае, как будто класс передаём. Да, я понял. Смотрите, сказал, так что метод, а тебе кажется странным есть похожий очень метод. Буквально сишарпе называется инкремент, оператор, который
53: Тоже самое. И он не страны просто это просто так это, а про какой ты конкретно говоришь, я только помню, понял из интерлок вот это а plus plus буквально пишешь. Это же буквально фактический оператор, который является методом, я понял.
54: На месте значения. Единственное, что он выдаёт ещё значение здесь он прям вот делает ещё, ну, я к тому, что они достаточно, очень похожи. Так что это, почему бы нет, кто знает, какие операции кому нужны. Правильно? Ну, в принципе, да. Окей. Смотри, вот ты привёл пример, вот с реф.
55: Он подойдёт метод, а методу б есть также ещё 2 ключевых слова для аргумента функции это out и это in, можешь рассказать про них, что ты про них знаешь, так я начну с Инна, потому что я точно помню.
56: Это получается модификаторы. Ну, мы пометим параметры этим модификатором, и у нас, мы не сможем внутри метода. Допустим, у нас будет in my стракт и мы не сможем май стракт.
57: Написать new Майтак, то есть переопределить точнее переназначить не сможем угу. Это вот как раз-таки про in out.
58: Это, в свою очередь, значит, что мы вот этот параметр, который пометим аут, обязуемся проинициализировать в рамках этого метода, в котором он, ну то есть
59: У нас будет ошибка компиляции, если мы оставим вот так вот метод с параметром аут при этом не проинициализируем его.
60: Да, да, да, да, все верно. Так, давай перейдём к следующей задачке.
61: Такая задача. Тот же самый вопрос основной. Это что вводится консоль? Угу. Так, ну там создал только чат касс, так.
62: Угу. Переопределяем метод, а
63: И brick войд метод б.
64: Угу. Так, чайлд.
65: В 1 случае мы принимаем как параметр чайлд класс не как базовый, вызываем на чайлде метод, а это получается метод.
66: А начал это wild класс.
67: Потому что мы его переопределили метод. А. Угу. Во 2 случае мы вызываем метод б. Вот, кстати, сейчас пытаюсь вспомнить.
68: Вызовется ли метод б как в случае, если мы нью писали ну типа было бы тут new, тогда у нас точно вызвался бы вот этот метод, который new и тут бы у нас было тоже получается.
69: Вот класс, но я думаю что это актуально даже и без new, просто там будет ругаться компилятор, типа что поставь new и все.
70: Угу. Угу. Так, a2 метод у нас уже принимает его как объект базового класса, получается. Ну, в 1 случае мы все равно выводим чайлд класс.
71: Так, ну сейчас секунду Бейс класс как принимаем как base? Но у нас же все равно чайлд и вызовется все равно наш метод переопределённый, поэтому да, wild. А вот во 2 случае
72: Должен вызваться метод бейскласс.
73: Так, ну ты скажи, я вроде правильно размышляю? Да, да. Ответ правильный полностью. Угу. Давай. Вот ты сомневался на 2 выводе?
74: Можешь повторить, пожалуйста, тебя очень плохо слышно.
75: В методах оно просто убирает ворнинг.
76: Который, типа, говорит тебе, да, слушай, ты перекрываешь метод, но это не совсем понятно, не знаю чем он помогает потом в итоге все равно метод перекрывает его. Короче, фактически ты игноришь ворнинг, можно, наверное, даже какой-нибудь, не знаю, там в райдере точно можно написать коммент, который просто warning выключает на 1 строчк.
77: Ну да, использовать можно, ничего не поменяется. Это ты, получается, объяснил, да? А то ты у меня на секунду пропал, и я понял, просто видел твой как-то связь плохая. И на моменте, когда ты уже объясняешь, ты ничего не спрашивал. Нет, нет, нет, нет, сейчас.
78: Супер, супер. Да, я понял. Ну, вот видишь, я сомневался, хотя, ну, до конца не был уверен, честно. Угу. Смотри, слушай, вот ты, а что, у нас есть метод, а метод би, они по разному работают, да? Ну, очевидно, потому, чт,
79: Здесь присутствует слово юрче выбирает. Я даже это не буду спрашивать. Вопрос будет такой. Можешь ли ты объяснить, как оно внутри работает? Слушай, ты, наверное, что-нибудь о алло.
80: Не, я тебя слышу, я тебя слышу. Продолжай. Ты, наверное, про таблицу виртуальных методов. Хочешь спросить, которая хранится у каждого? Ну, у каждого класса, но я просто знаю, что она
81: Существует честно, каких-то подробностей я не Копал, вот могу так сказать, ну за счёт как раз-таки таблицы виртуальных методов, оно работает тут я знаю, что за счёт этого конкретики не вспомню. Ну на самом деле этого достаточн
82: На самом деле, я ничего так хочу услышать. Я просто хочу услышать, насколько глубоко. А, я понял, понял. Типа, ну вот на уровне виртуальной таблицы, что она существует, это тоже интересно. Смотри, у нас, кроме вот этого вирту, Вера у нас на самом дел.
83: Есть Шарпе ещё несколько способов добиться этого, как минимум, я знаю ещё 2, ещё 3. Есть секретный, скажем так. Возможно, ты помнишь, какие-то из них можешь назвать. То есть не только vice. Верай позволяет нам на самом деле вот это сделать.
84: Ну, перегрузочку какую-нибудь можно сделать, которая там с разной сигнатурой будет. Ты, ну, наверное, больше вопрос про разные виды типа полиморфизма, когда, смотри, перегрузка не сработает, потому что я могу сделать, допустим, создаём метод б, да, у нас остаетс.
85: Точнее и метод б ещё 1 рядом с перегрузкой создаём и в чайлде, и и в методе, ой, в чайлде и в бейсе, и они не будут динамически вызываться, как и метод б, потому что у них нету специальных свойств вот этих вот, так что нет.
86: Интерфейс динамического динамического вызова. Вот, вот это правильно, интерфейс
87: И методы расширения.
88: Не, они не статические, то есть на них буквально написано, что они статические. Ну да, я понимаю, но мы ж то их на экземпляре. Ну ладно, хорошо, я понял. Так, ну я назвал вот интерфейс, ты говоришь, какой-то остался 1 секрет.
89: Да как ты называешь его?
90: Алло.
91: Тебя не слышно.
92: Так, алло. У меня походу пропал инет. Ага, теперь слышу, теперь слышу. Но я не слышал до этого тебя. Я понимаю, я вообще ничего не видел. У меня нет интернета. Я не знаю, че это. Ладно, если я сейчас на всякий случай напишу 2 этим ляду, если так повторить.
93: Чтобы он был здесь.
94: Так, ты назвал интерфейс и, ну вот ко 2 пока не пришёл. Ты говоришь, это что-то секретное, может какой-то ещё 1 нормальный, я его думаю, его можно знать и нужно знать. A2 такой.
95: Секретный, ещё 1, ну не секретный, я не знаю, можно сказать, что он костыльный в каком-то смысле. Ну вот 2, может new как раз-таки, я не знаю, через не new вообще не меняет ничего буквально по поведению, на самом то деле.
96: Слушай, пожалуйста, сформулируй вопрос заново. Я вот смотри, у нас вирчу оверрайд интерфейсы, да, они, если помещаются, имя, метод, да, он сразу становится как бы особенным для сша. И он говорит, окей, теперь я называю его динамическим. Могу даже объяснить, что значит динамически.
97: Поточнее динамически значит, что вызов её будет зависеть от экземпляра, а не от типа. То есть в принципе в чем разница? Это то, что обычный метод, он просто смотрит какой тип Бейс класс хорошо вызываем значит base class неважно, если вижу часть класс, значит ч класс, то вот здесь вот начинается друго
98: Поведение, он говорит, какой конкретно экземпляр на данный момент поэтому мы можем сделать какой-нибудь массив классов, да, и потом они наследуются, там разные методы делают, а мы вызываем из 1 из 1 точки. Соответственно, да, вот вече интерфейс они обеспечивают.
99: Поведение.
100: Честно говоря, затрудняюсь ответить. Я все равно вот пытаюсь. Точка ком, может какую-то небольшую намёк, я не знаю, я, возможно, где-то рядом, знаешь, буквально есть на экране у тебя на
101: Да, ключевое слово. Ключевое слово на экране. Ну, у меня 2 силт и abstract из таких, которые прям выбирай. Ну, абстракт, да.
102: Abstract ага, вот когда метод абстрактный, ты обязан его реализовать, у него как раз тоже динамическое поведение это легко доказывается смотри, пишу метод на абстрактный класс. У нас e буквально здесь Бейс класс абстрактный же ну да, а там его не может быть. Значит я точно не вызову его. Значит я буду ориент.
103: Ориентироваться на что? На экземпляр, на конкретный экземпляр, да, я не могу ориентироваться на тип, там нет этого реализации этого метода просто банально. Ну да.
104: Вот что. Абстрактные функции, интерфейсные функции и виртуальные функции. Угу. Если что, костыльный вариант это просто храни у себя поинтер на функцию в виде фанк, там от чего-то. И меняй его при насле.
105: Я же сказал, я сказал, это костыльный вариант. Ну это, это прям, это вот сильный, я бы сказал, вариант даже, да, это так, к нему просто не придёшь, знаешь, сидишь, и такой решил написать Функ, как я когда-то, когда
106: Я задание составлял, я же придумал, да, круто. Окей, на самом деле внутри они фактически это и имеют ввиду. То есть можно фактически каждую функцию взять, заменить на типа поле с функцией внутри и просто заменять её только при наследовании будет при
107: Примерно тоже самое поведение. Угу. Ну, если так, прям банальненько смотреть не на реальную имплементацию, скорее на семантику какую-то. Окей, давай перейдём к следующему. Так, а я походу, да.
108: Интернета у меня нет. Видимо, все закрылось. Сейчас найду быстренько.
109: Так, должна быть следующая. Угу.
110: Так, ага, консоль 1 консоль.
111: Консоль райт лайн. Так, ну.
112: Сам эвейт мы вызовем так как мы его не эвейтит и там, ну, то есть мы его не эвейтит льно, ну, как исходит из перевода, мы его не ожидаем.
113: Следовательно, код пойдёт у нас просто дальше и должно так, ну, дефолтное значение для стринги у нас это будет, ну, должно.
114: Должно выводить. Ну потому что мы ж его не ожидаем. И я думаю, хотя вот тут
115: Вопрос такой спорный, что у нас выполнится быстрее, типа вот эта таска, которую мы запустили, грубо говоря, не ожидая, где у нас в task delay 5, не помню какой там параметр. И мы
116: World или у нас уже консоль райан выведет раньше ну ну я думаю что ну будет ну предположим что task delay прям большой и у нас не будет какого-то лага на 1 потоке какого-то огромного 5 миллисекунд не помню t дилей по моём.
117: Миллисекунды там. Ну, если большой, то, понятное дело, мы дальше быстрее перейдём и выведем вот эту строку, которую мы ещё как бы не изменили в том методе. Угу. Окей. Просто await не прописали. И поэтому, да.
118: Ну да, ну, к этому вернёмся. Смотри, если мы заменяем функцию на run sync, которая вот ниже, в какой последовательности выведется консоль рана синг 1, run, sync 2 и сам message, который null.
119: Ну вот это будет 1. Потом у нас, потом, ну.
120: А потом не знаю, выведется ли run sync 2. Если. Ну, у нас же выполнение метода, да, не выведется ну, если это был бы main method. Ну вот, да, я, видишь, и main я.
121: Думаю, а тут же я смотрю, что таска обычная, да, мы скажем так, не знаем. Ну да, смотри, а ты уверен, что run индивид точно быстрее, чем message здесь как раз о том, о чем ты говорил до этого, что непонятно, типа что они же одновременно здесь нет никакого дилея.
122: Есть, есть равносильно, соответственно, точно ли они выведутся именно в этом порядке.
123: Ну, мы когда заходим в асинхронную функцию,
124: Так, ну раз, вот, кстати, хороший вопрос, потому что я себе представляю флоу, который я хотел описывать, исходя из того, что мы эвейтит, как бы объяснять, что мы доходим до эвейта 1 внутри функции, потом отпускаем, если там реально тяжёлая операция.
125: Синхронная. А вот в случае с обычной таской, которую мы так запускаем, тут я даже не могу быть уверенным в том, что run sync выведется раньше, чем должен раньше вывестись.
126: Угу. Но ты не уверен, да? Окей, понял. Смотри, ну, здесь тоже, в принципе, скажу. На самом деле, здесь рано действительно вводится 1. Всегда, и это детерминировано всегда известно, потому что
127: Ну ты вот разговаривал про flow ну честно, может быть там как раз и есть твой ответ. Я бы его можно интерпретировать по крайней мере ну не знаю, я не услышал, по крайней мере, точно часть до эвейта в синхронном методе выполняется синхронно.
128: На самом то деле, то есть она вот как бы, скажем так, если мы говорим какой-то бэкграунд, поток уходит или ещё там какой то какой-то, не знаю, пул, Тасков какой-то уходит все это, оно происходит именно не когда мы вызываем ранасингх, когда мы до авейта доходим, поэтому
129: Будет, да, точно, синхронно выполняться до это, даже если мы не вейти вот здесь, да, получается. Ну, я себе это и представлял вот так вот, как ты рассказываешь. Но, знаешь, стандартное понимание приходит, когда ты просто эвейтишь. Ну, видишь, ты объяснил, что, ну да, зачастую
130: Вообще у нас таскивают они либо синхронно вызываются, там какой-то метод, вызываетя, какой-нибудь пал или что-нибудь подобное синхрон резал.
131: Зачастую такого нет. Вот мы как раз к этому подошли. Смотри, у нас получается, таск 3, мы не написали там they. А можем ли вообще написать там, в почему мы не написали?
132: Что-то нас ограничивать в этом.
133: Ну, возвращаемое значение как минимум, хотя бы написать таск и async добавить а можем ли мы это сделать? Ну, в плане написать, да?
134: Ну, можем написать. Вот я ж написал синхронный конструктор с результирующим таском. А, подожди, это был конструктор. Не, я перепутал с обычным методом? Не, конечно, конструктор, конструктор, конечно, не можем. Конструктор.
135: Конечно, никаких асинхронных операций, ничего такого. Это, знаешь, это задача, наверное, сейчас такая, со звёздочкой, ну, не с 2, но с 1 точно. Смотри, если я все-таки хочу создать свой объект, ну, допустим, это будет таск 3, я знаю, что
136: Обычно лучше не надо так делать, но допустим, что я хочу.
137: И хочу создать объект, который будет создаваться асинхронно все-таки вот прям вот нету объекта. Я делаю что-то асинхронное, получаю объект и с ним работаю, как мы могли бы это сделать, потому что, ну в конструкторе синхронность нельзя сделать, естественно, как мы это можем
138: Можно обойти.
139: Есть ли у тебя какие-то идеи на этот счёт? Есть идея? Ну вот сразу, которая приходит в голову, это, типа, заприватить конструктор наш. Угу. Публичный, чтобы ты понял, мы не могли.
140: Создавать так а если только хотим асинхронно какой-нибудь статический метод фабрика я не знаю типа task так вот так вот таск, таск 3 и
141: Там, ну и тут мы уже творим, че хотим, асинхронное. Угу. А потом возвращаем, типа ретюрн, нью, там, 3.
142: Угу. Да, мы там как-то сами заполняем или мы заранее создаём и заполняем? Ну да, да. Либо сразу на сайте собесов точка. Да, да, в принципе, хватит гадать, что вас ждёт на интервью. Переходите и получите преимущество перед другими кандидатами прямо сейчас.
143: Окей, давай пойдём дальше.
144: Вот такая касочка последняя. Так, теперь я обращу внимание все-таки на название класса, а то начал писать метод, точнее, конструктор. В прошлый раз асинхрон это, конечно, сильно с моей стороны. Да ничего страшного. Так.
145: Сразу видно, что конструктор, как ты не видишь, результирующий тип, там, типа меньшее буквально слов. Ну вот, да, теперь видишь.
146: Так, лист создаём лист и max river.
147: X.
148: Ну, я.
149: Ну, у нас, получается будет 2 условия итоговых, это в промежутке, чтобы оно было больше, либо равно min, либо меньше Макс. И у нас мин 15.
150: Mary to list смотри, начнём мы выполнение только на моменте резалта вот тут вот, когда мы вызовем ту лист. Угу.
151: Ty list да, потом теперь осталось резал, точнее с каунтом определиться.
152: Так мы сначала добавим 10, 15, 20, потом мин переопределим.
153: Так получается, мин у нас.
154: Тоже переопределиться. Слушай, я вот на самом деле пытаюсь вспомнить, замкнётся ли у нас мин вот здесь и типа там будет десяточка или все-таки пятнашечка. В итоге, ну давай я замкнётся, то он в любом случае замкнётся. Вопрос.
155: По ссылке или по значению?
156: Так, ну там для лямбд.
157: Слушай, я честно затрудняюсь вспомнить.
158: Ну, то есть, понятное дело, тут подвох в том, что у нас, мы мин как бы переопределяем, и важно вот вспомнить момент. У нас тут будет деся, мы тут десяточку в итоге это будем использовать или пятнашечку. Ну, давай я скажу, что это будет пятна.
159: Что мы, что у нас изменение повлияет на и получается больше. Либо равно пятнашечке мы останется пятнашечка у нас, но меньше Макса это подходит пятнашка.
160: Деся 20 подходит тоже, потому что, а вот 30 уже не подходит и получается так.
161: 2.
162: Угу. Да, да, да, да, да. Угу. Супер. Я просто жду, чтоб ты, правильно ли. Ответ правильный. Угу. Не переживай насчёт того, что ты сомневался про мин. На самом деле, я вот
163: Пытаюсь вспомнить. По моему, я неправильно отвечал это на своём собеседовании, на похожем вопросе. По крайней мере, фактически это запоминается, как лямбды всегда пытаются взять по реку. Вопрос что?
164: Можно знать по рефу, это достаточно комплексный вопрос. Ну то есть по рефу это все-таки будет влиять вот это изменение 15, да? Ну как ты написал. Ну да, я понял. То есть он всегда пытается, как бы можно представить, что он создаёт структуру с рефом внутри.
165: Знаешь, как замыкание примерно выглядит. Угу. В реальности? То есть он же это все, если посмотреть, он там создаёт структуры, там, классы замыканий. Фактически это функция ещё дополнительными данными. Он именно берет по рефу эту пятнашку, поэтому это так происходит.
166: Это очень сложно воспринимать, потому что, во первых, ты не можешь её легко взять по рефу, структуру, создать в ней поле по рефу. Это достаточно сложное надопо моему то ли не делать или что-то такое нужно прям извратиться. Ну да, нестандартный код, это я точно помню.
167: Сейчас есть рестракт, вот рестракт х, можно так сделать. Это тоже, опять же, такой низкоуровневый шарп очень сильно. Вот все правильно. Если б ты ошибся в пятнашкой, я бы ничего даже не сказал. Ну, точнее, сказал бы, что я не прав, но это, в принципе,
168: Действительно, очень странное поведение. Тут главное помнить, видишь, да, и, в принципе, ну, во время дебага ты это заметишь, там, за, ну, опять же, смотри, если я тебе скажу, что это мин будет, да, а я не создал переменную, а пропети,
169: В другом классе по рефу она сможет взяться или нет? Ну, ты сказал, все будет пытаться по рефу, да? Ну, пропить. Это же на самом деле функция. Откуда у тебя, реф, от пропети уже нет данных у тебя? Ну да, вот.
170: Поэтому я говорю, это достаточно. Такая штука такая. И здесь можно ловить и ловить кого угодно, в том числе и меня. Но мы не будем сильно в это вдаваться. Смотри, так, следующее задание будет чуть другое. Техническим заданием. Все.
171: Ты перед собой видишь такой достаточно большой кусочек кода? Представим, что он в sport, каком-то приложении внутри зачем-то нужен. Это какая-то доменная логика или вспомогательная логика и что я тебя хочу? Я хочу услышать некий кодревью по мелочам.
172: Можно по стилистике, по всему остальному, но также я бы хотел услышать что-нибудь про что-то глобальное. То есть почему это нехорошо, допустим, так делать. В принципе, там, в общем, короче, на уровне архитектуры я бы тоже послушал.
173: Так, ещё подскажу это, что важно будет, это солит. Ну так вот, и тестируемость. Угу. Ну, то есть стараться по максимуму. То есть даже то, что нейминг вот класса какой-то странный через нижнее и мелочи, и
174: Меня интересует.
175: Так, ну я пойду сверху вниз, как минимум, вот это достаточно странно так называть класс в сишарпе не принято. Дальше хочу понять, что у нас метод делает это.
176: Какой-то der аналайз класс ну то есть мы анализируем
177: Файлы в директории достаём по только файлы, а не вижу не только файл, либо Логов.
178: Так, ну то есть в случае с лог файлами мы их типа очищаем в случае с
179: Если они больше какого-то порога, ну то есть здесь весят больше, чем вот у нас тут прописано если de меньше, то мы маркируем их какими-то проанализированными
180: Так, на тмп файл у нас другая логика мы его просто удаляем на txt 3 логика смотри, ну вот глобально я вижу какое-нибудь применение паттерна как, допустим стратегии где у нас
181: Под каждый extension ты понял файла будет своя какая-то реализация стратегии со своим алгоритмом, ну то есть зачем это держать все в 1 классе?
182: Угу. Ну вот смотри, допустим, мы назовём. Я понял, о чем ты говоришь. Не знаю, какой-нибудь интерфейс, типа i file, handler или i файл, не знаю. А, ну да, ага.
183: В принципе, по названию класса ты можешь описать примерно вот как могли бы мы сделать вот сюда его вставить, то есть реализовать, потому что их же будет много. Нужно как-то выбрать ещё нужную.
184: Ну, короче, примерно. Попробуй мне объяснить, как бы ты представляешь себе это чуть более глубоко, чем. Угу. Сейчас. Так, ну как ты сказал? Interface нас?
185: Будет на лазер.
186: Так, так, так.
187: Вообще, если мы будем писать, я тебе сразу скажу, мы будем дольше. Хорошо, я понял. Давай без кода, да? Ну, я постараюсь все на слух воспринять быстренько. Ага. Ну у нас в этом классе изначально он ничего не возвращает.
188: Аналайз, ну мы что, мы тут создадим таск, там аналайз, куда мы будем принимать какой-нибудь, вот как раз-таки инпут наш. Это я, как понимаю, путь.
189: Директории и какой-нибудь тоже интерфейс ай ай файл аналайз стратеджи что-то типа такого уже конкретно допустим вместе с файлом. Хотя нет
190: Ну да, и конкретно даже не так. Мы будем просто в аналайзер.
191: Смотри, на самом деле я много решений вижу, поэтому немножко сбиваюсь. Оптимальное, допустим, какой-нибудь
192: Ладно, давай пойдём вот так вот i аналайзер там factory мы создадим, которая будет нам отдавать экземпляры вот конкретных анализаторов так da понял, именно в неё мы.
193: Передадим наш файл. Ну, тут путь к нему он нам вернёт конкретного аналайзера, исходя из, допустим, того же исключения, а полюбит вас тайком. Расширение, расширение, да, и он нам вернёт какой-нибудь интерфейс.
194: I аналайзер как раз-таки, в котором уже будет метод аналайз, просто таск, и мы туда зашвырнёт, и у нас вот эти интерфейсы, ай аналайзер, будут скрывать там i лог файл аналайзер, ай темп файл.
195: Аналайзер ай тикси, точнее, реализация, ты понял? Да, я понял. Да, да, да, да. Угу. В принципе, я уже, в принципе, понял всю систему. Угу. То есть у нас будет некая фектори, да, этих аналайзером, и оно будет определять, типа,
196: Что? Ну да, да. А вот логика вот эта получается, которую мы в ифах держим и раздувается у нас она будет скрыта в конкретном классе аналайзера под свой, на самом деле, буквально 1 строчка внутри типа примени.
197: Нужны аналайзер, фактически не нужны, не нужны. Либо так, да, можно. Ну, что-то похожее, если я правильно понял? Ну да, по сути, будет в векторе. То есть, если, то, то это и логика всех аналайзером будет внутри.
198: Их? Ну да, получается так, окей, круто. На самом деле, мне нравится решение. Смотри, вот ты сказал, как-то вот будем подавать аналайзер. Ну, сейчас, наверное, уже фектори аналайзер прямо в метод. Как думаешь, это оптимальный вариант и
199: Или можешь что-то получше придумать?
200: Не, ну это ж я изначально к нему пришёл, а у нас в случае со 2 моим решением мы будем отдавать этот аналайзер, а на основе параметра как раз-таки нашего ну пути не, я имею ввиду вот в этом классе, не в factory классе, а вот здесь нам же нужно.
201: Получить откуда-то правильно? Его же нет здесь. А, ну это из по хорошему вообще получать. Это все из диая, чтобы он управлял вот этим всем созданием. Ну то есть если мы пишем
202: Какой-нибудь асп дотнет апи, то по хорошему использовать диай и оттуда все зависимости тянуть. Вот. Да, это на самом деле хотел услышать. Естественно, с этим связана проблема с тем, что класс, конечно, статический. Ну ладно, это не будем даже касаться.
203: Давай по остальному все здесь мне я доволен. Так, теперь по логике конкретно или какие ещё у нас остались, ещё есть много всяких моментов. И от стилистики до логики. Ну.
204: Стратегии и выбором аналайзером. Мне все понятно, я с ним все решили. Угу. Так, ну, нейминг подправил бы. Вот это. Ф, понятно, конечно, что вроде как файл. Ну, 4.
205: Буквы это не 12, знаешь, я б while назвал, как минимум, было бы понятней. Угу. Ну да, есть такое можно, если конкретно рассматривать этот класс. Ну вот мы абстрагируемся от того, что мы там напридумывали.
206: Заиспользовать какой-нибудь дикшенери, где у нас будет
207: Так, подожди, я вообще в ту сторону.
208: Если ты хочешь дикшн, который будет выбирать угу, наверное да, я понял, мы уже опять же, мы уже поняли, что оптимальное решение будет скорее всего. Ну да, factory, это будет действительно более правильно так, ну вот этот 65 535.
209: Я не помню, сколько это точно там байт, но вынести в какую-нибудь константу, назвать там Макс лок файл lang, чтоб не было просто как число магическое.
210: Можно комментарий добавить, сколько это в мегабайтах, допустим, ну, чтобы как-то воспринимать, а то воспринять 2 мегабайта там и 65535 байт это разные вещи.
211: Так, file write оо текст.
212: На самом деле, ну, можно асинхронщину использовать, потому что вот это все операции в white text, пентол, лайнс насколько я помню, есть асинхронные версии, а это у нас чистая ао работа, которая как раз-таки у нас подходит.
213: Под асинхронность ну то есть не Войт а task уже будем использовать и тут await await да да, верно.
214: Также смотри, давай кое-что подчеркну здесь. Вот смотри, мы используем во всех, в принципе, реализациях статический класс, файл. Угу. Ну и также в 1 реализации в логе мы ещё используем дейттайм, оба являются статическими классами фактически.
215: Угу. Кроме того, что несинхронные некоторые методы, которые могли быть синхронными, они ещё и статические. Как думаешь, что нам, почему это может нам мешать? Допустим, или это нам не будет никак мешать? Ну, смотри.
216: Time today нам точно будет мешать тестированию, потому что вот эта статика, её никак не мокнуть. Тудей будет зависеть от времени сервера, на котором происходят тесты, и то есть
217: Очевидно, не не детерминированное поведение и нам бы по хорошему вот эти datetime использовать какой-нибудь i дейттайм провайдер, ну, опять же принимать его в качестве зависимости как раз-таки для теста ну, чтоб мы могли протести.
218: Тестировать и в принципе все, чтоб мы могли тестировать.
219: Угу. Угу. Окей. Про дейттайм понятно. На самом деле, кстати, я знаю, что у сишарпа внутри он недоступен. Есть интерфейс айсистем тайм, который реализуется как раз. Угу. И, по моему, в 9 буквально ни реализацию и интерфейс.
220: Уже публично, че то там. Да, да, да. Тоже видел. Было такое. Угу. А вот что насчёт файлов как-то там сказал точно. А вот про файл, как бы, не знаю, сомневаешься? Ну, получа.
221: Для каких-нибудь файлов небольших вполне удобно использовать статический класс файл, хотя опять же для теста нам бы
222: По хорошему иметь какую-нибудь тоже дополнительную абстракцию, но с другой стороны, если мы работаем только с файлами
223: За файл я на самом деле сомневаюсь, но если раз на то пошло, то по хорошему для него хорошо иметь тоже какую-нибудь. Представь, как будет выглядеть юнитест.
224: Ну вот этот метод. Мне нужно создать целую папку в папках, потому что на самом деле с файлами, с разными расширениями, а потом запустить и спросить, типа, что произошло. Ну, получается, нам и директории нужно мокать, как, ну, не мокать, а ты
225: Понял. Абстракцию использовать тоже на директории, да?
226: Теории. Угу. Здесь, здесь говорим мы все-таки про оптимальный. Я понимаю, что если это, как я сказал, сразу представь, что этот проект, вот этот Пласт, точнее, он в большом проекте о проекте много строк. И как ты понимаешь, это типа не какой-нибудь там
227: Будет там, не знаю, диплом некий или курсовая чья то, да, здесь нельзя. По крайней мере, я считаю, да, возможно, ты, может быть не согласен. Ничего страшного. Я считаю, что нельзя сделать как бы как попало. Нужно сразу думать, а вдруг это все будет ещё?
228: Как я сказал, возможно, доменная логика, то есть, возможно, там будет 15 классов, точнее 15 экстеншенов, ещё что-то. То есть зачем-то мы это писали, соответственно.
229: Это очень сложно будет тестировать. И юнитест фактически превратится, превратится в интеграционный тест. Ну да, в таком случае, да, там юнитест фактически должен там занимать 5 строк типа подготовил. Ну, там подготовка может быть достаточно большой, но её можно
230: Есть обычно какие-то classic помогающие при тестах потом подготовка выполнил 1 действие сделал здесь получается что подготовка занимает долго ещё и долго, потому что это io ещё не синхронно да ну да, потом мы че то делаем с ним и потом начинаем ещё по всем.
231: Файлом рыскать. Опять же, вот как ты сказал, а мы же можем сделать мок. Представь, что мы сделали бы такой, мог на системы и му, буквально бы сказали, окей, типа, сделать какие-то файлы, проверь, что просто он вызвал вот эти вот white текст. Ф.
232: Строкой, типа, он мог, удалил, очистил. Окей, это же очень легко просто проверить. Ну да, намного проще, если конкретно юнит хотим писать уже не полноценный интеграционный
233: Полноценный восполнять был бы прям полноценный от и до в теории тогда с контроллера начинался.
234: Ну, там не все равно нужны, я не спорю, здесь просто желательно все-таки вот такой юнит 1 в кода покрывать именно юнитом, а то он юнит тест. Ну да.
235: Очень, очень быстро отвечаешь. Видимо, у нас даже время есть. Давай, если здесь какие-то ещё есть мелочи, которые ты заметил, вот мы не прошлись практически по 3 выбору. Стекст, там много кода такого запутанного, может, что
236: Ей сказать. Угу. Ну вот этот регекс точно, насколько я знаю, можно выносить в
237: Ну, получается, вот эти методы, парша, которые мы там генерейтед регекс, по моему, называется, и в отдельный метод выносим. Вот, вот это я понял, о чем ты говоришь. Да, да, да.
238: Вспоминает обычно да, можно так имел.
239: Дальше.
240: 2 форыча, все мы шлем, получается, имейлы всем, ну, тоже все можно, насколько я знаю, на синхронщине делать это, по сути, у нас тоже все.
241: А операции, которые по сети, отправка вот этого имейла, почему бы не какой-нибудь таск вено сделать, это будет и вот эти все там.
242: Письма отправить в рамках вот этого Тасканова.
243: Угу. Угу. Так, ну что ещё такого подметить? Может, ты чуть чуть направишь? Я, получается, за regex и за вот этот регекс мы, в принципе, уже, да, говорили.
244: Ну, там тоже самое, что с файлами, да, нужно использовать, если есть возможность, вот это, вот этот вот форич, внутренний, самый у него message, там создаётся клиент создаётся, и он создаётся на самом деле почти каждый раз. Это, вот это 1 вот такой момент.
245: Угу. Вижу да, про magic numbers. Здесь фактически мэджик стринг, скажем так, происходит. Точнее я бы даже сказал здесь все понятно со стрингами это какой-то gmail, сервер, но заметь, он, о, ну да, вынести в какие-нибудь, ну то есть получать.
246: Вот эти креды, как зависимости, либо как переменное окружение, либо через, ну, секреты, вот это, скорее всего, были, ну, какие-то, да, секреты, инвайн, переменные конфиги, понятно. Порт вот этот тоже были не заложены здесь.
247: И также на самом деле весь мейл в теории, если мы его переиспользовать можем, можно также выносить в server ой, сервис. Угу. Ну логику ты имеешь ввиду отправки мыла, да? Ну да, типа вдруг у нас не будет не мыла, потому
248: Может, какой-то даже абстрактный сделаем месседж. Сендер просто, да? Ну да, и там внутри уже конкретно. Угу. Вот. И смотри, подсвечу тебе вот последние строки с 59 по 62, вот этот форыч, который вызывает аналайзер. Вот обрати на них внимание.
249: Что ты об этом думаешь?
250: Мы для каждой директории, в рамках которой потом будем ещё каждые файлы вытаскивать, может, нам сразу
251: Передать все файлы и ну то есть пути к необходимым файлам.
252: Ну, ну, конкретно вот, ну, понятно, нейминг, тут, д, можно директория назвать это, ну, да, здесь фактически происходит, подскажу, чтобы логику сейчас не разбирать. Это рекурсия мы берём в этой директории, находим все файлы, а потом находим ещё
253: Директории и в ней начинаем делать тоже самое. Ну да, получается, на самом деле в пнёте, точнее дотнете самом системном сёке есть метод, который выдаёт тебе файлы все сразу. И рекурсия, я не знаю, какая там рекурсия внутри него
254: Там её нет. Ну, допустим, что мы про него не знаем, и у нас все-таки остаётся рекурсия, то есть не используем дополнительные методы. Как думаешь, ты мог бы вот этот метод превратить в нерекурсивный
255: Ну мы в while true какой-нибудь превратить, где мы будем бежать, вытаскивая все файлы из каждой директории.
256: Вообще как ты сказал, есть уже метод, который может нам вернуть все файлы рекурсивно там по моему просто параметр передать типа вот директории и нумере файлс и какой-то параметр ему пихаешь и он тебе все вот эти файлы рекурсивно вернее
257: Да, там я так сказал, есть. Мне просто интересно, можешь ли ты это сделать.
258: Если мы встречаем метод, я не знаю, насколько знаешь ты или нет, но вообще хоть это и сложно иногда, но любой рекурсивный метод в любом языке практически можно заме, ну ладно, в любом нефункциональном языке, да, можно в обычный цикл, типа можно сделат.
259: Обычный, да. Ну да, да, да. Императивный, в общем, его сделать без цикла, без рекурсии.
260: Ага, ну сейчас.
261: Получается.
262: В рамках директории.
263: Ну, как минимум мы в этом аналайзер пусть уже принимаем массив файлов, допустим, чтоб не в нём все. А вот сверху у нас как раз-таки логика будет вытаскивания вот этих всех файлов, но опять же, нужно где-то написать такую рекурсивную логику.
264: Ну, ну, представим, опять же, что метода, который выдаёт все сразу, нет, да, который есть такой метод, который буквально говоришь ему, вот директория, скажи мне файлы, потом скажи мне директории, там ещё начинаешь курсивно так узнавать их нам все равно придётся сверху написать, чтобы все
265: Файлы найти. Сначала мы не ушли, типа, от проблемы. Ну да, честно, затрудняюсь сказать. Ну, конечно, лучше использовать уже базовый, как бы, реализацию, которая, естественно, естественно, да. Я, более того скажу базовый, скорее всего, что не
266: Будет на уровне операционной системы, вызывает такое, что выдаёт ему сразу правильно? Ну да, никогда. Мы своё, чем самому сделать. Смотри, есть на самом деле такое простое решение. Можешь потом погуглить. Это фактически алгоритм там
267: Или дфс, в зависимости от того, что тебе больше нравится, ты создаёшь просто лист того, что файлов, который тебе нужно обработать. И как только ты, точнее, файлов или директорий, нужно обработать файл обрабатываешь, а директорию просто говоришь, окей, это директория.
268: Открой больше файлов и просто их записываешь в список, то есть некую очередь держишь просто банально. И фактически ты заменяешь этим всю рекурс, потому что фактически рекурс есть очередь. Просто обработай это, потом обработай это. Ну да, вот.
269: Соответственно, бфс или дфс будет решать, в каком порядке они обработаются. Если тебе это почему-то нужно, это 2 отдельных, да, алгоритма, какие-то они очень похожи. Это фактически алгоритм прохождения по дереву. Ага, ага, типа, по
270: Сначала все файлы, а потом все в директории, внутри это будет бфс. А если сначала говорю, в директорию, в директорию, в директорию файл, потом начинает потихоньку выходить вот этот, то есть он, он в глубину сначала уходит. Угу. А потом выходит, а бфс, он сначала все как бы слоями.
271: Идёт. Ну, погугли потом хорошо, обязательно.
272: Вот давай перейдём быстренько к sql, на нём сильно не будем застревать оо ну скажи, мы в итоге пришли к итогу, что лучше использовать уже решение готовое да, конечно все, все супер, ну опять же ты можешь встретить метод, которого нет готового реше.
273: Ну да, я понял. Я могу тебе просто сказать, вот тебе древесная структура какая-то, которую я только что придумал. Да, напиши мне для неё алгоритм. Угу. Ну, не будет готовый алгоритм. Ну да, да, ты прав.
274: Вот, смотри, небольшая табличка, небольшое задание. Я не думаю, что будем делать? Много их. Как у тебя вообще с фелем? В принципе, расскажи. Ну, смотри, основная работа, конечно, проходит через энтити фреймворк. Ну, я думаю, это отраслевой стандарт. Сейчас много где.
275: Встречал у меня на 2 проектах это было мы не, ну безусловно опыт взаимодействия с кэлем тоже есть, но не такой глубокий как с entity фреймворком тем же какие-нибудь сложные.
276: Аналитические запросы мог писать. Знаешь, че-нибудь то, что я не по селект, который вот здесь описан сейчас в задании. Сможешь написать? Так, ну я сейчас прочитаю вывести количество, подожди, 10.
277: Ага, good idea.
278: Так, ну у нас получается продажи. И напомни, гуд перевод это какой-то, это товар. Ага, товар, да, товар. Если хочешь, если ты думаешь, ты прям все понимаешь, можешь просто сказать, я быстрее пойму. Если хочешь, можешь написать.
279: Потому что можно запутаться в теории.
280: Ввести количество продаж товаров.
281: Так, ну мы точно будем использовать count функцию, нам же нужно количество. То есть, ну, задача подразумевает вывод 1 значения, количество
282: И получается, у нас будет селект каунт из
283: Продаж из сейлс. Ну, то есть селект, вот это count, from sales, получается и так
284: Условия у нас будет секунду, секунду. Мы с джойним их с
285: С Джоем иис.
286: Который, секундочку, сейчас, ой, ой, ой, ой, ввести количество продаж товара за 10, 10, 2000 десятые, который стоит количество продаж тебе не
287: Слышно, что у меня там сверлят или чуть, но ничего страшного. Ага. Получается сейлс.
288: Куда идти количество продаж товаров?
289: Так, ну мы будем точно is sales выбирать.
290: Товаров.
291: С джойним, с гудсами.
292: Джонни с гудсами. Сделаем условие по, чтобы гудсы были больше 10 и получается, сейлс у нас равнялся вот этой дате.
293: Угу. Ну, прайс гуд прайс больше 10. И, соответственно, да, да. E sale date больше. Да, да, да, вот это окей. Да, в принципе, верно. Думаю, сильно тебя не буду келем мучить больше.
294: Время у нас закончилось. Так, есть. Есть ли у тебя какие-то вопросы ко мне? Слушай, ну интересует, конечно, немножко конкретики про продукт. Там, может, стек, команда, как работаете? Ну, такая.
295: База, я думаю. Угу. Смотри. Так, давай начнём с про продукт. Во первых, 1 спрошу, это сколько у тебя времени есть свободного? Потому что у меня, в принципе, оно есть, но просто час у нас закончится. Не хочу тебя задерживать сильно.