|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt вопросы про наследование интерфейса структурой многих приводит в недоумение Все недоумения от интерфейсов, как я в другом месте уже говорил, просто результат неудачного термина, потому что "наследования" интерфейсов не существует, есть только "реализация". Это все приплыло, по-моему, из того языка-мутанта который с двумя крестами, где вообще не было полноценного синтаксиса для интерфейсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Это спека Какая там спека на GetHashCode. Единственная его спека это то, что для одного и того же экземпляра оно должно возвращать всегда одно и то же значение. Даже если ты напишешь где-нибудь: Код: c# 1.
то это совсем не хорошо, но небо на землю не упадет, и все, как ни странно, будет продолжать работать :)) У меня была умора во второй половине двухтысячных. Одни клоуны где-то прочитали, что, типа хранить пароли в plain text это плохо, над хранить хеши. И они тогда стали в БД в поле int сохранять password.GetHashCode() И все, причем, долгое время нормально работало. Но в один прекрасный день: "ахтунг-ахтунг, никто не может на сайт залогиниться" Оказалось, что они ночью перевезли эту веб-аппликуху на 64 бита. А GetHashCode() для строк на 32-битном и 64-битном фреймворках считаются по-разному. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 02:06 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt вопросы про наследование интерфейса структурой многих приводит в недоумение Все недоумения от интерфейсов, как я в другом месте уже говорил, просто результат неудачного термина, потому что "наследования" интерфейсов не существует, есть только "реализация". Это все приплыло, по-моему, из того языка-мутанта который с двумя крестами, где вообще не было полноценного синтаксиса для интерфейсов. Недоумение исключительно по не знанию и неграмотности. Наследование, так как это явно прописывается в определении типа. При чём может быть наследование, но без реализации. Два явно разных термина, абсолютно конкретных без какой-либо двусмысленности. fkthat Единственная его спека это то, что для одного и того же экземпляра оно должно возвращать всегда одно и то же значение. Ну вот касательно структур -- как раз таки нет. fkthat У меня была умора во второй половине двухтысячных. Одни клоуны где-то прочитали, что, типа хранить пароли в plain text это плохо, над хранить хеши. И они тогда стали в БД в поле int сохранять password.GetHashCode() И все, причем, долгое время нормально работало. Но в один прекрасный день: "ахтунг-ахтунг, никто не может на сайт залогиниться" Оказалось, что они ночью перевезли эту веб-аппликуху на 64 бита. А GetHashCode() для строк на 32-битном и 64-битном фреймворках считаются по-разному. Так об этом тоже явно прописано и в книжках писали 50 тыщ раз. Я же говорю. Долбанные практики, которые ничему учиться не хотят, всё методом тыка, StackOverflow-кодинг, потом делают круглые глаза и удивляются: а чтоооо это такоеее? А пооочему оооошибко? Матчасть нужно учить. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 10:11 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ну вот касательно структур -- как раз таки нет. Есть только дефолтная реализация для ValueType которая для копии структуры всегда вернет то же значение что у оригинала, что вполне логично и ожидаемо. Но никто тебе не запрещает перегрузить её своей, пока ты следуешь правилу "одинаковые объекты -> одинаковый хешкод" (наоборот совершенно необязательно). Можешь тот же 0 всегда возвращать :)) hVostt Так об этом тоже явно прописано и в книжках писали 50 тыщ раз. Ну я, например, об этом не знал. Да и не узнал бы, если бы не тот случай - мне достаточно знания того, что GetHashCode вообще никакого отношения к криптографическому хешу не имеет :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 11:37 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt StackOverflow-кодинг Это все же лучше, чем вообще свои собственные выдумки :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 12:56 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Это все же лучше, чем вообще свои собственные выдумки :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 13:10 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Наследование, так как это явно прописывается в определении типа. Наследование нафиг. Я бы его вообще запретил Рихтер вот что пишет: CLR via C# 4th EditionFirst, when defining a new type, compilers should make the class sealed by default so that the class cannot be used as a base class. Instead, many compilers, including C#, default to unsealed classes and allow the programmer to explicitly mark a class as sealed by using the sealed keyword. Obviously, it is too late now, but I think that today’s compilers have chosen the wrong default and it would be nice if this could change with future compilers. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 13:37 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Так об этом тоже явно прописано и в книжках писали 50 тыщ раз. Ну я, например, об этом не знал. Да и не узнал бы, если бы не тот случай - мне достаточно знания того, что GetHashCode вообще никакого отношения к криптографическому хешу не имеет :)) Ну как, если будешь структуру в качестве ключа словаря использовать, эти знания тебе понадобятся. Это, кстати, давно известная оптимизация для комплексного ключа в памяти. Мне это много когда пригодилось, другое дело если программист дальше прикладного уровня не ходит, то и не пригодится... fkthat hVostt StackOverflow-кодинг Это все же лучше, чем вообще свои собственные выдумки :)) А там сам бог ответы пишет? Те же выдумки, только чужие. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 15:39 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Наследование, так как это явно прописывается в определении типа. Наследование нафиг. Я бы его вообще запретил Рихтер вот что пишет: CLR via C# 4th EditionFirst, when defining a new type, compilers should make the class sealed by default so that the class cannot be used as a base class. Instead, many compilers, including C#, default to unsealed classes and allow the programmer to explicitly mark a class as sealed by using the sealed keyword. Obviously, it is too late now, but I think that today’s compilers have chosen the wrong default and it would be nice if this could change with future compilers. Ну с наследованием такая тема. Если ты имеешь отношение к проектированию архитектуры, написанию платформы и core проекта, то наследование это очень крутая штука и мощнейший инструмент, который даёт колоссальный профит. В неумелых руках прикладника и джуна, наследование это конечно боль и негодование "нахера оно нужно!??" ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 15:41 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Рихтер вот что пишет: Хотя с Рихтером я когда-то был согласен, типа делать sealed по умолчанию. Сейчас -- нет. Не согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 15:42 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt В неумелых руках Вреда от наследования в рукожопах на порядок больше, чем пользы от него в руках умелых. И, правильно, на самом деле hVostt нахера оно нужно Особо люто выбешивает создание в проекте класса типа WebApiMvcWebFormsBaseController и напихание туда гималайской горы всякого гамна типа "GetCurrentUserName", "IsCurrentUserVasja", "ValidateUserSnilsInnOgrnPhoneAndEmail" и т.п. Или, например, такой чудесный класс в модели EF, типа Код: c# 1. 2. 3. 4.
Бесит, аж кушать не могу... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:14 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat создание в проекте класса типа WebApiMvcWebFormsBaseController Но самая жесть жести при этом когда какому-нибудь дровосеку сервис ILoveThisService понадобился аж в целых двух контроллерах и он, помня о бестипрактисе ДИ добавляет его в конструктор этого чудища архитектуры. И похрен то, что в остальных полюдюжине дюжин контроллеров этот сервис никому начлен не вперся. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:23 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt В неумелых руках Вреда от наследования в рукожопах на порядок больше, чем пользы от него в руках умелых. И, правильно, на самом деле Да нет там вреда, прикладники в наследование даже не лезут. Слишком сложно. fkthat единственное нормальное его применение, что в голову приходит это паттерн "фабричный/шаблонный метод" - без них вполне можно обойтись просто инжекцией нужной абстракции (по сути заменяя наследование композицией по заветам GoF). Не буду комментировать, применений конечно на пару порядков больше, но это очевидно для опытных разработчиков :) fkthat Особо люто выбешивает создание в проекте класса типа WebApiMvcWebFormsBaseController и напихание туда гималайской горы всякого гамна типа "GetCurrentUserName", "IsCurrentUserVasja", "ValidateUserSnilsInnOgrnPhoneAndEmail" и т.п. Или, например, такой чудесный класс в модели EF, типа Код: c# 1. 2. 3. 4.
Бесит, аж кушать не могу... А что не так? Очень часто встречающееся решение (вариации), значит хорошо работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:47 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat fkthat создание в проекте класса типа WebApiMvcWebFormsBaseController Но самая жесть жести при этом когда какому-нибудь дровосеку сервис ILoveThisService понадобился аж в целых двух контроллерах и он, помня о бестипрактисе ДИ добавляет его в конструктор этого чудища архитектуры. И похрен то, что в остальных полюдюжине дюжин контроллеров этот сервис никому начлен не вперся. Если в двух контроллерах используется этот сервис, почему его нельзя добавить в конструктор этих контроллеров? Где затык? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 17:48 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt А что не так? Уже хотя бы то, что это усложнение без всякой пользы. Когда ума нет что-то действительно полезное сделать, то начинается вот такое изобретательство всяких бессмысленных прослоек, расширений и базовых классов. Я когда-то видел проект, где какие-то долбоящеры написали больше полусотни своих методов-расширений к классам string и object. Хочешь верь, хочешь нет, но там даже был метод Код: c# 1. 2. 3. 4.
И все эти BaseEntityWithId из той же цыганской ярмарки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:02 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Где затык? ) Так это не ко мне вопрос, а к творцам таких шедевров. Наверное, типа, целых две строчки кода повторяются целых два раза - надо срочно решение этому искать, а то еще, не ровен час вдруг в третьем месте потом их придется повторить ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:08 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Уже хотя бы то, что это усложнение без всякой пользы. Когда ума нет что-то действительно полезное сделать, Наоборот упрощение. Если у тебя +100500 сущностей и у всех есть поле Id, то разумно сделать базовый класс и не дублировать одно и то же. Польза есть и очень большая. fkthat Когда ума нет что-то действительно полезное сделать, то начинается вот такое изобретательство всяких бессмысленных прослоек, расширений и базовых классов. Я когда-то видел проект, где какие-то долбоящеры написали больше полусотни своих методов-расширений к классам string и object. Хочешь верь, хочешь нет, но там даже был метод Код: c# 1. 2. 3. 4.
Ну именно это конечно бессмысленно. Но большиство расширений для того же string -- полезны. А всё потому, что изначально многие методы не должны быть экземплярными, из-за них много NRE ошибок происходит. fkthat И все эти BaseEntityWithId из той же цыганской ярмарки. Похоже тут пахнет неприкрытой вкусовщиной ) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:49 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Где затык? ) Так это не ко мне вопрос, а к творцам таких шедевров. Наверное, типа, целых две строчки кода повторяются целых два раза - надо срочно решение этому искать, а то еще, не ровен час вдруг в третьем месте потом их придется повторить Собственно одна из задач наследования -- борьба с избыточностью. Главное, без фанатизма. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 18:50 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Собственно одна из задач наследования -- борьба с избыточностью. Из всех мыслимых способов переиспользования кода наследование это самый кривой и ущербный. Да и вот контрпример: квадрат это частный случай прямоугольника (те в терминах ОО его наследник), но для прямоугольника тебе надо хранить и ширину и высоту отдельно, а для квадрата они всегда одинаковые, поэтому хочешь-не хочешь, но придется наоборот делать избыточность. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 19:27 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Собственно одна из задач наследования -- борьба с избыточностью. Из всех мыслимых способов переиспользования кода наследование это самый кривой и ущербный. Да и вот контрпример: квадрат это частный случай прямоугольника (те в терминах ОО его наследник), но для прямоугольника тебе надо хранить и ширину и высоту отдельно, а для квадрата они всегда одинаковые, поэтому хочешь-не хочешь, но придется наоборот делать избыточность. Довольно нелепые домыслы. И довольно неуместный пример. В терминах ОО квадрат не наследник прямоугольника, квадрат и есть прямоугольник, у которого одинаковая длина сторон. Где, собственно, ты вообще видел в UI объект типа Square? Rectangle -- пожалуйста. Короче, уверен у тебя наверняка есть печальный травматический опыт, но к объективной реальности это имеет мало отношения. Порезался бумагой -- бумага злющее зло, запретить, сжечь! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 20:20 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt квадрат и есть прямоугольник, Чистое наследование. Любой кот есть животное, любая вилка есть столовый прибор, а любой квадрат есть прямоугольник. hVostt Где, собственно, ты вообще видел в UI объект типа Square Я привел просто как пример усиления инвариантов в подклассе. А усиление инварианта уже означает, что у тебя код из базового класса может быть некорректным в производном. Кстати, насчет котов и животных очень показательна в какое гамно выстраивание всяких иеархий наследований может завести. Таксономия в биологии зародилась еще в начале 19 века, и все поначалу было хорошо, красивая иеархия и т.п. но потом начинают появлятся всякие чупакабры и прочие грибы-кенгуры, которых либо вообще хрен его знает куда впихнуть, либо впихивать сразу в дюжину мест. Вот та же самая херь и с наследованием. Понастроил себе классов, сидишь и любуешься как художник на свою картину, а тут раз, и появляется какая-то хрень, которая тебе все ломает куда ты её ни впихивай. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 21:52 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt квадрат и есть прямоугольник, Чистое наследование. Любой кот есть животное, любая вилка есть столовый прибор, а любой квадрат есть прямоугольник. Нет, если ты так искренне считаешь, значит наследование не понимаешь в принципе. Путать таксономию с наследованием -- это заблуждение древних первопроходцев, можно найти массу таких примеров в пожелтевших книжках по программированию. fkthat Я привел просто как пример усиления инвариантов в подклассе. А усиление инварианта уже означает, что у тебя код из базового класса может быть некорректным в производном. Это максимально далёкий от наследования в ООП пример. Что общего у вороны и письменного стола? fkthat Кстати, насчет котов и животных очень показательна в какое гамно выстраивание всяких иеархий наследований может завести. Таксономия в биологии зародилась еще в начале 19 века, и все поначалу было хорошо, красивая иеархия и т.п. но потом начинают появлятся всякие чупакабры и прочие грибы-кенгуры, которых либо вообще хрен его знает куда впихнуть, либо впихивать сразу в дюжину мест. Вот та же самая херь и с наследованием. Понастроил себе классов, сидишь и любуешься как художник на свою картину, а тут раз, и появляется какая-то хрень, которая тебе все ломает куда ты её ни впихивай. Отражать объекты реального мира в иерархии наследования классов -- одно из величайших заблуждений, из-за которого потом столько нытья и соплей в интернетах, дескать ООП не работает :) Для примеров нужно брать программные задачи, а не коты, собаки, круги и прочие глупости. Насчёт "ломает". Это либо архитектор не опытный, или не далёкий. Либо изначальные теории не подтвердились на практике. Именно поэтому появляются новые решения, новые библиотеки и ПО. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 23:16 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat, Давай лучше реальные примеры рассматривать. Где плохо? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 23:18 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Где плохо? В том же твоем любимом Stream Но, конечно, ты сейчас скажешь, что это просто из-за того, что его рукожопы делали ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 23:22 |
|
|
start [/forum/topic.php?fid=18&msg=40026171&tid=1354589]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 268ms |
total: | 415ms |
0 / 0 |