Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Работа |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 .. 3 4 5 6 7 [8] 9 10 11 12 вперед Ctrl→ все |
Ржавый гвоздь Member Откуда: Сообщений: 132 |
Не, это уже слишком сложно ![]() |
||||
21 фев 21, 08:22 [22284342] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
ЛОЛ, я это запомню. У меня жена художник по образованию - буду её этим вопросом троллить ![]()
Уперся вам всем этот GetHashCode. Для структуры два варианта - либо он вообще не используется, либо он используется и тогда его все равно надо перегружать (чтобы избежать боксинга при вызовах). И в том и в другом случае то, как он перегружен в самом ValueType абсолютно пофиг. Знать это нужно разве что для прикола или чтобы щеки дуть перед кандидатами на интервью. И совсем другое дело это знать, как его перегрузить правильно, что, кстати, не имеет даже отношения к структурам, т.к. правила и для классов и для структур одинаковые. |
||||||||
21 фев 21, 08:26 [22284343] Ответить | Цитировать Сообщить модератору |
17-77 Member Откуда: Сообщений: 1493 |
сходу не смог ответить, не использовал ни структуры, ни hashset поэкспериментировал, погуглил и пришел к следующим выводам: 1. две структуры с одинаковым Id, но разным Name воспринимается как уникальная, т.е. ключ составной по всем полям и это скрыто под капотом 2. в доках, на стек оверфлоу, в блогах про два алгоритма расчета - быстрый и медленный. отсюда идет переопределение GetHashCode. вот статья с бенчмарками https://devblogs.microsoft.com/premier-developer/performance-implications-of-default-struct-equality-in-c 3. но вот именно тут возникает следующий момент - проблема то ни в hashset, ни в GetHashCode, а в голове программиста, который решает конкретную бизнес задачу. и проблема эта - неверно выбранный ключ я не использовал HashSet, я использую Dictionary - там явно указывается ключ, и я в 99% случаях использовал int и string, и еще в 1% guid. полагаясь на стандартные реализации GetHashCode и мало того - проблема неправильного ключа в Dictionary лежит на поверхности - он тупо выдаст эксепшн что я делаю в этих случаях? делаю еще одно поле/свойство string Key и пишу Key = $"{field1}|{field2}". как вариант я могу конечно переопределить GetHashCode - но 1. бывает, что конечный Key мне нужен и для других вещей (в лог там записать или еще чего) 2. и тут я погружаюсь в другую проблему - а как правильно переопределить GetHashCode ? все зависит от, вплоть до использования криптографической хэш функции, которая вполне тоже может быть медленной настолько, что Key = $"{field1}|{field2}" будет быстрее, но по-прежнему довольно надежно. все это требует исследований для каждого конкретного случая, на что обычно нет времени 3. я как-то находил сравнение производительности list и dictionary, до условных 10-50-100 элементов разницы нет (и это как раз положено в основу гибридных коллекций в C#). и теперь вопрос - если разница будет заметна на 1000-10000 элементов, то сначала эту 1000-10000 надо откуда-то достать и загрузить в память, хранилище там, в сети, ага, вспоминаем табличку великого гугло-программиста про задержки доступа и иногда мне надо такое: Dictionary<int, List<TModel>>, но это успешно заменяется LINQ GroupBy в итоге что получается - 80% проблем производительности решается правильным выбором ключа а остальные 20% - надо рассматривать каждый случай отдельно, там либо можно еще раза в два все ускорить (это со 130 до 50 наносекунд), либо попасть на задержку при обращении к жесткому диску/сети и тут мы снова возвращаемся к вопросу - какие это задачи, которые требуют явного переопределения GetHashCode ? причем довольно часто, чтобы помнить обо всех подводных камнях и сходу по ним отвечать на собесах Сообщение было отредактировано: 21 фев 21, 12:42 |
||||||||
21 фев 21, 12:44 [22284372] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 18991 |
А у ключа откуда берётся хеш, из космоса что-ли? ![]()
Dictionary из ключа берёт хеш. Откуда он его берёт? :) |
||||||||
21 фев 21, 13:16 [22284377] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 18991 |
Детский сад какой-то. Какие ещё щёки дуть? Нахер кому упало этим заниматься? Или по себе судишь? )) |
||||
21 фев 21, 13:18 [22284378] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 18991 |
Какая-то фобия в жёсткой форме насчёт наследования :) Но кроме того, что его "хейтят", "абьюзят" и ещё что-то в этом роде, ты так и не разу не сказал, чем же тебе так наследование не угодило. |
||||
21 фев 21, 13:21 [22284379] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 18991 |
Каждый день не надо, и никто не требует знать подробности в реализации в деталях. Но в чём проблема один раз узнать принцип, там что высшая математика или слишком сложно? Вообще не понимаю этой истерики. Чуть лишнего спросили -- в слёзы, собеседующий злой, издевается, наверняка самоутверждается за счёт бедных джунов... Ой-ой-ой... ![]() |
||||
21 фев 21, 13:25 [22284382] Ответить | Цитировать Сообщить модератору |
softwarer Member Откуда: 127.0.0.1 Сообщений: 64866 Блог |
О, да. Очень просто и наглядно - если воспринять это, не думая. Если же думать, то возникает вопрос: а заворачивать шурупы и отворачивать шурупы - это одна responsibility или разные? Может быть, нужна отдельно завёртка, отдельно отвёртка? И ведь в реале есть случаи, когда они действительно именно так и нужны. А молоток с гвоздодёром - нарушение этого принципа или хороший дизайн или и то, и другое одновременно? Лично я не возьмусь объяснить джуну - где кончается "одна" responsibility и начинаются "разные" так, чтобы он без меня уверенно и чётко принимал правильные решения. Это как в кулинарных рецептах - "варить до готовности" или там "посолить по вкусу", и хрен объяснишь, "это сколько в граммах?"
Во-первых, ты немного меняешь задачу. Нам ведь не нужно "программистское определение цикла for", нам нужно его реальное применение, то есть свойства. И здесь - если человек по памяти не скажет, что это число иррационально, что производная от "е в степени икс" равна "е в степени икс", а интеграл от "е в степени икс" снова равен "е в степени икс" (плюс константа ![]() Во-вторых, когда ты спрашиваешь про определение числа е, я сразу вспоминаю, как классе в девятом решал следующую задачу: "Допустим, у вас есть N чистых карточек, на каждой из которых Вы можете написать любую цифру. Какие цифры следует написать на карточках, чтобы с их помощью можно было представить любое число от 0 до M, где M - максимально?" Я начал считать, при каком основании системы счисления N разных цифр дадут наилучший результат, пришёл к уравнению xN/x => max и, решив его, сделал вывод, что наилучший результат дала бы система счисления с основанием е. Так что можешь считать, что я это определение сам вывел :) А в-третьих, насколько я помню, в математике у числа e просто нет какого-то особенного чеканного определения, поэтому дать его - по памяти или не по памяти - несколько затруднительно. Определений куча разных и они чисто конструктивные - типа "е это особенное число, которое можно получить вот таким способом, например, через второй замечательный предел, и как оказалось, оно обладает вот такими-то свойствами, делающими его крайне особенным". Сообщение было отредактировано: 21 фев 21, 13:22 |
||||||
21 фев 21, 13:28 [22284383] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 18991 |
Ну вот если бы хоть раз в жизни с этим сталкивались, то например знали бы, что есть какой-то метод Combine, который уже легко нагугливается: https://docs.microsoft.com/en-US/dotnet/api/system.hashcode.combine?view=dotnet-plat-ext-5.0 Знать на память всё -- не не требуется. Важно иметь понятия, принципы, знать про наличие определённых решений, которые можно использовать. Если вы их не знаете, либо тупо будете велосипеды городить, либо фигню какую-то делать. Но я вижу, вы много чего знаете, исследовали, и как бы это уже и не ваша проблема. В чём тогда смысл спора? ))) Сообщение было отредактировано: 21 фев 21, 13:35 |
||||
21 фев 21, 13:40 [22284386] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
Грустно. Структуры я еще могу понять - в энтерпрайзе, где все данные в БД оптимизация с помощью структур мало где имеет смысл (я так, сходу, могу придумать только одно применение - для хранения кешируемых данных), но HashSet это часто используемая штука.
А вот в том-то и дело, что нет. Если проверять эквивалентность по Equals, то он действительно выдаст false. А хешкод может быть как одинаковый так и разный, в зависимости от порядка полей.
Не обессудь, но это просто мегаговнокод.
Про это написано, описано, и расписано в стапятисот тысяч источников.
GetHashCode позволяет быстро проверить объекты на неэквивалентность (не гарантируя при этом обратное, т.е. их эквивалентность в случае отрицательного результата проверки). Т.е. если для двух объектов GetHashCode разный, то эти объекты гарантированно не эквивалентны. Но если он одинаковый, они могут быть как эквивалентны, так и нет, т.ч. требуется уже точное сравнение. Это, например, используется в классах Dictionary и HashSet чтобы раскладывать объекты по их "карманам"/"слотам". Отсюда еще вытекает одна такая тема, с которой, если не знать, то можно наступить на грабли - если экземпляр класса/структуры является ключом Dictionary или элементом в HashSet то мутировать её никаким способом нельзя, потому что если при этом изменится его hash code, то все просто станет работать неправильно. ЗЫ. Пора, по-моему, этот оффтоп тут заканчивать - здесь все-таки не раздел по .NET. |
||||||||||||||||||||
21 фев 21, 13:54 [22284390] Ответить | Цитировать Сообщить модератору |
softwarer Member Откуда: 127.0.0.1 Сообщений: 64866 Блог |
Ну то есть та же предметная область, как я и сказал. Всё правильно. Это логичный подход для аналитика, которым Вы являетесь, и куда более спорный - для разработчика.
Если бы он не хотел, он не пришёл бы на собеседование. Пример, конечно, не идеальный, как и любой пример из пары слов с минимумом информации, но иллюстрирует ключевую тенденцию. Первый из художников будет способен рисовать портреты на необходимом уровне на несколько лет раньше, чем второй.
Безусловно. Именно это всякий раз стоит помнить, когда соискатель настойчиво требует, чтобы его расспрашивали о проектах и участии в них. Хотя чего многие такие соискатели не понимают - что даже в подобном разговоре через слово себя выдают.
Вот с этим в программировании затруднения. "Картины" под NDA и вдобавок слишком масштабны для того, чтобы за время собеседования успеть бросить на них не самый поверхностный взгляд. Можно и часто нужно просить показать "пример кода", но не стоит слишком полагаться на увиденное. Помимо прочего, никто не гарантирует, что человек показывает именно свой код, а не код ведущего гуру, с которым он за время работы над проектом хорошо познакомился.
Да, в общем, не важно, в чём проблема. Важно то, что конкретные люди "не совпали", и как следствие, не смогут эффективно работать вместе.
Кстати, я почти уверен, что хороший кандидат ответит, что это зависит от того, в какой руке художник держит инструмент, а также от общей композиции картины. Это к вопросу о том, что не все глупо выглядящие вопросы таковыми являются.
По какому шаблону? Вы выше тоже нарисовали шаблон, по которому следует задавать вопросы. Какие выводы Вы из этого делаете?
Комплексы, комплексы. Если захотите - нагуглите здесь, на форуме, мой рассказ про собеседование, где мне задавали довольно дурные вопросы "по шаблону", а потом я через стенку услышал, как собеседовавший говорит гендиру: "Если по-хорошему, то его надо сажать в мой кабинет и давать ему мою зарплату". В целом весь этот пламенный абзац - рационализация страха отказа и соответствующего падения самооценки.
Я думаю, правильнее всего сказать так: "Тот опыт, который мы ищем, подразумевает знание GetHashCode на уровне таблицы умножения. Ваш замечательный опыт по запуску космических кораблей, при всём уважении - видимо, не то, что нам нужно". И - меня всегда удивляла уверенность некоторых людей, что именно их опыт нужен везде, и любой отказ - личное оскорбление. Мне вспоминается одна уборщица, которой программист при мне вежливо и деликатно сказал, что во время уборки она регулярно задевает шваброй розетку и вырубает компьютер. Уборщица в ответ устроила скандал в стиле, дословно, "Да я в ЦУПе работала, а тут какие-то засранцы будут мне указывать!" Вот очень похоже. |
||||||||||||||||||||||||||||||||||||
21 фев 21, 13:59 [22284394] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
Можно сточить шлицы под углом так, что обычной отверткой можно будет либо только закрутить, либо только открутить ![]()
Почему же. "Программистский" аналог "определения числа e" это, молжет быть, например, синтаксис цикла "for" - если чел его не знает, то, о каком применении можно говорить.
Определения есть, просто их далеко не одно. Как минимум, из того, что, покопавшись в памяти могу вспомнить, можно, действительно, через производную/интеграл, можно через сумму ряда, можно через предел. Точно знаю, что есть и другие способы, но их я уже точно без учебников или гугла вспомнить не смогу. |
||||||||||||
21 фев 21, 14:22 [22284400] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
Почему бы эти вопросы не дать в виде онлайнового теста, если так уж хочется. Это сэкономит время всем участникам и деньги собеседующим. Собеседование "с глазу на глаз" оно как раз чтобы "за жизнь" поговорить. К примеру, посмотреть как чел умеет рассуждать и решать практические проблемы. А отрывать от работы как минимум синьора, чтобы он только по бумажке готовые вопросы озвучил, а по другой бумажке ответы сверил это более чем нерационально. |
||||
21 фев 21, 15:02 [22284411] Ответить | Цитировать Сообщить модератору |
17-77 Member Откуда: Сообщений: 1493 |
у него и так есть стандартная реализация, в случае с int / string ничего переопределять не надо, а мы тут трем за переопределение и нет тут никакого спора - я просто хочу понять, почему я этого не знаю, точнее почему мне этого не потребовалось, потому как, если бы потребовалось - узнал бы
так я dictionary использую
ну вот, я и об этих граблях не знаю, потому что никогда так не делал, ключом всегда был int/string/guid равно как например lock(this) и прочие подобные штуки - это кстати меня всегда смущало на собесах. меня спрашивают почему не надо делать так, как я никогда не делал, а мне даже и ответить нечего
и как надо? переопределять GetHashCode и Equals? Сообщение было отредактировано: 21 фев 21, 15:08 |
||||||||||||||||
21 фев 21, 15:12 [22284415] Ответить | Цитировать Сообщить модератору |
Ares_ekb Member Откуда: Екатеринбург Сообщений: 1587 |
Я согласен с тем, что позиция "нужно разговаривать с человеком только о жизни и не задавать никаких технических вопросов" наверное слишком утрированная. Хотя, на мой взгляд, можно понять уровень кандидата и не проводя для него экзамен. Наверное не нужно бросаться в крайности. |
||||||||||||||||||||
21 фев 21, 16:29 [22284441] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
Лучше всего было бы договориться баш на баш - я им показываю кусок своего кода, а они мне кусок своего. А то регулярно как распишут как у них все круто, вопросы умнейшие позадают, а проект потом откроешь и там полный п. |
||||
21 фев 21, 16:46 [22284447] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
Ну так они именно для того и придуманы. Переопределять то, что считать одинаковым по умолчанию на то, что считать одинаковым по семантике. А для совсем хорошо можно еще переопределить операторы == и != и добавить интерфейс IEquatable. Если ты посмотришь в сам .NET, то большинство имеющихся в нем из коробки структур именно так и делают. Сообщение было отредактировано: 21 фев 21, 16:48 |
||||
21 фев 21, 16:54 [22284449] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
При большом желании можно вообще одними массивами обойтись. Только зачем, если есть более подходящие структуры данных. |
||||
21 фев 21, 17:01 [22284454] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
Тем, что зло. Тем, что абьюз. ![]() Если серьезно, то 1) Наследование, как субклассирование (отношение общее-частное) - добро и мастхев. Наследование, как замена композиции - зло и уг. А на деле намного чаще сталкиваешься именно не с первым случаем, а с последним. 2) Правильное наследование это, как я уже неоднократно писал штука намного более нетривиальная, чем просто написать "public class Foo: Bar". По этому поводу я полностью согласен с Рихтером, что наследовать можно только те классы, которые специально задизайнены для этого. Если нет, то делать sealed. Замена потом sealed на не-sealed в случае надобности не ломает совместимости, в отличие от обратной замены. Плюс можно получить некоторый выигрыш в производительности при вызове виртуальных методов - компилятор оптимизирует и виртуальные (т.е. override) методы в случае sealed вызываются как обычные без обращения к VMT. |
||||
21 фев 21, 18:03 [22284475] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4341 |
Да я так-то наоборот уже давно с этой "общественной работы" всегда пытался при возможности соскочить. |
||||
21 фев 21, 18:06 [22284477] Ответить | Цитировать Сообщить модератору |
love_bach Member Откуда: Сообщений: 751 |
А DTO наследовать? Что бы меньше копипастить, это к какому варианту? |
||||||||
21 фев 21, 18:54 [22284495] Ответить | Цитировать Сообщить модератору |
Slant-shadow Member Откуда: Сообщений: 391 |
Зачем тогда зовут? Если заранее известно, что скорее всего откажут |
||||||||||||||||||||||||||||||||||||||||
21 фев 21, 19:08 [22284501] Ответить | Цитировать Сообщить модератору |
Slant-shadow Member Откуда: Сообщений: 391 |
Плевать да, что человек время тратит на дорогу, деньги за проезд, нервы свои? |
||||
21 фев 21, 19:20 [22284509] Ответить | Цитировать Сообщить модератору |
Slant-shadow Member Откуда: Сообщений: 391 |
Я знаете как иногда делаю: когда непонятная контора зовет на собес., мне что-то в ней не нравится или по телефону разговор не понравился, я договариваюсь на попозже там на 19.00, 19.30 типо раньше не могу, так как работаю. А сам туда просто не приезжаю, и к телефону от них не подхожу ни в этот ни на следующий день =) |
21 фев 21, 19:27 [22284511] Ответить | Цитировать Сообщить модератору |
Дикий Билл Member Откуда: Сообщений: 9599 |
Не могу понять смысла. А почему просто не отказаться? |
||||
21 фев 21, 19:44 [22284522] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 .. 3 4 5 6 7 [8] 9 10 11 12 вперед Ctrl→ все |
Все форумы / Работа | ![]() |