|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
значит ли это что память переменной d не будет освобождена? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 16:36 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
и не понимаю зачем чз tmp сделано, все равно же finaly выполнится ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 16:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
listtoview и не понимаю зачем чз tmp сделано, все равно же finaly выполнится Написано же в комментарии listtoview память переменной d не будет освобождена? Как это она может быть не освобождена, если это структура? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 17:10 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
listtoview Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Потому что в блоке using произошёл boxing, и копия структуры залезла в кучу. В переменной d ничего, понятное дело, не поменялось. listtoview значит ли это что память переменной d не будет освобождена? Dispose не производит очистку памяти. Это просто метод с гарантией вызова при выходе из блока using. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 17:51 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Потому что в блоке using произошёл boxing, и копия структуры залезла в кучу. Там нет боксинга. Просто внутри блока юзинг используется не сама структура, а её копия - вот оттуда и "странный" результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:29 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat, Хм. И правда, боксинга нет, но это оптимизация компилятора. Правильно считать, то боксинг есть, ибо он тут по всем правилам быть должен. Соответственно поведение такое же, как если бы боксинг был. ((IDisposable)d).Dispose() -- эта хреновина однозначно приведёт к boxing структуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 18:52 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Хм. И правда, боксинга нет, но это оптимизация компилятора. Это не совсем оптимизация. В IL есть ньюанс, что если виртуальный метод (из object) или метод интерфейса объявлены в самой структуре, то боксинга при их вызове не происходит. Очень, кстати, важная тема, потому что если методы object не переопределять в структуре, то можно получить боксинг там, где его совсем не ждешь (например, если у тебя структура это key в Dictionary<>, или элемент в HashSet<>). Кое-что детально можно найти погуглив про инструкцию IL "constrained". ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 19:27 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Это не совсем оптимизация. В IL есть ньюанс, что если виртуальный метод (из object) или метод интерфейса объявлены в самой структуре, то боксинга при их вызове не происходит. Только в том случае, когда ты напрямую дёргаешь метод структуры, а не интерфейса. using работает с интерфейсом IDisposable и про твою структуру ничего не знает. Соответственно, должен быть boxing, так как требуется приведение к IDisposable. Однако боксинга не происходит, это и есть оптимизация компилятора. Ноги у оптимизации растут из реализации IEnumerator для списков , которые являются структурами, чтобы не кушать память при foreach. fkthat Кое-что детально можно найти погуглив про инструкцию IL "constrained". Если ты заменишь using на C# код, в который using разворачивается (try/finally), ты увидишь boxing. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 06:12 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Сначала я видел этот вопрос на хабрец , но потом было интересно увидеть продолжение того как Сегрей Тепляков распедалил эту статью антихабрец ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 09:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Коллеги, зачем введена переменная tmp? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 09:54 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
listtoview Коллеги, зачем введена переменная tmp? Это копия, чтобы гарантировать неизменность ссылки / значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:05 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
vb_sub Сначала я видел этот вопрос на хабрец , но потом было интересно увидеть продолжение того как Сегрей Тепляков распедалил эту статью антихабрец Да ничего он особо там не "распедалил" и толком ничего не пояснил. Характерен только странный наезд, типа лезете внуть дотнета ай-яй-яй! Вопросы плохие задаёте! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:10 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Только в том случае, когда ты напрямую дёргаешь метод структуры, а не интерфейса. Вот, за интерфейс (особенно в случае с using) я действительно не уверен. Но в случае виртуального метода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Код: il 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Обрати внимание, что вызов один и тот же (строки 0012-0018 и 0020-0026), но, если верить талмуду, то боксинг, благодаря инструкции "constrained." будет только во втором случае. Я вот только в душе не знаю, как это реально проверить - вчера еще что-то об этом заморочился, но "правильного" способа так в голову и не пришло. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:29 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat как это реально проверить Проверить, что в первом случае боксинга нет легко, но, вот, как убедиться, что он есть во втором случае - это вообще без понятия. Вызвать, что ли, ToString() стопятьсот раз и посмотреть потом, что там в куче лежит после этого, пока мусорщик еще её не уконрапупил - других идей у меня пока что нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 12:38 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt listtoview Коллеги, зачем введена переменная tmp? Это копия, чтобы гарантировать неизменность ссылки / значения. да, это я понимаю наверное лучше noLock заюзать ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 14:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat fkthat как это реально проверить Проверить, что в первом случае боксинга нет легко, но, вот, как убедиться, что он есть во втором случае - это вообще без понятия. Вызвать, что ли, ToString() стопятьсот раз и посмотреть потом, что там в куче лежит после этого, пока мусорщик еще её не уконрапупил - других идей у меня пока что нет. Вот такая тула есть, но я не пробовал :) https://www.codeproject.com/Articles/290247/BoxCop-Static-Assembly-Analyzer-tool ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 15:45 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Вот такая тула есть, но я не пробовал :) У этого индуса в профиле написано: "A .net developer since 4+ years". Очешуеть, я говорить-то только лет после 3 начал, а люди в 4 уже на дотнет пишут. Вот такой примитивнейший тестик: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
А теперь комментим перегрузку ToString() Код: c# 1.
Сразу видна разница, и видно, как эта разница с каждой итерацией растет. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 16:24 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Вот такой примитивнейший тестик: А, кстати, добавил IDisposable и заменил foo.ToString() на using(foo) {} и роста кучи нет, как и в первом случае (с перегрузкой ToString). Т.ч. походу using тоже боксинг не вызывает, как сначала и ожидалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 16:33 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat fkthat Вот такой примитивнейший тестик: А, кстати, добавил IDisposable и заменил foo.ToString() на using(foo) {} и роста кучи нет, как и в первом случае (с перегрузкой ToString). Т.ч. походу using тоже боксинг не вызывает, как сначала и ожидалось. Ну да, утиная оптимизация ) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 17:08 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ну да, утиная оптимизация ) Вот тут несколько объясняется как это происходит: https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.opcodes.constrained?view=net-5.0 When a callvirt method instruction has been prefixed by constrained thisType, the instruction is executed as follows: If thisType is a value type and thisType implements method then ptr is passed unmodified as the 'this' pointer to a call method instruction, for the implementation of method by thisType. If thisType is a value type and thisType does not implement method then ptr is dereferenced, boxed , and passed as the 'this' pointer to the callvirt method instruction. Т.е., если в IL такое: Код: il 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 18:43 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat и у Foo есть своя реализация ToString, то CLR превращает callvirt в обычный call без боксинга. И не выполняет виртуальный вызов. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 23:25 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt, Единственное практическое применение, которое я вижу всей этой тряхомудии, это задрочить, унизить, и опустить кого-нибудь на собеседовании ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 00:59 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt, Единственное практическое применение, которое я вижу всей этой тряхомудии, это задрочить, унизить, и опустить кого-нибудь на собеседовании Вовсе нет. Честно говоря, вопросы про наследование интерфейса структурой многих приводит в недоумение. Этот вопрос хороший в нет плане, что ты ожидаешь правильный ответ, но можешь проследить логику размышлений. Один из 20 человек может ответить на вопрос, чем отличается реализация GetHashCode() у классов и структур, так что -- это типа тоже унижение? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:11 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt чем отличается реализация GetHashCode() у классов и структур В смысле - дефолтная реализация? Я и сам не знаю - это надо исходники дотнета изучать Но, в чем будет разница с практической точки зрения, это я знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:34 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt чем отличается реализация GetHashCode() у классов и структур В смысле - дефолтная реализация? Я и сам не знаю - это надо исходники дотнета изучать Но, в чем будет разница с практической точки зрения, это я знаю. Зачем исходники дотнета? Это спека, вопрос же в принципиальном отличии, это довольно практический вопрос, а не какие-то там тонкие ньюансы для гуру. Можно поговорить о том как работает GetHashCode() для классов, в контексте строения экземпляра класса в памяти, но мало с кем до этого вообще доходит :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 01:42 |
|
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 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Что общего у вороны и письменного стола? Если мы, например, делаем специальный склад для хранения дохлых ворон и письменных столов, то в контексте этого склада у них может быть очень много общего. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 23:33 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Где плохо? В том же твоем любимом Stream Но, конечно, ты сейчас скажешь, что это просто из-за того, что его рукожопы делали Ну так наследование здесь при чём? Оно как раз позволяет работать максимально рукожопому контракту. Т.е. благодаря наследованию эта хреновина едет :) Может есть какой-то из собственной практики пример? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 00:08 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Нет, если ты так искренне считаешь, значит наследование не понимаешь в принципе. Значит я в хорошей компании https://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков Саттер и Александреску в своём руководстве по использованию C++ для выражения этого принципа также используют фразу «подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс». По мнению данных авторов, публичное наследование в C++ можно употреблять только тогда, когда оно удовлетворяет принципу Лисков. Приватное наследование, по их же мнению, дозволено использовать для доступа к protected части базы и перекрытия виртуальных методов. В любом же ином случае, то есть для всего лишь повторного использования кода из базы, наследование применять нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 00:13 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ну так наследование здесь при чём? При том, что если бы вместо одного здоровенного базового класса его API грамотно раскидали бы по интерфейсам, то его реализации не напоминали бы хоспинс для калек - у одного нога не гнется, у другого рука не разгибается, а третий глухослепой ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 00:24 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Значит я в хорошей компании https://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков Саттер и Александреску в своём руководстве по использованию C++ для выражения этого принципа также используют фразу «подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс». По мнению данных авторов, публичное наследование в C++ можно употреблять только тогда, когда оно удовлетворяет принципу Лисков. Приватное наследование, по их же мнению, дозволено использовать для доступа к protected части базы и перекрытия виртуальных методов. В любом же ином случае, то есть для всего лишь повторного использования кода из базы, наследование применять нельзя. Ты сам себе противоречишь. Разумеется LSP должен соблюдаться, и желательно следовать определённым принципам, но нигде ни слова не сказано, что наследование это плохо. Откуда ноги растут у выражения "предпочтите агрегацию наследованию"? Как раз из-за вброса в массы неправильных трактовок. Эти трактовки до сих пор прослеживаются, даже у тебя. Начинаешь приводить примеры объектов реального мира, натягивая на них программные интерфейсы. Возможно терминология этому сопутствовала. fkthat При том, что если бы вместо одного здоровенного базового класса его API грамотно раскидали бы по интерфейсам, то его реализации не напоминали бы хоспинс для калек - у одного нога не гнется, у другого рука не разгибается, а третий глухослепой Нет, так это не работает. Ты можешь выразить интерфейсом минимальный контракт и реализовать несколько. Но ожидать конкретный набор интерфейсов -- не можешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 00:52 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Если у тебя +100500 сущностей и у всех есть поле Id, то разумно сделать базовый класс и не дублировать одно и то же. 1) Дублирование одного поля заменяем дублированием объявления наследования. Еще и с тем геммором, что если я вижу в каком-то незнакомом классе свойство, то я вижу свойство, а если я вижу какой-то неизветсный мне базовый класс, то мне еще придется полезть и посмотреть, что это за херь такая. 2) Я неожиданно обнаруживаю, что в каком-то единственном классе мне надо поменять поведение свойства Id (допустим, не дать туда писать числа которые не делятся на десять). Попадос. 3) Я очень даже всеми тремя руками за то, чтобы использовать наследование в моделях данных ORM, но я все время вижу, как творческие творцы творят полдюжины совершенно несвязанных полностью разных сущностей для какой-нибудь, допустим, полудюжины разных типов контрагентов, но зато пихают в модель всевозможную базовую херь наподобии EntityWitrhId, EntityCanBeDeleted, и EntityWithCreationDate. Оно и понятно, как я уже и говорил. Чтобы понять что есть общего, а что есть разного, допустим, у контрагента-юрлица и контрагента-физлица это нужны уже какие-то зачатки мышления и анализа, а чтобы написать какой-нибудь EntityWithIdCreationDateAndCanBeFukkingDeleted который в три строки кода, для этого достаточно прочитать книгу "Освой EntityFramework за четыре туалета по-большому". hVostt Но большиство расширений для того же string -- полезны. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 01:03 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Если у тебя +100500 сущностей и у всех есть поле Id, то разумно сделать базовый класс и не дублировать одно и то же. 1) Дублирование одного поля заменяем дублированием объявления наследования. Еще и с тем геммором, что если я вижу в каком-то незнакомом классе свойство, то я вижу свойство, а если я вижу какой-то неизветсный мне базовый класс, то мне еще придется полезть и посмотреть, что это за херь такая. Дело не только в этом. Теперь можно принимать базовый тип сущности и работать с идентификатором. Много чего можно делать. fkthat 2) Я неожиданно обнаруживаю, что в каком-то единственном классе мне надо поменять поведение свойства Id (допустим, не дать туда писать числа которые не делятся на десять). Попадос. К наследованию это не имеет отношения. Это может случиться где угодно. Например, ты возвращал IEnumerable из функции. И вдруг в одном случае тебе понадобилось получать число :) fkthat 3) Я очень даже всеми тремя руками за то, чтобы использовать наследование в моделях данных ORM, но я все время вижу, как творческие творцы творят полдюжины совершенно несвязанных полностью разных сущностей для какой-нибудь, допустим, полудюжины разных типов контрагентов, но зато пихают в модель всевозможную базовую херь наподобии EntityWitrhId, EntityCanBeDeleted, и EntityWithCreationDate. Оно и понятно, как я уже и говорил. Чтобы понять что есть общего, а что есть разного, допустим, у контрагента-юрлица и контрагента-физлица это нужны уже какие-то зачатки мышления и анализа, а чтобы написать какой-нибудь EntityWithIdCreationDateAndCanBeFukkingDeleted который в три строки кода, для этого достаточно прочитать книгу "Освой EntityFramework за четыре туалета по-большому". К сожалению, всегда будет грязновато. Не важно ООП это, чистое ФП, или ещё что. Проблема в том, что сам мир не идеален, и задача проходит через мозг разработчиков, изрядно искажаясь по фактуре. Поэтому потом что бы ты не делал -- всё равно получится говнокод. Никто и ничто тебя не спасёт. Ни Барбара Лисков, ни Эрик Липман, ни Рихтер, никто :) Если я правильно понял, ведь твой посыл именно в этом. Не красиво, не очень, грязно. Ну всё так. Ты причины не там ищешь просто :) fkthat hVostt Но большиство расширений для того же string -- полезны. Ну почему же. Сравни: string.IsNullOrEmpty(myString) vs myString.IsEmty() проблема в том, что они не стандартизованы, называются и работают по-разному в проектах. это фигово. но в целом, в рамках большого проекта они так или иначе создаются, потому что люди хотят облегчить себе жизнь. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 01:26 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat, Насчёт дублирования кода. Не только сам код, но и весь обвес: 1. Комментарии, документация 2. Тесты 3. Расширения и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 01:27 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Но ожидать конкретный набор интерфейсов -- не можешь. В совершенно произвольном случае, когда незнамо откуда прилетело незнамо что, да это невозможно. Но, я могу запросить нужный интерфейс приведением от одного интерфейса к другому, проверить на null и если ок, то уже делать с ним то что надо. Аналогия с COM - когда тебе нужен какой-то API компонента ты явно запрашиваешь именно этот API. А не получаешь один гигантский API, где стопятьсяот методов из которых только три работают, а сточетырестадевяностосемь возвращают "NotSupported". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 01:32 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt myString.IsEmty() Я напишу просто в коде myString == "" и над моим кодом никто не будет дрочить себе мозг. А про myString.IsEmty() я уже сразу мозг вздрочнул, например, тем, что если myString это null, то кинет ли он ексепшен или вернет false, или его вовсе кто-то написал просто не зная, что есть готовый IsNullOrEmpty и он вернет мне true. Кстати, в шарп-9 новая бомба-фича :)) Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 01:53 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Или можно даже так: Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 02:25 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Я напишу просто в коде myString == "" и над моим кодом никто не будет дрочить себе мозг. (myString ?? "") == "" или (myString ?? "").Length == 0 Но да, с этим согласен, такой код хоть и страшненький, но лучше читается, чем чужие неведомые расширения. Однако в рамках большого проекта и команды, никакой трагедии в расширениях нет. Всё с этим ок, не нужно драматизировать :) fkthat Кстати, в шарп-9 новая бомба-фича :)) Код: c# 1. 2.
Да как сказать... в свиче да, как рядовое использование пока не видится особого профита. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 11:54 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt такой код хоть и страшненький Я же показал, как написать красиво Код: c# 1. 2. 3. 4.
Это такой новый синтаксис в 9 - годится для любого выражения, не только для matching pattern. hVostt в свиче да ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 15:33 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 15:42 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Я же показал, как написать красиво Код: c# 1. 2. 3. 4.
Это такой новый синтаксис в 9 - годится для любого выражения, не только для matching pattern. Что ж тут красивого-то? ) and/or -- в сишном синтаксисе, это ж как в футбоке с Биланом зайти в байкерсий бар А проверь теперь, что строка не содержит только пустые символы ещё. fkthat hVostt в свиче да Ну это у нас уже тут был срач по поводу визитора :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 16:04 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Shocker.Pro fkthat Код: c# 1.
Во-во )) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 16:04 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ну это у нас уже тут был срач по поводу визитора :) "Визитор" и "комманд" для дотнет это два говнопаттерна, потому что с ними ты начинаешь нагружать объект чужими обязаностями. Но во времена це с крестами это было меньшее зло, т.к. не было ни вменяемого RTTI, ни безопасного приведения типов, поэтому и приходилось применять идиому "двойной передачи" (double dispatch) на которой визитор/комманд по сути основаны. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 17:13 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Shocker.Pro это прям VB какой-то Но, авторВо-первых, это красиво. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 17:15 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Ну это у нас уже тут был срач по поводу визитора :) "Визитор" и "комманд" для дотнет это два говнопаттерна, потому что с ними ты начинаешь нагружать объект чужими обязаностями. Но во времена це с крестами это было меньшее зло, т.к. не было ни вменяемого RTTI, ни безопасного приведения типов, поэтому и приходилось применять идиому "двойной передачи" (double dispatch) на которой визитор/комманд по сути основаны. При чём тут двойная передача? Ты указал на проблему switch-а, визитор её решает. Хотя функциональщики тебя не поддержат. Т.е. ты в какой-то непонятной позиции ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 20:14 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ты указал на проблему switch-а, визитор её решает. Он её решает ущербным способом. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 22:23 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt При чём тут двойная передача? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Во времена двух плюсов этот прием как раз и назвался "двойная передача". Вызываешь объект, только чтобы он тут же вызвал обратно тебя. Фокус в том, что когда ты вызываешь объект, то ты его рантайм-тип не знаешь, но когда он вызывает тебя, то он свой рантайм-тип знает и за счет этого вызывает уже "свой" метод. Кривость в том, что при этом получается, что у меня не кот пьет из миски, а, наоборот, миска поит кота. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 22:46 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Ты указал на проблему switch-а, визитор её решает. Он её решает ущербным способом. Так в чём ущербность-то? Не совсем понятно. fkthat Во времена двух плюсов этот прием как раз и назвался "двойная передача". Вызываешь объект, только чтобы он тут же вызвал обратно тебя. Фокус в том, что когда ты вызываешь объект, то ты его рантайм-тип не знаешь, но когда он вызывает тебя, то он свой рантайм-тип знает и за счет этого вызывает уже "свой" метод. Это давно известный боян из плюсов, описанный ещё АА. fkthat Кривость в том, что при этом получается, что у меня не кот пьет из миски, а, наоборот, миска поит кота. Нифига подобного. Ты можешь визитор заменить свитчем. Но поимеешь тех самых проблем, о которых упоминал. Или у тебя есть идеи по-лучше свича, но не-визитор? Поделись. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 23:03 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Поделись. Ты угораешь или всерьез не можешь свич без свича сделать? Простейший вариант за пару минут на коленке: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 23:29 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Так в чём ущербность-то? Не совсем понятно. hVostt Это давно известный боян из плюсов, описанный ещё АА. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 00:27 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Ты угораешь или всерьез не можешь свич без свича сделать? Простейший вариант за пару минут на коленке: Ты сварганил "на коленке" медиатор. Это другой паттерн и решает другие задачи. Если провести параллель, то своей сути это тот же свитч и те же проблемы. Можно добавить команду и забыть создать/зарегистрировать хендлер — получишь ошибку в рантайме. Заменить пакет хендлеров, чтобы в разных случаев разные применять — нифига не выйдет. В визитёре этих проблем нет. fkthat hVostt Так в чём ущербность-то? Не совсем понятно. Нет, ты по сути говоришь "квадратное лучше круглого". Разные вещи сравниваешь. Ты реши задачи свитч/визитёр, на не предлагай решение для совершенно других задач. fkthat Понятно, что я его не сам изобрел - если бы я его изобрел, то, возможно, и работал бы с АА, а не с мудятлами, которые object.IsNull() создают Хм, а сможешь ответить на вопрос, когда расширение IsNull() действительно может принести пользу? Я -- могу :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 03:03 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ты сварганил "на коленке" медиатор. hVostt это тот же свитч hVostt Можно добавить команду и забыть создать/зарегистрировать хендлер — получишь ошибку в рантайме. hVostt Ты реши задачи свитч/визитёр, на не предлагай решение для совершенно других задач. hVostt когда расширение IsNull() действительно может принести пользу? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 10:38 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Ты сварганил "на коленке" медиатор. Т.е. ты не видишь, что сделал медиатор? Ну ок.. fkthat hVostt это тот же свитч И ты не видишь, что логика свитча легко прослеживается? Там даже место есть, которое можно было бы развернуть в обычный свитч? Ну ок-ок.. fkthat hVostt Ты реши задачи свитч/визитёр, на не предлагай решение для совершенно других задач. hVostt когда расширение IsNull() действительно может принести пользу? Ну штош. Выводы. Тебе не нравится визитор, потому что "он плахой", без объяснения причин :) А свитч тожа плахой... Ок. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 11:39 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt что сделал медиатор Хорошо - пусть будет медиатор. И класс Program это тоже медиатор, который медиирует все входные данные и код их обработки ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 12:57 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt что сделал медиатор Хорошо - пусть будет медиатор. И класс Program это тоже медиатор, который медиирует все входные данные и код их обработки Что значит "пусть будет"? Это медиатор, явный стопудовый медиатор. Единственная проблема в твоём коде, что ты его не доделал. Код: c# 1. 2. 3.
Если ты предлагаешь каждому клиенту вот такой хернёй страдать, то это говнокодище просто адское :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 13:17 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat, К слову, зачем пилить костыли, когда всё уже давно написано: https://github.com/jbogard/MediatR/wiki#requestresponse ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 13:19 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt fkthat, К слову, зачем пилить костыли, когда всё уже давно написано: https://github.com/jbogard/MediatR/wiki#requestresponse Я прекрасно про это знаю, и использовал. Просто тпоказал, как все это легко можно делать без свича на стопятьсот кейсов. hVostt Если ты предлагаешь каждому клиенту Нет, конечно. Опять-таки, это только пример, как нормальные люди свич без свича делают. Или, может быть, у вас и для массива из полсотни переменных тоже заводят int x1, x2, ..., x50; ?) Ну а что, если у вас в ПХП запросто пишут свич дюжин на пять кейсов (я сам такое видел), то я вполне поверю и в массивы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 13:55 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
И то, что MediatR назвали медиатром еще не делает его медиатором. Назвать его могли хоть дикобразом, если бы захотели. hVostt Тебе не нравится визитор, потому что "он плахой", без объяснения причин Я не писал, что мне он не нравится или он плохой, разве что если в шутку. Для C++ это очень изящный паттерн и его небольшие (даже и не технические, а, скорее идеологические) недостатки они ничтожны по сравнению с преимуществами. Но для дотнет это просто не нужно, потому что за счет уже готового RTTI (GetType и проч.) обработку и так можно распедалить по обработчикам не прибегая к каким-то специальным приемам. В визиторе по факту просто эмулируется RTTI - визитируемый объект за счет того, что знает свой тип выбирает тот или иной вызов визитора. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 14:21 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt fkthat, К слову, зачем пилить костыли, когда всё уже давно написано: https://github.com/jbogard/MediatR/wiki#requestresponse Я прекрасно про это знаю, и использовал. Просто тпоказал, как все это легко можно делать без свича на стопятьсот кейсов. Это не замена свича, ещё раз. И ты никак не прокомментировал те проблемы, которые здесь также уместны, как и у свича. fkthat Нет, конечно. Опять-таки, это только пример, как нормальные люди свич без свича делают. Фигню какую-то говоришь. Нормальные люди хлеб ножом режут, а дрова топором рубят. Ты в какой-то нездоровый фанатизм ударился, говоришь нож не нужен, всё топором можно делать. Другую задачу совершенно решает твой код, это медиатор, известно за какой профит надо так изъёбываться с огромных нагромождением интерфейсов и классов. У тебя какая-то каша в голове натуральная :) fkthat Ну а что, если у вас в ПХП запросто пишут свич дюжин на пять кейсов (я сам такое видел), то я вполне поверю и в массивы. Если ты видел, как ножом операцию на глаз делают, и это тебя возмутило -- это не значит, что как инструмент нож -- плохой. Это же детский сад какой-то. Давай как инженеры рассуждать, а не как бабки базарные :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 14:54 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat И то, что MediatR назвали медиатром еще не делает его медиатором. Назвать его могли хоть дикобразом, если бы захотели. Пля, это и есть медиатор. Как его назвали -- дело десятое. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 14:55 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Но для дотнет это просто не нужно, потому что за счет уже готового RTTI (GetType и проч.) Да что ты говоришь! А то на C++ нельзя дискриминатор добавить и базовый интерфейс. Прям C++ ущербней, чем C# ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 14:56 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Но для дотнет это просто не нужно, потому что за счет уже готового RTTI (GetType и проч.) обработку и так можно распедалить по обработчикам не прибегая к каким-то специальным приемам. Не говори ерунды. Рефлексия в C# так-то и есть "специальный приём", посмотри на внутренности MediatR, сколько же там "готового" и сколько там приёмов. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Выбирай удобный дискриминатор, и всё, отличий практически никаких не будет. А визитор совершенно другие задачи решает. Просто опыта у тебя пока не хватает. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 15:10 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt нельзя дискриминатор добавить Можно, где я говорил что нельзя. Это и есть другой способ изобретения своего RTTI за отстутствием готового. И, в отличии от визитора, этот способ это действительно гамно. Во-первых, надо заморачиваться хотя бы уже над тем, чтобы дискриминаторы были уникальные (при том, что ты можешь захотеть раскидать производные классы по разным сборкам/библиотекам, т.ч. список констант тебя тут не выручит). Во-вторых, что самое важное, операция кастинга все равно останется небезопасной - допустим, у тебя какой-то объект из-за очепятки в коде вернет тебе дискриминатор не своего типа, потом ты его возьмешь и апкастишь к этому типу, и тогда у тебя случится джоппа, причем, очень вероятно вообще космических масштабов - будешь сидеть потом по ночам и дампы мемасика разгребать. Визитор же делает все это абсолютно безопасным способом. Но, просто, еще раз, - в дотнете этого просто-напросто не требуется, потому что и так все делается и прямолинейно без "миска поит кота", и при этом безопасно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 15:20 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Рефлексия в C# так-то и есть "специальный приём" Using в C# это так-то тоже специальный прием. Но, хорошо, раз ты сказал, то перепишем теперь все на try/finally, чтобы не прибегать к "специальным приемам" hVostt посмотри на внутренности MediatR, сколько же там "готового" Я и так на него почти каждый день смотрю, потому что мы его используем. Или ты по примеру кода на скуле решил что я его из продакшена взял? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 15:26 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Выбирай удобный дискриминатор У меня и так есть готовый дескриминатор. GetType() называется. Но, если ты про него не знаешь, то можешь делать свои дискриминаторы, кто же тебе запретит ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 15:29 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat, Ок, пофигу, раз в твоей картине мира медиатор это улучшенная версия свича (топор -- улучшенная версия ножа, ага-ага), ты объясни, как твой медиатор решает проблемы свича? Визитор -- решает. А твой медиатор -- нет. В чём смысл того, за что ты топишь? :) Ты как бы говоришь, визитор хороший только в C++, а в C# плохой, ну потому что в C# есть GetType() (мухахха), ну ок -- это прям субъективное твоё мнение, спорить бесполезно, принимаем. И что дальше-то? Он же не решает проблемы свича, которые решает визитор )))) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 16:05 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt как твой медиатор решает проблемы свича У меня не медиатор и я как раз не собираюсь, как ты, медиатором решать проблемы свича Ты прочитал книгу Гамма сотоварищи, чтобы собеседование на работу пройти, поэтому сейчас упираешься в какие-то очень частные реализации из интернета, а общей картины не понимаешь Медиатор для того чтобы лапшевидный говнограф взаимодействий и зависимостей кучи объектов друг с другом заменить простой схемой где каждый объект взаимодействует только с общим объектом-медиатором. И он может быть реализован вообще без всяких абстракций, полиморфизма, наследования и т.п.- требуется только что каждый объект знает про медиатор, а медиатор знает о каждом из объектов, над которыми он медитирует. Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например, паблишить события, на которые медиатор подписывается. Например, винформовская форма, в случае простейшего использования (без MVVM и прочих) это пример медиатора своих дочерних контролов - кнопка "баттон" не меняет напрямую цвет текста "текстбокс", а делает это через форму (вызовом баттон-клика через свое событие), а текстбокс в свою очередь при вводе текста не меняет напрямую надпись на кнопке, а тоже отправляет событие форме, и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 16:34 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt ты объясни, как твой медиатор решает проблемы свича Так и решает. Если у меня появляется новая команда (т.е. новый кейс), то я просто наследую её от абстрактной, пишу для неё отдельный обработчик ICommandHandler, или добавляю её обработку в существующий и регаю эго (а в реале это вообще будет все готовое через DI). В уже существующий код, в отличие от свича, я при этом вообще не лезу, могу все разработчики раскидать/сгруппировать так как мне удобно по отдельным классам, неймспейсам, сборкам и прочему, и мне не нужна нечитабельная свичевая простыня, где для каждой из стопятьсот команд отдельный кейс, так, как ты наизобретал со своими дискриминантами. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 16:55 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat У меня не медиатор и я как раз не собираюсь, как ты, медиатором решать проблемы свича Ну объективно код, который ты привёл -- это медиатор. Как ты там лично для себя считаешь, это уже вопрос твоих личных фантазий. fkthat Ты прочитал книгу Гамма сотоварищи, чтобы собеседование на работу пройти, поэтому сейчас упираешься в какие-то очень частные реализации из интернета, а общей картины не понимаешь Я не упираюсь, это объективная реальность. Вот как раз ты сам себе противоречишь ) fkthat Медиатор для того чтобы лапшевидный говнограф взаимодействий и зависимостей кучи объектов друг с другом заменить простой схемой где каждый объект взаимодействует только с общим объектом-медиатором. И он может быть реализован вообще без всяких абстракций, полиморфизма, наследования и т.п.- требуется только что каждый объект знает про медиатор, а медиатор знает о каждом из объектов, над которыми он медитирует. Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например, паблишить события, на которые медиатор подписывается. Например, винформовская форма, в случае простейшего использования (без MVVM и прочих) это пример медиатора своих дочерних контролов - кнопка "баттон" не меняет напрямую цвет текста "текстбокс", а делает это через форму (вызовом баттон-клика через свое событие), а текстбокс в свою очередь при вводе текста не меняет напрямую надпись на кнопке, а тоже отправляет событие форме, и т.д. Ты рассказал как раз про свой код, который привёл :) И это медиатор. Медатор это не обязательно про события, если что. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 16:55 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat ак и решает. Если у меня появляется новая команда (т.е. новый кейс), то я просто наследую её от абстрактной, пишу для неё отдельный обработчик ICommandHandler, или добавляю её обработку в существующий и регаю эго (а в реале это вообще будет все готовое через DI). В уже существующий код, в отличие от свича, я при этом вообще не лезу, могу все разработчики раскидать/сгруппировать так как мне удобно по отдельным классам, неймспейсам, сборкам и прочему, и мне не нужна нечитабельная свичевая простыня, где для каждой из стопятьсот команд отдельный кейс, так, как ты наизобретал со своими дискриминантами. Ты можешь: 1. забыть написать отедельный обработчик 2. забыть его зарегистрировать то, что ты там куда-то "не лезешь", имеет и обратную сторону. Теперь из прикладного кода добраться до хендлера невозможно обычным способом. У меня был на руках проект, построенный полностью на этой архитектуре, разработчики, которые его писали, матом крыли ОРХИТЕКТОРА , который так придумал. Рассказывают, что это полный ппц и боль. И не надо травить байки про слабую связанность, бла-бла, где хочешь обработчик свой разместил, ага, да нахер это не упёрлось обычному рядовому прикладному разработчику. Нужно писать простой код, вопрос гибкости и расширяемости это для разработчиков core-платформы. Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:02 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ну объективно код, который ты привёл -- это медиатор. hVostt И это медиатор hVostt Я не упираюсь, это объективная реальность. hVostt Медатор это не обязательно про события, если что. fkthat Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например , паблишить события, на которые медиатор подписывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:07 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Ну объективно код, который ты привёл -- это медиатор. hVostt И это медиатор Я не могу спорить с твоим субъективным восприятием. Принимаю, что лично для тебя -- это нет. Все коллеги, с которыми я работаю и работал -- они знают, что это медиатор, значит мы с ними общаемся эффективно на одном языке. Я даж не знаю, _что это такое_ у тебя в фантазиях, если не медиатор ))) Хоть бы дал имя _этому_. Продвинутый шарп-свитч? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:12 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat Я об этом написал, ты просто не читал. fkthat Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например , паблишить события, на которые медиатор подписывается. Куда они "паблишат"? В космос чтоли? ))))))) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:12 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat медиатор подписывается Если что, медиатор никуда не подписывается :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:14 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Теперь из прикладного кода добраться до хендлера невозможно обычным способом. Во первых, зачем он тебе напрямую? А, во-вторых, почему нельзя? Сделай его паблик класс, и добирайся как хочешь, если тебе так это горит (непонятно только, опять-таки, зачем - ты же не паришься, когда инжектишь по DI интерфейсы вместо реализаций). А можешь даже все его приватные поля сразу объявить как паблик, чтобы добираться можно было ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:15 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом. Хорошо, если такой системщик всех системщиков не разрешает, то лезть не будем, уговорил ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:18 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Теперь из прикладного кода добраться до хендлера невозможно обычным способом. Во первых, зачем он тебе напрямую? А, во-вторых, почему нельзя? Сделай его паблик класс, и добирайся как хочешь, если тебе так это горит (непонятно только, опять-таки, зачем - ты же не паришься, когда инжектишь по DI интерфейсы вместо реализаций). А можешь даже все его приватные поля сразу объявить как паблик, чтобы добираться можно было Что значит зачем? Мне нужно попасть в реализацию. Как мне это сделать быстро? Нужно найти все usages команды и найти среди них реализацию хендлера. А если хендлера больше, чем один? И по какой-то упоротой логике подключается либо один, либо второй, либо третий. Какой в итоге тот самый? На маленьких проектах это не так болезненно. А когда всё абсолютно сделано через медиатор, начинается ад. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:19 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом. Хорошо, если такой системщик всех системщиков не разрешает, то лезть не будем, уговорил Ну ты знаешь наверное эту тему "всё есть -- object"? Есть ещё такой нездоровый фанатизм абстрациями, нужно ими обмазаться и считать что медиатор с кучей классов: команды, фабрики, регистрации, хендлера, шины команд -- вот это всё с какого-то мать его перепугу ПРОЩЕ чем свитч. Серьёзно? На коленке накидаю 100500 классов, чтобы сделать выбор между 2-3 вариантами? А вдруг завтра ещё 2 добавиться, это же что такое?!? Надо подстраховаться и обмазаться ещё парой слоёв абстракций... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:21 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом. Хорошо, если такой системщик всех системщиков не разрешает, то лезть не будем, уговорил Опытный программист знает, что нет абсолютно плохого или хорошего. Что мир не чёрно-белый. Разработка это компромисс. Он знает, что есть задачи, уместные для свитча, для визитора, а другие задачи хорошо решает медиатор. Когда перед тобой чувак, брызгая слюной орёт, что всё говно, надо писать только команды и хендлеры -- ну ты понял, да? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2020, 17:24 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Ты сварганил "на коленке" медиатор. Это другой паттерн и решает другие задачи. Что то тоже не вижу, где там медиатор, и между чем он посредничает. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2020, 17:24 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Hexag0v Что то тоже не вижу, где там медиатор, У хВоста такой стиль - он как уцепился за что-то, так будет спорить без конца. Специалист крутой, но упертый, что песец. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2020, 21:36 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Hexag0v hVostt Ты сварганил "на коленке" медиатор. Это другой паттерн и решает другие задачи. Что то тоже не вижу, где там медиатор, и между чем он посредничает. А что, извините, тогда вы видите? fkthat У хВоста такой стиль - он как уцепился за что-то, так будет спорить без конца. Специалист крутой, но упертый, что песец. https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/microservice-application-layer-implementation-web-api#the-command-process-pipeline-how-to-trigger-a-command-handler Спор -- это когда есть спорный вопрос. Но тут очевидно. Хотя если кто-то явно компонент не назвал Mediator, значит он не медиатор? :) Но тогда ты сам утверждал, что библиотека MediatR это не медиатор, а назвали её так, потому что разработчики были бухие и укуренные, и другие названия для библиотек закончились :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2020, 23:15 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt А что, извините, тогда вы видите? Там простой приём рефакторинга по разветвлению условий классами. В народе, иногда звучит как Replace Conditional with Polymorphism ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 10:51 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
Hexag0v Там простой приём рефакторинга по разветвлению условий классами. В народе, иногда звучит как Replace Conditional with Polymorphism Как всё печально.. штош, спорить не буду. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 11:06 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
hVostt Как всё печально.. штош, спорить не буду. Хвост, есть древняя притчя про слона и древних мудрецов, которых пригласили его потрогать ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 12:54 |
|
IDisposable и структуры
|
|||
---|---|---|---|
#18+
fkthat hVostt Как всё печально.. штош, спорить не буду. Хвост, есть древняя притчя про слона и древних мудрецов, которых пригласили его потрогать Ну да, а программа это всего лишь набор байт. А люди это лишь набор молекул. Мудрецы -- они такие. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 16:15 |
|
|
start [/forum/topic.php?all=1&fid=18&tid=1354589]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
110ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 468ms |
0 / 0 |