powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IDisposable и структуры
109 сообщений из 109, показаны все 5 страниц
IDisposable и структуры
    #40025330
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
struct Disposable : IDisposable
{
    public bool Disposed { get; private set; }      
    public void Dispose() { Disposed = true; }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
var d = new Disposable();
using (d)
{
      // Используем объект d
}
 
// Выведет: Disposed: false
Console.WriteLine("Disposed: {0}", d.Disposed);



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var d = new Disposable();
 
{
    // Дополнительная область видимости для того, чтобы нельзя было 
    // использовать переменную, объявленную в блоке using за его пределами
    var tmp = d; try
    {
        // Тело блока using
    }
    finally
    {
        // Проверка на null для обычных (не-nullable) структур не нужна
        ((IDisposable)tmp).Dispose();
    }
}



значит ли это что память переменной d не будет освобождена?
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025335
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и не понимаю зачем чз tmp сделано, все равно же finaly выполнится
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025351
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
и не понимаю зачем чз tmp сделано, все равно же finaly выполнится

Написано же в комментарии

listtoview
память переменной d не будет освобождена?

Как это она может быть не освобождена, если это структура?
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025367
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
var d = new Disposable();
using (d)
{
      // Используем объект d
}
 
// Выведет: Disposed: false
Console.WriteLine("Disposed: {0}", d.Disposed);



Потому что в блоке using произошёл boxing, и копия структуры залезла в кучу.
В переменной d ничего, понятное дело, не поменялось.

listtoview
значит ли это что память переменной d не будет освобождена?


Dispose не производит очистку памяти. Это просто метод с гарантией вызова при выходе из блока using.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025377
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Потому что в блоке using произошёл boxing, и копия структуры залезла в кучу.

Там нет боксинга. Просто внутри блока юзинг используется не сама структура, а её копия - вот оттуда и "странный" результат.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Хм. И правда, боксинга нет, но это оптимизация компилятора.
Правильно считать, то боксинг есть, ибо он тут по всем правилам быть должен.
Соответственно поведение такое же, как если бы боксинг был.

((IDisposable)d).Dispose() -- эта хреновина однозначно приведёт к boxing структуры.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025393
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Хм. И правда, боксинга нет, но это оптимизация компилятора.

Это не совсем оптимизация. В IL есть ньюанс, что если виртуальный метод (из object) или метод интерфейса объявлены в самой структуре, то боксинга при их вызове не происходит. Очень, кстати, важная тема, потому что если методы object не переопределять в структуре, то можно получить боксинг там, где его совсем не ждешь (например, если у тебя структура это key в Dictionary<>, или элемент в HashSet<>). Кое-что детально можно найти погуглив про инструкцию IL "constrained".
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025460
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Это не совсем оптимизация. В IL есть ньюанс, что если виртуальный метод (из object) или метод интерфейса объявлены в самой структуре, то боксинга при их вызове не происходит.


Только в том случае, когда ты напрямую дёргаешь метод структуры, а не интерфейса.
using работает с интерфейсом IDisposable и про твою структуру ничего не знает.
Соответственно, должен быть boxing, так как требуется приведение к IDisposable.

Однако боксинга не происходит, это и есть оптимизация компилятора.

Ноги у оптимизации растут из реализации IEnumerator для списков , которые являются структурами, чтобы не кушать память при foreach.

fkthat
Кое-что детально можно найти погуглив про инструкцию IL "constrained".


Если ты заменишь using на C# код, в который using разворачивается (try/finally), ты увидишь boxing.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025492
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала я видел этот вопрос на хабрец , но потом было интересно увидеть продолжение того как Сегрей Тепляков распедалил эту статью антихабрец
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025495
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, зачем введена переменная tmp?
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025520
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview
Коллеги, зачем введена переменная tmp?


Это копия, чтобы гарантировать неизменность ссылки / значения.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025524
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Сначала я видел этот вопрос на хабрец , но потом было интересно увидеть продолжение того как Сегрей Тепляков распедалил эту статью антихабрец


Да ничего он особо там не "распедалил" и толком ничего не пояснил.
Характерен только странный наезд, типа лезете внуть дотнета ай-яй-яй!
Вопросы плохие задаёте!
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025530
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Только в том случае, когда ты напрямую дёргаешь метод структуры, а не интерфейса.

Вот, за интерфейс (особенно в случае с using) я действительно не уверен. Но в случае виртуального метода:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var foo = new Foo();
var bar = new Bar();
foo.ToString();
bar.ToString();

internal struct Foo
{
    public override string ToString() => "I'm Foo!";
}

internal struct Bar
{
}



Код: il
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
entrypoint
.locals init (
       [0] valuetype Foo V_0,
       [1] valuetype Bar V_1
)

IL_0000: ldloca.s V_0
IL_0002: initobj Foo
IL_0008: ldloca.s V_1
IL_000a: initobj Bar
IL_0010: ldloca.s V_0
IL_0012: constrained. Foo
IL_0018: callvirt instance string [System.Runtime]System.Object::ToString()
IL_001d: pop
IL_001e: ldloca.s V_1
IL_0020: constrained. Bar
IL_0026: callvirt instance string [System.Runtime]System.Object::ToString()
IL_002b: pop
IL_002c: ret


Обрати внимание, что вызов один и тот же (строки 0012-0018 и 0020-0026), но, если верить талмуду, то боксинг, благодаря инструкции "constrained." будет только во втором случае. Я вот только в душе не знаю, как это реально проверить - вчера еще что-то об этом заморочился, но "правильного" способа так в голову и не пришло.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025552
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
как это реально проверить

Проверить, что в первом случае боксинга нет легко, но, вот, как убедиться, что он есть во втором случае - это вообще без понятия. Вызвать, что ли, ToString() стопятьсот раз и посмотреть потом, что там в куче лежит после этого, пока мусорщик еще её не уконрапупил - других идей у меня пока что нет.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025605
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
listtoview
Коллеги, зачем введена переменная tmp?


Это копия, чтобы гарантировать неизменность ссылки / значения.

да, это я понимаю
наверное лучше noLock заюзать
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025646
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
fkthat
как это реально проверить

Проверить, что в первом случае боксинга нет легко, но, вот, как убедиться, что он есть во втором случае - это вообще без понятия. Вызвать, что ли, ToString() стопятьсот раз и посмотреть потом, что там в куче лежит после этого, пока мусорщик еще её не уконрапупил - других идей у меня пока что нет.


Вот такая тула есть, но я не пробовал :)

https://www.codeproject.com/Articles/290247/BoxCop-Static-Assembly-Analyzer-tool
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025669
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
var foo = new Foo();

for (var j = 0; j < 10; j++)
{
    for (var i = 0; i < 100500000; i++)
    {
        foo.ToString();
    }

    Console.WriteLine(GC.GetTotalAllocatedBytes());
}

internal struct Foo
{
    public override string ToString() => null;
}




А теперь комментим перегрузку ToString()
Код: c#
1.
    // public override string ToString() => null;




Сразу видна разница, и видно, как эта разница с каждой итерацией растет.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025672
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Вот такой примитивнейший тестик:

А, кстати, добавил IDisposable и заменил foo.ToString() на using(foo) {} и роста кучи нет, как и в первом случае (с перегрузкой ToString). Т.ч. походу using тоже боксинг не вызывает, как сначала и ожидалось.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025687
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
fkthat
Вот такой примитивнейший тестик:

А, кстати, добавил IDisposable и заменил foo.ToString() на using(foo) {} и роста кучи нет, как и в первом случае (с перегрузкой ToString). Т.ч. походу using тоже боксинг не вызывает, как сначала и ожидалось.


Ну да, утиная оптимизация )
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025740
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
IL_0012: constrained. Foo
IL_0018: callvirt instance string [System.Runtime]System.Object::ToString()
и у Foo есть своя реализация ToString, то CLR превращает callvirt в обычный call без боксинга.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025814
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
и у Foo есть своя реализация ToString, то CLR превращает callvirt в обычный call без боксинга.


И не выполняет виртуальный вызов.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025824
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Единственное практическое применение, которое я вижу всей этой тряхомудии, это задрочить, унизить, и опустить кого-нибудь на собеседовании
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025826
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt,

Единственное практическое применение, которое я вижу всей этой тряхомудии, это задрочить, унизить, и опустить кого-нибудь на собеседовании


Вовсе нет. Честно говоря, вопросы про наследование интерфейса структурой многих приводит в недоумение. Этот вопрос хороший в нет плане, что ты ожидаешь правильный ответ, но можешь проследить логику размышлений.

Один из 20 человек может ответить на вопрос, чем отличается реализация GetHashCode() у классов и структур, так что -- это типа тоже унижение? :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025829
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
чем отличается реализация GetHashCode() у классов и структур

В смысле - дефолтная реализация? Я и сам не знаю - это надо исходники дотнета изучать Но, в чем будет разница с практической точки зрения, это я знаю.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025831
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
чем отличается реализация GetHashCode() у классов и структур

В смысле - дефолтная реализация? Я и сам не знаю - это надо исходники дотнета изучать Но, в чем будет разница с практической точки зрения, это я знаю.


Зачем исходники дотнета? Это спека, вопрос же в принципиальном отличии, это довольно практический вопрос, а не какие-то там тонкие ньюансы для гуру.

Можно поговорить о том как работает GetHashCode() для классов, в контексте строения экземпляра класса в памяти, но мало с кем до этого вообще доходит :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025832
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
вопросы про наследование интерфейса структурой многих приводит в недоумение

Все недоумения от интерфейсов, как я в другом месте уже говорил, просто результат неудачного термина, потому что "наследования" интерфейсов не существует, есть только "реализация". Это все приплыло, по-моему, из того языка-мутанта который с двумя крестами, где вообще не было полноценного синтаксиса для интерфейсов.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025834
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Это спека

Какая там спека на GetHashCode. Единственная его спека это то, что для одного и того же экземпляра оно должно возвращать всегда одно и то же значение.

Даже если ты напишешь где-нибудь:
Код: c#
1.
public override int GetHashCode() => 0;

то это совсем не хорошо, но небо на землю не упадет, и все, как ни странно, будет продолжать работать :))

У меня была умора во второй половине двухтысячных. Одни клоуны где-то прочитали, что, типа хранить пароли в plain text это плохо, над хранить хеши. И они тогда стали в БД в поле int сохранять password.GetHashCode() И все, причем, долгое время нормально работало. Но в один прекрасный день: "ахтунг-ахтунг, никто не может на сайт залогиниться" Оказалось, что они ночью перевезли эту веб-аппликуху на 64 бита. А GetHashCode() для строк на 32-битном и 64-битном фреймворках считаются по-разному.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025875
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
вопросы про наследование интерфейса структурой многих приводит в недоумение

Все недоумения от интерфейсов, как я в другом месте уже говорил, просто результат неудачного термина, потому что "наследования" интерфейсов не существует, есть только "реализация". Это все приплыло, по-моему, из того языка-мутанта который с двумя крестами, где вообще не было полноценного синтаксиса для интерфейсов.


Недоумение исключительно по не знанию и неграмотности. Наследование, так как это явно прописывается в определении типа.

При чём может быть наследование, но без реализации. Два явно разных термина, абсолютно конкретных без какой-либо двусмысленности.

fkthat
Единственная его спека это то, что для одного и того же экземпляра оно должно возвращать всегда одно и то же значение.


Ну вот касательно структур -- как раз таки нет.

fkthat
У меня была умора во второй половине двухтысячных. Одни клоуны где-то прочитали, что, типа хранить пароли в plain text это плохо, над хранить хеши. И они тогда стали в БД в поле int сохранять password.GetHashCode() И все, причем, долгое время нормально работало. Но в один прекрасный день: "ахтунг-ахтунг, никто не может на сайт залогиниться" Оказалось, что они ночью перевезли эту веб-аппликуху на 64 бита. А GetHashCode() для строк на 32-битном и 64-битном фреймворках считаются по-разному.


Так об этом тоже явно прописано и в книжках писали 50 тыщ раз.

Я же говорю. Долбанные практики, которые ничему учиться не хотят, всё методом тыка, StackOverflow-кодинг, потом делают круглые глаза и удивляются: а чтоооо это такоеее? А пооочему оооошибко?

Матчасть нужно учить.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025885
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну вот касательно структур -- как раз таки нет.

Есть только дефолтная реализация для ValueType которая для копии структуры всегда вернет то же значение что у оригинала, что вполне логично и ожидаемо. Но никто тебе не запрещает перегрузить её своей, пока ты следуешь правилу "одинаковые объекты -> одинаковый хешкод" (наоборот совершенно необязательно). Можешь тот же 0 всегда возвращать :))

hVostt
Так об этом тоже явно прописано и в книжках писали 50 тыщ раз.

Ну я, например, об этом не знал. Да и не узнал бы, если бы не тот случай - мне достаточно знания того, что GetHashCode вообще никакого отношения к криптографическому хешу не имеет :))
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025912
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
StackOverflow-кодинг

Это все же лучше, чем вообще свои собственные выдумки :))
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025916
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Это все же лучше, чем вообще свои собственные выдумки :))
смотря откуда брать код - из ответов или из вопросов
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025923
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.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025965
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Так об этом тоже явно прописано и в книжках писали 50 тыщ раз.

Ну я, например, об этом не знал. Да и не узнал бы, если бы не тот случай - мне достаточно знания того, что GetHashCode вообще никакого отношения к криптографическому хешу не имеет :))


Ну как, если будешь структуру в качестве ключа словаря использовать, эти знания тебе понадобятся.
Это, кстати, давно известная оптимизация для комплексного ключа в памяти.

Мне это много когда пригодилось, другое дело если программист дальше прикладного уровня не ходит, то и не пригодится...

fkthat
hVostt
StackOverflow-кодинг

Это все же лучше, чем вообще свои собственные выдумки :))


А там сам бог ответы пишет? Те же выдумки, только чужие.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025969
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 проекта, то наследование это очень крутая штука и мощнейший инструмент, который даёт колоссальный профит.

В неумелых руках прикладника и джуна, наследование это конечно боль и негодование "нахера оно нужно!??"
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40025971
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Рихтер вот что пишет:


Хотя с Рихтером я когда-то был согласен, типа делать sealed по умолчанию.
Сейчас -- нет. Не согласен.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026030
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
В неумелых руках

Вреда от наследования в рукожопах на порядок больше, чем пользы от него в руках умелых. И, правильно, на самом деле
hVostt
нахера оно нужно
единственное нормальное его применение, что в голову приходит это паттерн "фабричный/шаблонный метод" - без них вполне можно обойтись просто инжекцией нужной абстракции (по сути заменяя наследование композицией по заветам GoF).

Особо люто выбешивает создание в проекте класса типа WebApiMvcWebFormsBaseController и напихание туда гималайской горы всякого гамна типа "GetCurrentUserName", "IsCurrentUserVasja", "ValidateUserSnilsInnOgrnPhoneAndEmail" и т.п. Или, например, такой чудесный класс в модели EF, типа
Код: c#
1.
2.
3.
4.
public class EntityWithId<T>
{
   public T Id { get;set; }
}

Бесит, аж кушать не могу...
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026032
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
создание в проекте класса типа WebApiMvcWebFormsBaseController

Но самая жесть жести при этом когда какому-нибудь дровосеку сервис ILoveThisService понадобился аж в целых двух контроллерах и он, помня о бестипрактисе ДИ добавляет его в конструктор этого чудища архитектуры. И похрен то, что в остальных полюдюжине дюжин контроллеров этот сервис никому начлен не вперся.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026051
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
В неумелых руках

Вреда от наследования в рукожопах на порядок больше, чем пользы от него в руках умелых. И, правильно, на самом деле


Да нет там вреда, прикладники в наследование даже не лезут.
Слишком сложно.

fkthat
единственное нормальное его применение, что в голову приходит это паттерн "фабричный/шаблонный метод" - без них вполне можно обойтись просто инжекцией нужной абстракции (по сути заменяя наследование композицией по заветам GoF).


Не буду комментировать, применений конечно на пару порядков больше, но это очевидно для опытных разработчиков :)


fkthat
Особо люто выбешивает создание в проекте класса типа WebApiMvcWebFormsBaseController и напихание туда гималайской горы всякого гамна типа "GetCurrentUserName", "IsCurrentUserVasja", "ValidateUserSnilsInnOgrnPhoneAndEmail" и т.п. Или, например, такой чудесный класс в модели EF, типа
Код: c#
1.
2.
3.
4.
public class EntityWithId<T>
{
   public T Id { get;set; }
}


Бесит, аж кушать не могу...


А что не так? Очень часто встречающееся решение (вариации), значит хорошо работает.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026053
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
fkthat
создание в проекте класса типа WebApiMvcWebFormsBaseController

Но самая жесть жести при этом когда какому-нибудь дровосеку сервис ILoveThisService понадобился аж в целых двух контроллерах и он, помня о бестипрактисе ДИ добавляет его в конструктор этого чудища архитектуры. И похрен то, что в остальных полюдюжине дюжин контроллеров этот сервис никому начлен не вперся.


Если в двух контроллерах используется этот сервис, почему его нельзя добавить в конструктор этих контроллеров? Где затык? )
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026059
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
А что не так?

Уже хотя бы то, что это усложнение без всякой пользы. Когда ума нет что-то действительно полезное сделать, то начинается вот такое изобретательство всяких бессмысленных прослоек, расширений и базовых классов. Я когда-то видел проект, где какие-то долбоящеры написали больше полусотни своих методов-расширений к классам string и object. Хочешь верь, хочешь нет, но там даже был метод
Код: c#
1.
2.
3.
4.
public static bool IsNull(this object obj)
{
    return obj == null;
}

И все эти BaseEntityWithId из той же цыганской ярмарки.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026061
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Где затык? )

Так это не ко мне вопрос, а к творцам таких шедевров. Наверное, типа, целых две строчки кода повторяются целых два раза - надо срочно решение этому искать, а то еще, не ровен час вдруг в третьем месте потом их придется повторить
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026077
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Уже хотя бы то, что это усложнение без всякой пользы. Когда ума нет что-то действительно полезное сделать,


Наоборот упрощение. Если у тебя +100500 сущностей и у всех есть поле Id, то разумно сделать базовый класс и не дублировать одно и то же.

Польза есть и очень большая.

fkthat
Когда ума нет что-то действительно полезное сделать, то начинается вот такое изобретательство всяких бессмысленных прослоек, расширений и базовых классов. Я когда-то видел проект, где какие-то долбоящеры написали больше полусотни своих методов-расширений к классам string и object. Хочешь верь, хочешь нет, но там даже был метод
Код: c#
1.
2.
3.
4.
public static bool IsNull(this object obj)
{
    return obj == null;
}



Ну именно это конечно бессмысленно. Но большиство расширений для того же string -- полезны. А всё потому, что изначально многие методы не должны быть экземплярными, из-за них много NRE ошибок происходит.

fkthat
И все эти BaseEntityWithId из той же цыганской ярмарки.


Похоже тут пахнет неприкрытой вкусовщиной )
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026078
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Где затык? )

Так это не ко мне вопрос, а к творцам таких шедевров. Наверное, типа, целых две строчки кода повторяются целых два раза - надо срочно решение этому искать, а то еще, не ровен час вдруг в третьем месте потом их придется повторить


Собственно одна из задач наследования -- борьба с избыточностью.
Главное, без фанатизма.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026103
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Собственно одна из задач наследования -- борьба с избыточностью.

Из всех мыслимых способов переиспользования кода наследование это самый кривой и ущербный. Да и вот контрпример: квадрат это частный случай прямоугольника (те в терминах ОО его наследник), но для прямоугольника тебе надо хранить и ширину и высоту отдельно, а для квадрата они всегда одинаковые, поэтому хочешь-не хочешь, но придется наоборот делать избыточность.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026117
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Собственно одна из задач наследования -- борьба с избыточностью.

Из всех мыслимых способов переиспользования кода наследование это самый кривой и ущербный. Да и вот контрпример: квадрат это частный случай прямоугольника (те в терминах ОО его наследник), но для прямоугольника тебе надо хранить и ширину и высоту отдельно, а для квадрата они всегда одинаковые, поэтому хочешь-не хочешь, но придется наоборот делать избыточность.


Довольно нелепые домыслы. И довольно неуместный пример. В терминах ОО квадрат не наследник прямоугольника, квадрат и есть прямоугольник, у которого одинаковая длина сторон. Где, собственно, ты вообще видел в UI объект типа Square? Rectangle -- пожалуйста.

Короче, уверен у тебя наверняка есть печальный травматический опыт, но к объективной реальности это имеет мало отношения.

Порезался бумагой -- бумага злющее зло, запретить, сжечь!
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026141
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
квадрат и есть прямоугольник,

Чистое наследование. Любой кот есть животное, любая вилка есть столовый прибор, а любой квадрат есть прямоугольник.

hVostt
Где, собственно, ты вообще видел в UI объект типа Square

Я привел просто как пример усиления инвариантов в подклассе. А усиление инварианта уже означает, что у тебя код из базового класса может быть некорректным в производном.

Кстати, насчет котов и животных очень показательна в какое гамно выстраивание всяких иеархий наследований может завести. Таксономия в биологии зародилась еще в начале 19 века, и все поначалу было хорошо, красивая иеархия и т.п. но потом начинают появлятся всякие чупакабры и прочие грибы-кенгуры, которых либо вообще хрен его знает куда впихнуть, либо впихивать сразу в дюжину мест. Вот та же самая херь и с наследованием. Понастроил себе классов, сидишь и любуешься как художник на свою картину, а тут раз, и появляется какая-то хрень, которая тебе все ломает куда ты её ни впихивай.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026166
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
квадрат и есть прямоугольник,

Чистое наследование. Любой кот есть животное, любая вилка есть столовый прибор, а любой квадрат есть прямоугольник.


Нет, если ты так искренне считаешь, значит наследование не понимаешь в принципе.

Путать таксономию с наследованием -- это заблуждение древних первопроходцев, можно найти массу таких примеров в пожелтевших книжках по программированию.

fkthat
Я привел просто как пример усиления инвариантов в подклассе. А усиление инварианта уже означает, что у тебя код из базового класса может быть некорректным в производном.


Это максимально далёкий от наследования в ООП пример.
Что общего у вороны и письменного стола?

fkthat
Кстати, насчет котов и животных очень показательна в какое гамно выстраивание всяких иеархий наследований может завести. Таксономия в биологии зародилась еще в начале 19 века, и все поначалу было хорошо, красивая иеархия и т.п. но потом начинают появлятся всякие чупакабры и прочие грибы-кенгуры, которых либо вообще хрен его знает куда впихнуть, либо впихивать сразу в дюжину мест. Вот та же самая херь и с наследованием. Понастроил себе классов, сидишь и любуешься как художник на свою картину, а тут раз, и появляется какая-то хрень, которая тебе все ломает куда ты её ни впихивай.


Отражать объекты реального мира в иерархии наследования классов -- одно из величайших заблуждений, из-за которого потом столько нытья и соплей в интернетах, дескать ООП не работает :)

Для примеров нужно брать программные задачи, а не коты, собаки, круги и прочие глупости.

Насчёт "ломает". Это либо архитектор не опытный, или не далёкий. Либо изначальные теории не подтвердились на практике. Именно поэтому появляются новые решения, новые библиотеки и ПО.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026168
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Давай лучше реальные примеры рассматривать. Где плохо?
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026171
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Где плохо?

В том же твоем любимом Stream

Но, конечно, ты сейчас скажешь, что это просто из-за того, что его рукожопы делали
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026174
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Что общего у вороны и письменного стола?

Если мы, например, делаем специальный склад для хранения дохлых ворон и письменных столов, то в контексте этого склада у них может быть очень много общего.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026181
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Где плохо?

В том же твоем любимом Stream

Но, конечно, ты сейчас скажешь, что это просто из-за того, что его рукожопы делали


Ну так наследование здесь при чём? Оно как раз позволяет работать максимально рукожопому контракту.
Т.е. благодаря наследованию эта хреновина едет :)

Может есть какой-то из собственной практики пример?
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026183
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Нет, если ты так искренне считаешь, значит наследование не понимаешь в принципе.

Значит я в хорошей компании
https://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков Саттер и Александреску в своём руководстве по использованию C++ для выражения этого принципа также используют фразу «подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс». По мнению данных авторов, публичное наследование в C++ можно употреблять только тогда, когда оно удовлетворяет принципу Лисков. Приватное наследование, по их же мнению, дозволено использовать для доступа к protected части базы и перекрытия виртуальных методов. В любом же ином случае, то есть для всего лишь повторного использования кода из базы, наследование применять нельзя.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026187
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну так наследование здесь при чём?

При том, что если бы вместо одного здоровенного базового класса его API грамотно раскидали бы по интерфейсам, то его реализации не напоминали бы хоспинс для калек - у одного нога не гнется, у другого рука не разгибается, а третий глухослепой
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026194
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Значит я в хорошей компании
https://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков Саттер и Александреску в своём руководстве по использованию C++ для выражения этого принципа также используют фразу «подкласс не должен требовать от вызывающего кода больше, чем базовый класс, и не должен предоставлять вызывающему коду меньше, чем базовый класс». По мнению данных авторов, публичное наследование в C++ можно употреблять только тогда, когда оно удовлетворяет принципу Лисков. Приватное наследование, по их же мнению, дозволено использовать для доступа к protected части базы и перекрытия виртуальных методов. В любом же ином случае, то есть для всего лишь повторного использования кода из базы, наследование применять нельзя.


Ты сам себе противоречишь. Разумеется LSP должен соблюдаться, и желательно следовать определённым принципам, но нигде ни слова не сказано, что наследование это плохо.

Откуда ноги растут у выражения "предпочтите агрегацию наследованию"? Как раз из-за вброса в массы неправильных трактовок.

Эти трактовки до сих пор прослеживаются, даже у тебя. Начинаешь приводить примеры объектов реального мира, натягивая на них программные интерфейсы. Возможно терминология этому сопутствовала.


fkthat
При том, что если бы вместо одного здоровенного базового класса его API грамотно раскидали бы по интерфейсам, то его реализации не напоминали бы хоспинс для калек - у одного нога не гнется, у другого рука не разгибается, а третий глухослепой


Нет, так это не работает. Ты можешь выразить интерфейсом минимальный контракт и реализовать несколько.

Но ожидать конкретный набор интерфейсов -- не можешь.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026198
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Если у тебя +100500 сущностей и у всех есть поле Id, то разумно сделать базовый класс и не дублировать одно и то же.

1) Дублирование одного поля заменяем дублированием объявления наследования. Еще и с тем геммором, что если я вижу в каком-то незнакомом классе свойство, то я вижу свойство, а если я вижу какой-то неизветсный мне базовый класс, то мне еще придется полезть и посмотреть, что это за херь такая.

2) Я неожиданно обнаруживаю, что в каком-то единственном классе мне надо поменять поведение свойства Id (допустим, не дать туда писать числа которые не делятся на десять). Попадос.

3) Я очень даже всеми тремя руками за то, чтобы использовать наследование в моделях данных ORM, но я все время вижу, как творческие творцы творят полдюжины совершенно несвязанных полностью разных сущностей для какой-нибудь, допустим, полудюжины разных типов контрагентов, но зато пихают в модель всевозможную базовую херь наподобии EntityWitrhId, EntityCanBeDeleted, и EntityWithCreationDate. Оно и понятно, как я уже и говорил. Чтобы понять что есть общего, а что есть разного, допустим, у контрагента-юрлица и контрагента-физлица это нужны уже какие-то зачатки мышления и анализа, а чтобы написать какой-нибудь EntityWithIdCreationDateAndCanBeFukkingDeleted который в три строки кода, для этого достаточно прочитать книгу "Освой EntityFramework за четыре туалета по-большому".

hVostt
Но большиство расширений для того же string -- полезны.
Кроме существующих линкьюшных расширений (которые и не расширения самого string вовсе) ничего полезного в голову вообще не приходит. Все эти расширения string, что я видел были полной херотой. Например, самодельный вариант поиска подстроки, который который отличался от встроенного только тем, что вместо возврата -1 при неудаче кидал какой-то самодельный exception.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026204
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Если у тебя +100500 сущностей и у всех есть поле Id, то разумно сделать базовый класс и не дублировать одно и то же.

1) Дублирование одного поля заменяем дублированием объявления наследования. Еще и с тем геммором, что если я вижу в каком-то незнакомом классе свойство, то я вижу свойство, а если я вижу какой-то неизветсный мне базовый класс, то мне еще придется полезть и посмотреть, что это за херь такая.


Дело не только в этом. Теперь можно принимать базовый тип сущности и работать с идентификатором. Много чего можно делать.

fkthat
2) Я неожиданно обнаруживаю, что в каком-то единственном классе мне надо поменять поведение свойства Id (допустим, не дать туда писать числа которые не делятся на десять). Попадос.


К наследованию это не имеет отношения. Это может случиться где угодно. Например, ты возвращал IEnumerable из функции. И вдруг в одном случае тебе понадобилось получать число :)

fkthat
3) Я очень даже всеми тремя руками за то, чтобы использовать наследование в моделях данных ORM, но я все время вижу, как творческие творцы творят полдюжины совершенно несвязанных полностью разных сущностей для какой-нибудь, допустим, полудюжины разных типов контрагентов, но зато пихают в модель всевозможную базовую херь наподобии EntityWitrhId, EntityCanBeDeleted, и EntityWithCreationDate. Оно и понятно, как я уже и говорил. Чтобы понять что есть общего, а что есть разного, допустим, у контрагента-юрлица и контрагента-физлица это нужны уже какие-то зачатки мышления и анализа, а чтобы написать какой-нибудь EntityWithIdCreationDateAndCanBeFukkingDeleted который в три строки кода, для этого достаточно прочитать книгу "Освой EntityFramework за четыре туалета по-большому".


К сожалению, всегда будет грязновато. Не важно ООП это, чистое ФП, или ещё что.
Проблема в том, что сам мир не идеален, и задача проходит через мозг разработчиков, изрядно искажаясь по фактуре. Поэтому потом что бы ты не делал -- всё равно получится говнокод. Никто и ничто тебя не спасёт.

Ни Барбара Лисков, ни Эрик Липман, ни Рихтер, никто :)

Если я правильно понял, ведь твой посыл именно в этом. Не красиво, не очень, грязно. Ну всё так. Ты причины не там ищешь просто :)


fkthat
hVostt
Но большиство расширений для того же string -- полезны.
Кроме существующих линкьюшных расширений (которые и не расширения самого string вовсе) ничего полезного в голову вообще не приходит. Все эти расширения string, что я видел были полной херотой. Например, самодельный вариант поиска подстроки, который который отличался от встроенного только тем, что вместо возврата -1 при неудаче кидал какой-то самодельный exception.


Ну почему же.

Сравни:

string.IsNullOrEmpty(myString) vs myString.IsEmty()

проблема в том, что они не стандартизованы, называются и работают по-разному в проектах.
это фигово. но в целом, в рамках большого проекта они так или иначе создаются, потому что люди хотят облегчить себе жизнь.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026205
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Насчёт дублирования кода. Не только сам код, но и весь обвес:

1. Комментарии, документация
2. Тесты
3. Расширения

и т.д.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026206
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Но ожидать конкретный набор интерфейсов -- не можешь.

В совершенно произвольном случае, когда незнамо откуда прилетело незнамо что, да это невозможно. Но, я могу запросить нужный интерфейс приведением от одного интерфейса к другому, проверить на null и если ок, то уже делать с ним то что надо. Аналогия с COM - когда тебе нужен какой-то API компонента ты явно запрашиваешь именно этот API. А не получаешь один гигантский API, где стопятьсяот методов из которых только три работают, а сточетырестадевяностосемь возвращают "NotSupported".
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026212
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
myString.IsEmty()

Я напишу просто в коде myString == "" и над моим кодом никто не будет дрочить себе мозг. А про myString.IsEmty() я уже сразу мозг вздрочнул, например, тем, что если myString это null, то кинет ли он ексепшен или вернет false, или его вовсе кто-то написал просто не зная, что есть готовый IsNullOrEmpty и он вернет мне true.

Кстати, в шарп-9 новая бомба-фича :))
Код: c#
1.
2.
var s = "foo";
var isNullOrEmptyOrFooBar = s is null or "" or "foo" or "bar";
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026218
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или можно даже так:
Код: c#
1.
2.
var x = 57;
var isDigitOr42 = x is (> -1 and < 10) or 42;
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026301
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Я напишу просто в коде myString == "" и над моим кодом никто не будет дрочить себе мозг.


(myString ?? "") == "" или (myString ?? "").Length == 0

Но да, с этим согласен, такой код хоть и страшненький, но лучше читается, чем чужие неведомые расширения.

Однако в рамках большого проекта и команды, никакой трагедии в расширениях нет. Всё с этим ок, не нужно драматизировать :)

fkthat
Кстати, в шарп-9 новая бомба-фича :))
Код: c#
1.
2.
var s = "foo";
var isNullOrEmptyOrFooBar = s is null or "" or "foo" or "bar";



Да как сказать... в свиче да, как рядовое использование пока не видится особого профита.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026417
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
такой код хоть и страшненький

Я же показал, как написать красиво
Код: c#
1.
2.
3.
4.
if(myString is null or "")
{
    ...
}

Это такой новый синтаксис в 9 - годится для любого выражения, не только для matching pattern.

hVostt
в свиче да
Свич занесен в энциклопедию говнокода
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026423
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Код: c#
1.
var isNullOrEmptyOrFooBar = s is null or "" or "foo" or "bar";

это прям VB какой-то
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026434
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Я же показал, как написать красиво
Код: c#
1.
2.
3.
4.
if(myString is null or "")
{
    ...
}


Это такой новый синтаксис в 9 - годится для любого выражения, не только для matching pattern.


Что ж тут красивого-то? )

and/or -- в сишном синтаксисе, это ж как в футбоке с Биланом зайти в байкерсий бар

А проверь теперь, что строка не содержит только пустые символы ещё.


fkthat
hVostt
в свиче да
Свич занесен в энциклопедию говнокода


Ну это у нас уже тут был срач по поводу визитора :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026435
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
fkthat
Код: c#
1.
var isNullOrEmptyOrFooBar = s is null or "" or "foo" or "bar";


это прям VB какой-то


Во-во ))
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026470
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну это у нас уже тут был срач по поводу визитора :)

"Визитор" и "комманд" для дотнет это два говнопаттерна, потому что с ними ты начинаешь нагружать объект чужими обязаностями. Но во времена це с крестами это было меньшее зло, т.к. не было ни вменяемого RTTI, ни безопасного приведения типов, поэтому и приходилось применять идиому "двойной передачи" (double dispatch) на которой визитор/комманд по сути основаны.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026472
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
это прям VB какой-то

Но, авторВо-первых, это красиво.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026584
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ну это у нас уже тут был срач по поводу визитора :)

"Визитор" и "комманд" для дотнет это два говнопаттерна, потому что с ними ты начинаешь нагружать объект чужими обязаностями. Но во времена це с крестами это было меньшее зло, т.к. не было ни вменяемого RTTI, ни безопасного приведения типов, поэтому и приходилось применять идиому "двойной передачи" (double dispatch) на которой визитор/комманд по сути основаны.


При чём тут двойная передача? Ты указал на проблему switch-а, визитор её решает.
Хотя функциональщики тебя не поддержат.

Т.е. ты в какой-то непонятной позиции )))
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026620
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ты указал на проблему switch-а, визитор её решает.

Он её решает ущербным способом.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026623
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Handler handler = new();
Command cmd1 = new FooCommand();
Command cmd2 = new BarCommand();
handler.HandleCommand(cmd1);
handler.HandleCommand(cmd2);

internal abstract class Command
{
    public abstract void Execute(Handler handler);
}

internal class FooCommand : Command
{
    public override void Execute(Handler handler) =>
        handler.HandleCommand(this);
}

internal class BarCommand : Command
{
    public override void Execute(Handler handler) =>
        handler.HandleCommand(this);
}

internal class Handler
{
    public void HandleCommand(Command command) =>
        command.Execute(this);

    public void HandleCommand(FooCommand command) =>
        Console.WriteLine("Handle Foo command.");

    public void HandleCommand(BarCommand command) =>
        Console.WriteLine("Handle Bar command.");
}


Во времена двух плюсов этот прием как раз и назвался "двойная передача". Вызываешь объект, только чтобы он тут же вызвал обратно тебя. Фокус в том, что когда ты вызываешь объект, то ты его рантайм-тип не знаешь, но когда он вызывает тебя, то он свой рантайм-тип знает и за счет этого вызывает уже "свой" метод.

Кривость в том, что при этом получается, что у меня не кот пьет из миски, а, наоборот, миска поит кота.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026631
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ты указал на проблему switch-а, визитор её решает.

Он её решает ущербным способом.


Так в чём ущербность-то? Не совсем понятно.

fkthat
Во времена двух плюсов этот прием как раз и назвался "двойная передача". Вызываешь объект, только чтобы он тут же вызвал обратно тебя. Фокус в том, что когда ты вызываешь объект, то ты его рантайм-тип не знаешь, но когда он вызывает тебя, то он свой рантайм-тип знает и за счет этого вызывает уже "свой" метод.


Это давно известный боян из плюсов, описанный ещё АА.


fkthat
Кривость в том, что при этом получается, что у меня не кот пьет из миски, а, наоборот, миска поит кота.


Нифига подобного.

Ты можешь визитор заменить свитчем. Но поимеешь тех самых проблем, о которых упоминал.

Или у тебя есть идеи по-лучше свича, но не-визитор? Поделись.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026635
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
ICommandHandlerFactory factory = new CommandHandlerFactory()
    .AddHandler<FooCommand, FooCommandHandler>();

Command cmd = new FooCommand();
var handler = factory.GetCommandHandler(cmd.GetType());
handler.HandleCommand(cmd);

internal interface ICommandHandlerFactory
{
    ICommandHandler GetCommandHandler(Type commandType);
}

internal interface ICommandHandler
{
    void HandleCommand(Command command);
}

internal abstract class Command
{
}

internal class FooCommand : Command
{
}

internal class FooCommandHandler : ICommandHandler
{
    public void HandleCommand(Command command) =>
        HandleCommand(command as FooCommand ??
            throw new ArgumentException("Invalid command type", nameof(command)));

    private void HandleCommand(FooCommand command) =>
        Console.Write("Handle FooCommand");
}

internal class CommandHandlerFactory : ICommandHandlerFactory
{
    private readonly Dictionary<Type, Func<ICommandHandler>> _factories = new();

    public ICommandHandler GetCommandHandler(Type commandType)
    {
        return _factories.TryGetValue(commandType, out var f) ?
            f() : throw new ArgumentException("Invalid type", nameof(commandType));
    }

    public CommandHandlerFactory AddHandler<TCommand, THandler>()
        where THandler : ICommandHandler, new()
    {
        _factories.Add(typeof(TCommand), () => new THandler());
        return this;
    }
}

...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026641
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Так в чём ущербность-то? Не совсем понятно.
Написал же ниже - миска поит кота.

hVostt
Это давно известный боян из плюсов, описанный ещё АА.
Понятно, что я его не сам изобрел - если бы я его изобрел, то, возможно, и работал бы с АА, а не с мудятлами, которые object.IsNull() создают
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026652
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Ты угораешь или всерьез не можешь свич без свича сделать?

Простейший вариант за пару минут на коленке:


Ты сварганил "на коленке" медиатор. Это другой паттерн и решает другие задачи.

Если провести параллель, то своей сути это тот же свитч и те же проблемы.

Можно добавить команду и забыть создать/зарегистрировать хендлер — получишь ошибку в рантайме.
Заменить пакет хендлеров, чтобы в разных случаев разные применять — нифига не выйдет.

В визитёре этих проблем нет.


fkthat
hVostt
Так в чём ущербность-то? Не совсем понятно.
Написал же ниже - миска поит кота.


Нет, ты по сути говоришь "квадратное лучше круглого". Разные вещи сравниваешь.
Ты реши задачи свитч/визитёр, на не предлагай решение для совершенно других задач.

fkthat
Понятно, что я его не сам изобрел - если бы я его изобрел, то, возможно, и работал бы с АА, а не с мудятлами, которые object.IsNull() создают


Хм, а сможешь ответить на вопрос, когда расширение IsNull() действительно может принести пользу?
Я -- могу :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026716
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ты сварганил "на коленке" медиатор.
Медиатор совсем для другого, несмотря на схожесть.авторПосредник (англ. Mediator) — поведенческий шаблон проектирования, обеспечивающий взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.
hVostt
это тот же свитч
Скопируй это к себе в редактор ПХП и сделай Ctrl-F по слову switch
hVostt
Можно добавить команду и забыть создать/зарегистрировать хендлер — получишь ошибку в рантайме.
Добавить команду и забыть создать ветку в switch (или забыть сделать метод для обработки) - будет то же самое. Если не хуже.
hVostt
Ты реши задачи свитч/визитёр, на не предлагай решение для совершенно других задач.
Проехали. Забей.
hVostt
когда расширение IsNull() действительно может принести пользу?
Забей. Проехали.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026747
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ты сварганил "на коленке" медиатор.
Медиатор совсем для другого, несмотря на схожесть.авторПосредник (англ. Mediator) — поведенческий шаблон проектирования, обеспечивающий взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.


Т.е. ты не видишь, что сделал медиатор?

Ну ок..


fkthat
hVostt
это тот же свитч
Скопируй это к себе в редактор ПХП и сделай Ctrl-F по слову switch


И ты не видишь, что логика свитча легко прослеживается? Там даже место есть, которое можно было бы развернуть в обычный свитч?

Ну ок-ок..


fkthat
hVostt
Ты реши задачи свитч/визитёр, на не предлагай решение для совершенно других задач.
Проехали. Забей.
hVostt
когда расширение IsNull() действительно может принести пользу?
Забей. Проехали.


Ну штош. Выводы. Тебе не нравится визитор, потому что "он плахой", без объяснения причин :)
А свитч тожа плахой...

Ок.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026789
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
что сделал медиатор

Хорошо - пусть будет медиатор. И класс Program это тоже медиатор, который медиирует все входные данные и код их обработки
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026803
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
что сделал медиатор

Хорошо - пусть будет медиатор. И класс Program это тоже медиатор, который медиирует все входные данные и код их обработки


Что значит "пусть будет"? Это медиатор, явный стопудовый медиатор.

Единственная проблема в твоём коде, что ты его не доделал.

Код: c#
1.
2.
3.
Command cmd = new FooCommand();
var handler = factory.GetCommandHandler(cmd.GetType());
handler.HandleCommand(cmd);



Если ты предлагаешь каждому клиенту вот такой хернёй страдать, то это говнокодище просто адское :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026804
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

К слову, зачем пилить костыли, когда всё уже давно написано:

https://github.com/jbogard/MediatR/wiki#requestresponse
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026824
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
fkthat,

К слову, зачем пилить костыли, когда всё уже давно написано:

https://github.com/jbogard/MediatR/wiki#requestresponse

Я прекрасно про это знаю, и использовал. Просто тпоказал, как все это легко можно делать без свича на стопятьсот кейсов.
hVostt
Если ты предлагаешь каждому клиенту

Нет, конечно. Опять-таки, это только пример, как нормальные люди свич без свича делают. Или, может быть, у вас и для массива из полсотни переменных тоже заводят int x1, x2, ..., x50; ?) Ну а что, если у вас в ПХП запросто пишут свич дюжин на пять кейсов (я сам такое видел), то я вполне поверю и в массивы.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026832
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

И то, что MediatR назвали медиатром еще не делает его медиатором. Назвать его могли хоть дикобразом, если бы захотели.

hVostt
Тебе не нравится визитор, потому что "он плахой", без объяснения причин

Я не писал, что мне он не нравится или он плохой, разве что если в шутку. Для C++ это очень изящный паттерн и его небольшие (даже и не технические, а, скорее идеологические) недостатки они ничтожны по сравнению с преимуществами. Но для дотнет это просто не нужно, потому что за счет уже готового RTTI (GetType и проч.) обработку и так можно распедалить по обработчикам не прибегая к каким-то специальным приемам. В визиторе по факту просто эмулируется RTTI - визитируемый объект за счет того, что знает свой тип выбирает тот или иной вызов визитора.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026847
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
fkthat,

К слову, зачем пилить костыли, когда всё уже давно написано:

https://github.com/jbogard/MediatR/wiki#requestresponse

Я прекрасно про это знаю, и использовал. Просто тпоказал, как все это легко можно делать без свича на стопятьсот кейсов.


Это не замена свича, ещё раз.

И ты никак не прокомментировал те проблемы, которые здесь также уместны, как и у свича.

fkthat
Нет, конечно. Опять-таки, это только пример, как нормальные люди свич без свича делают.


Фигню какую-то говоришь. Нормальные люди хлеб ножом режут, а дрова топором рубят.
Ты в какой-то нездоровый фанатизм ударился, говоришь нож не нужен, всё топором можно делать.

Другую задачу совершенно решает твой код, это медиатор, известно за какой профит надо так изъёбываться с огромных нагромождением интерфейсов и классов.

У тебя какая-то каша в голове натуральная :)


fkthat
Ну а что, если у вас в ПХП запросто пишут свич дюжин на пять кейсов (я сам такое видел), то я вполне поверю и в массивы.


Если ты видел, как ножом операцию на глаз делают, и это тебя возмутило -- это не значит, что как инструмент нож -- плохой. Это же детский сад какой-то.

Давай как инженеры рассуждать, а не как бабки базарные :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026848
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat

И то, что MediatR назвали медиатром еще не делает его медиатором. Назвать его могли хоть дикобразом, если бы захотели.


Пля, это и есть медиатор. Как его назвали -- дело десятое.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026849
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Но для дотнет это просто не нужно, потому что за счет уже готового RTTI (GetType и проч.)


Да что ты говоришь! А то на C++ нельзя дискриминатор добавить и базовый интерфейс. Прям C++ ущербней, чем C#
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026863
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Но для дотнет это просто не нужно, потому что за счет уже готового RTTI (GetType и проч.) обработку и так можно распедалить по обработчикам не прибегая к каким-то специальным приемам.


Не говори ерунды. Рефлексия в C# так-то и есть "специальный приём", посмотри на внутренности MediatR, сколько же там "готового" и сколько там приёмов.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class BaseCommand {
 protected:
  int type_;

 public:
  BaseCommand(int t) : type_(t) {
  }
};



Выбирай удобный дискриминатор, и всё, отличий практически никаких не будет.

А визитор совершенно другие задачи решает. Просто опыта у тебя пока не хватает.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026872
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
нельзя дискриминатор добавить

Можно, где я говорил что нельзя. Это и есть другой способ изобретения своего RTTI за отстутствием готового. И, в отличии от визитора, этот способ это действительно гамно. Во-первых, надо заморачиваться хотя бы уже над тем, чтобы дискриминаторы были уникальные (при том, что ты можешь захотеть раскидать производные классы по разным сборкам/библиотекам, т.ч. список констант тебя тут не выручит). Во-вторых, что самое важное, операция кастинга все равно останется небезопасной - допустим, у тебя какой-то объект из-за очепятки в коде вернет тебе дискриминатор не своего типа, потом ты его возьмешь и апкастишь к этому типу, и тогда у тебя случится джоппа, причем, очень вероятно вообще космических масштабов - будешь сидеть потом по ночам и дампы мемасика разгребать. Визитор же делает все это абсолютно безопасным способом. Но, просто, еще раз, - в дотнете этого просто-напросто не требуется, потому что и так все делается и прямолинейно без "миска поит кота", и при этом безопасно.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026875
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Рефлексия в C# так-то и есть "специальный приём"

Using в C# это так-то тоже специальный прием. Но, хорошо, раз ты сказал, то перепишем теперь все на try/finally, чтобы не прибегать к "специальным приемам"

hVostt
посмотри на внутренности MediatR, сколько же там "готового"

Я и так на него почти каждый день смотрю, потому что мы его используем. Или ты по примеру кода на скуле решил что я его из продакшена взял?
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026878
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Выбирай удобный дискриминатор

У меня и так есть готовый дескриминатор. GetType() называется. Но, если ты про него не знаешь, то можешь делать свои дискриминаторы, кто же тебе запретит
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026911
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

Ок, пофигу, раз в твоей картине мира медиатор это улучшенная версия свича (топор -- улучшенная версия ножа, ага-ага), ты объясни, как твой медиатор решает проблемы свича?

Визитор -- решает.
А твой медиатор -- нет.

В чём смысл того, за что ты топишь? :)

Ты как бы говоришь, визитор хороший только в C++, а в C# плохой, ну потому что в C# есть GetType() (мухахха), ну ок -- это прям субъективное твоё мнение, спорить бесполезно, принимаем.

И что дальше-то? Он же не решает проблемы свича, которые решает визитор ))))
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026932
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
как твой медиатор решает проблемы свича

У меня не медиатор и я как раз не собираюсь, как ты, медиатором решать проблемы свича

Ты прочитал книгу Гамма сотоварищи, чтобы собеседование на работу пройти, поэтому сейчас упираешься в какие-то очень частные реализации из интернета, а общей картины не понимаешь

Медиатор для того чтобы лапшевидный говнограф взаимодействий и зависимостей кучи объектов друг с другом заменить простой схемой где каждый объект взаимодействует только с общим объектом-медиатором. И он может быть реализован вообще без всяких абстракций, полиморфизма, наследования и т.п.- требуется только что каждый объект знает про медиатор, а медиатор знает о каждом из объектов, над которыми он медитирует. Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например, паблишить события, на которые медиатор подписывается. Например, винформовская форма, в случае простейшего использования (без MVVM и прочих) это пример медиатора своих дочерних контролов - кнопка "баттон" не меняет напрямую цвет текста "текстбокс", а делает это через форму (вызовом баттон-клика через свое событие), а текстбокс в свою очередь при вводе текста не меняет напрямую надпись на кнопке, а тоже отправляет событие форме, и т.д.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026941
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ты объясни, как твой медиатор решает проблемы свича

Так и решает. Если у меня появляется новая команда (т.е. новый кейс), то я просто наследую её от абстрактной, пишу для неё отдельный обработчик ICommandHandler, или добавляю её обработку в существующий и регаю эго (а в реале это вообще будет все готовое через DI). В уже существующий код, в отличие от свича, я при этом вообще не лезу, могу все разработчики раскидать/сгруппировать так как мне удобно по отдельным классам, неймспейсам, сборкам и прочему, и мне не нужна нечитабельная свичевая простыня, где для каждой из стопятьсот команд отдельный кейс, так, как ты наизобретал со своими дискриминантами.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026942
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
У меня не медиатор и я как раз не собираюсь, как ты, медиатором решать проблемы свича


Ну объективно код, который ты привёл -- это медиатор.
Как ты там лично для себя считаешь, это уже вопрос твоих личных фантазий.

fkthat
Ты прочитал книгу Гамма сотоварищи, чтобы собеседование на работу пройти, поэтому сейчас упираешься в какие-то очень частные реализации из интернета, а общей картины не понимаешь


Я не упираюсь, это объективная реальность.

Вот как раз ты сам себе противоречишь )


fkthat
Медиатор для того чтобы лапшевидный говнограф взаимодействий и зависимостей кучи объектов друг с другом заменить простой схемой где каждый объект взаимодействует только с общим объектом-медиатором. И он может быть реализован вообще без всяких абстракций, полиморфизма, наследования и т.п.- требуется только что каждый объект знает про медиатор, а медиатор знает о каждом из объектов, над которыми он медитирует. Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например, паблишить события, на которые медиатор подписывается. Например, винформовская форма, в случае простейшего использования (без MVVM и прочих) это пример медиатора своих дочерних контролов - кнопка "баттон" не меняет напрямую цвет текста "текстбокс", а делает это через форму (вызовом баттон-клика через свое событие), а текстбокс в свою очередь при вводе текста не меняет напрямую надпись на кнопке, а тоже отправляет событие форме, и т.д.


Ты рассказал как раз про свой код, который привёл :)
И это медиатор.

Медатор это не обязательно про события, если что.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026948
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
ак и решает. Если у меня появляется новая команда (т.е. новый кейс), то я просто наследую её от абстрактной, пишу для неё отдельный обработчик ICommandHandler, или добавляю её обработку в существующий и регаю эго (а в реале это вообще будет все готовое через DI). В уже существующий код, в отличие от свича, я при этом вообще не лезу, могу все разработчики раскидать/сгруппировать так как мне удобно по отдельным классам, неймспейсам, сборкам и прочему, и мне не нужна нечитабельная свичевая простыня, где для каждой из стопятьсот команд отдельный кейс, так, как ты наизобретал со своими дискриминантами.


Ты можешь:
1. забыть написать отедельный обработчик
2. забыть его зарегистрировать

то, что ты там куда-то "не лезешь", имеет и обратную сторону.

Теперь из прикладного кода добраться до хендлера невозможно обычным способом.

У меня был на руках проект, построенный полностью на этой архитектуре, разработчики, которые его писали, матом крыли ОРХИТЕКТОРА , который так придумал. Рассказывают, что это полный ппц и боль.

И не надо травить байки про слабую связанность, бла-бла, где хочешь обработчик свой разместил, ага, да нахер это не упёрлось обычному рядовому прикладному разработчику. Нужно писать простой код, вопрос гибкости и расширяемости это для разработчиков core-платформы.

Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026952
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну объективно код, который ты привёл -- это медиатор.
Нет.
hVostt
И это медиатор
Нет.

hVostt
Я не упираюсь, это объективная реальность.
Это реальность объективная ровно настолько же, насколько твой разум, потому что только там она и существует

hVostt
Медатор это не обязательно про события, если что.
Я об этом написал, ты просто не читал.
fkthat
Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например , паблишить события, на которые медиатор подписывается.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026953
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Ну объективно код, который ты привёл -- это медиатор.
Нет.
hVostt
И это медиатор
Нет.


Я не могу спорить с твоим субъективным восприятием.
Принимаю, что лично для тебя -- это нет.

Все коллеги, с которыми я работаю и работал -- они знают, что это медиатор, значит мы с ними общаемся эффективно на одном языке.

Я даж не знаю, _что это такое_ у тебя в фантазиях, если не медиатор )))
Хоть бы дал имя _этому_.

Продвинутый шарп-свитч?
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026954
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Я об этом написал, ты просто не читал.
fkthat
Объекты, причем, могут и не вызывать напрямую медиатор, и даже не знать о нем, а, например , паблишить события, на которые медиатор подписывается.


Куда они "паблишат"? В космос чтоли? )))))))
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026955
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
медиатор подписывается


Если что, медиатор никуда не подписывается :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026956
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Теперь из прикладного кода добраться до хендлера невозможно обычным способом.

Во первых, зачем он тебе напрямую? А, во-вторых, почему нельзя? Сделай его паблик класс, и добирайся как хочешь, если тебе так это горит (непонятно только, опять-таки, зачем - ты же не паришься, когда инжектишь по DI интерфейсы вместо реализаций). А можешь даже все его приватные поля сразу объявить как паблик, чтобы добираться можно было
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026957
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом.

Хорошо, если такой системщик всех системщиков не разрешает, то лезть не будем, уговорил
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026958
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Теперь из прикладного кода добраться до хендлера невозможно обычным способом.

Во первых, зачем он тебе напрямую? А, во-вторых, почему нельзя? Сделай его паблик класс, и добирайся как хочешь, если тебе так это горит (непонятно только, опять-таки, зачем - ты же не паришься, когда инжектишь по DI интерфейсы вместо реализаций). А можешь даже все его приватные поля сразу объявить как паблик, чтобы добираться можно было


Что значит зачем? Мне нужно попасть в реализацию. Как мне это сделать быстро?
Нужно найти все usages команды и найти среди них реализацию хендлера.

А если хендлера больше, чем один? И по какой-то упоротой логике подключается либо один, либо второй, либо третий. Какой в итоге тот самый?

На маленьких проектах это не так болезненно. А когда всё абсолютно сделано через медиатор, начинается ад.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026959
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом.

Хорошо, если такой системщик всех системщиков не разрешает, то лезть не будем, уговорил


Ну ты знаешь наверное эту тему "всё есть -- object"?

Есть ещё такой нездоровый фанатизм абстрациями, нужно ими обмазаться и считать что медиатор с кучей классов: команды, фабрики, регистрации, хендлера, шины команд -- вот это всё с какого-то мать его перепугу ПРОЩЕ чем свитч.

Серьёзно? На коленке накидаю 100500 классов, чтобы сделать выбор между 2-3 вариантами? А вдруг завтра ещё 2 добавиться, это же что такое?!? Надо подстраховаться и обмазаться ещё парой слоёв абстракций...
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40026961
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Хуже нет, когда прикладники начинают лезть в core со своим ограниченным опытом.

Хорошо, если такой системщик всех системщиков не разрешает, то лезть не будем, уговорил


Опытный программист знает, что нет абсолютно плохого или хорошего.
Что мир не чёрно-белый.
Разработка это компромисс.

Он знает, что есть задачи, уместные для свитча, для визитора, а другие задачи хорошо решает медиатор.

Когда перед тобой чувак, брызгая слюной орёт, что всё говно, надо писать только команды и хендлеры -- ну ты понял, да? ))
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40028385
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt

Ты сварганил "на коленке" медиатор. Это другой паттерн и решает другие задачи.

Что то тоже не вижу, где там медиатор, и между чем он посредничает.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40028501
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
Что то тоже не вижу, где там медиатор,

У хВоста такой стиль - он как уцепился за что-то, так будет спорить без конца. Специалист крутой, но упертый, что песец.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40028529
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 это не медиатор, а назвали её так, потому что разработчики были бухие и укуренные, и другие названия для библиотек закончились :)
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40028631
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt

А что, извините, тогда вы видите?

Там простой приём рефакторинга по разветвлению условий классами.
В народе, иногда звучит как Replace Conditional with Polymorphism
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40028637
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
Там простой приём рефакторинга по разветвлению условий классами.
В народе, иногда звучит как Replace Conditional with Polymorphism


Как всё печально.. штош, спорить не буду.
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40030430
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Как всё печально.. штош, спорить не буду.


Хвост, есть древняя притчя про слона и древних мудрецов, которых пригласили его потрогать
...
Рейтинг: 0 / 0
IDisposable и структуры
    #40030549
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Как всё печально.. штош, спорить не буду.


Хвост, есть древняя притчя про слона и древних мудрецов, которых пригласили его потрогать


Ну да, а программа это всего лишь набор байт.
А люди это лишь набор молекул.

Мудрецы -- они такие.
...
Рейтинг: 0 / 0
109 сообщений из 109, показаны все 5 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IDisposable и структуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]