русский

Страсти по делегатам

2503  1 2 3 4 alle
Срыв покровов патриот14.03.24 16:43
14.03.24 16:43 

Всем привет, особенно староверам, стирающим бельё в проруби.


В общем задача на Entity Framework. Как динамично передавать фильтры в запросы, мы уже проходили в прошлой ветке.
Теперь хотеся запрещеночки - передавать условия, связанные с другими Entities.

Но что-то не пойму как.


то есть запрос должен получится примерно такой

Select * from Person P

where exists (

select 1 from Event E

where E.name = P.Name

)


код: https://onlinegdb.com/htZocG0E4

#1 
Murr патриот14.03.24 17:40
Murr
NEW 14.03.24 17:40 
in Antwort Срыв покровов 14.03.24 16:43

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

#2 
alex445 коренной житель14.03.24 18:00
NEW 14.03.24 18:00 
in Antwort Срыв покровов 14.03.24 16:43
Срыв покровов патриот14.03.24 18:42
NEW 14.03.24 18:42 
in Antwort alex445 14.03.24 18:00

не хочу, с таким же успехом я могу чистый SQL писать

#4 
AlexNek патриот14.03.24 19:07
AlexNek
NEW 14.03.24 19:07 
in Antwort Срыв покровов 14.03.24 16:43

Никогда подобное еще не интересовало.


Но вроде пользуются только двумя вариантами: Expression trees и Dynamic LINQ library

https://www.bytehide.com/blog/dynamic-linq-query-csharp

Вот может быть интересная реализация

https://blog.jeremylikness.com/blog/dynamically-build-linq...


#5 
alex445 коренной житель14.03.24 19:29
NEW 14.03.24 19:29 
in Antwort Срыв покровов 14.03.24 18:42
не хочу, с таким же успехом я могу чистый SQL писать

Не с таким же.

#6 
alex445 коренной житель14.03.24 21:02
NEW 14.03.24 21:02 
in Antwort AlexNek 14.03.24 19:07

Вот может быть интересная реализация

https://blog.jeremylikness.com/blog/dynamically-build-linq...

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

#7 
AlexNek патриот14.03.24 21:22
AlexNek
NEW 14.03.24 21:22 
in Antwort alex445 14.03.24 21:02, Zuletzt geändert 14.03.24 21:23 (AlexNek)
А шо случилось? -- "Теперь хотеся запрещеночки "

Ну так сколько раз повторять - всё зависит от ситуации.

Ведь не обсуждается вопрос хорошо это или плохо, нужно применять или не нужно. Понадобилось кому то.


А может та ссылка была ещё выставлена в понедельник 13-го смущ И неизвестно под каким соусом, может опять переперчили бебе

#8 
Срыв покровов патриот14.03.24 22:54
NEW 14.03.24 22:54 
in Antwort AlexNek 14.03.24 19:07

по первой ссылке нет ничего про Linq to Entities

По второй - если оно и заработает, то оно все без синтаксической проверки - то есть очень большая опасность словить ошибку в рантайме.

#9 
AlexNek патриот14.03.24 23:28
AlexNek
NEW 14.03.24 23:28 
in Antwort Срыв покровов 14.03.24 22:54
нет ничего про Linq to Entities

А что под этим конкретно имеется виду?


Ничего особенно тут не заметил смущ

https://learn.microsoft.com/en-us/dotnet/framework/data/ad...

#10 
Срыв покровов патриот15.03.24 06:25
NEW 15.03.24 06:25 
in Antwort AlexNek 14.03.24 23:28

пол этим имеется в виду, что не любой Linq переводится в SQL.

#11 
AlexNek патриот15.03.24 18:06
AlexNek
NEW 15.03.24 18:06 
in Antwort Срыв покровов 14.03.24 16:43

А так не пробовали?

var result2 = query.Where(p => advancedCondition.Compile().Invoke(db, p)).ToList();


вот еще попалось но не разбирался. Может на что натолкнёт смущ

https://www.roundthecode.com/dotnet-tutorials/using-linq-e...

https://www.codeproject.com/Articles/5358166/A-Dynamic-Whe...

#12 
Срыв покровов патриот16.03.24 07:39
NEW 16.03.24 07:39 
in Antwort AlexNek 15.03.24 18:06

так ошибка вылетает еще перед обращением в БД.

ToList тут не поможет.

#13 
Murr патриот16.03.24 07:58
Murr
NEW 16.03.24 07:58 
in Antwort Срыв покровов 16.03.24 07:39

А ты ее в ToSql() конвертни и погляди что там будет.

#14 
Срыв покровов патриот16.03.24 19:43
NEW 16.03.24 19:43 
in Antwort Murr 16.03.24 07:58

в ПН попробую

#15 
Срыв покровов патриот25.03.24 14:18
NEW 25.03.24 14:18 
in Antwort Срыв покровов 14.03.24 16:43

коллега помог up

static void Main(string[] args)
{
     Func<DbEntities, Expression<Func<Person, bool>>> funky = 
        db => 
            p => db.Set<Event>().Any(e => e.Author == p.Name);

    SomeDbRequest(funky);
}

static void SomeDbRequest(Func<DbEntities, Expression<Func<Person, bool>>> advancedCondition)
{
    using (DbEntities db = new DbEntities())
    {
        Expression<Func<Person, bool>> expression = advancedCondition(db);
        
        var result2 = query.Where(expression);
    }
}
#16 
7495 старожил25.03.24 15:40
7495
NEW 25.03.24 15:40 
in Antwort Срыв покровов 25.03.24 14:18

с одной стороны, молодец, решил

С другой - опять же нифига не понял, в чем проблема была

Fragen und Antworten - Программируем калькулятор пособий для беженцев вместе.
#17 
alex445 коренной житель25.03.24 15:53
NEW 25.03.24 15:53 
in Antwort Срыв покровов 14.03.24 16:43, Zuletzt geändert 25.03.24 15:53 (alex445)

то есть запрос должен получится примерно такой

Select * from Person P
where exists (
select 1 from Event E
where E.name = P.Name
)

Чёт не понял. А так почему не подходит? Или джойны, как там же сказали.

#18 
Срыв покровов патриот25.03.24 16:38
NEW 25.03.24 16:38 
in Antwort alex445 25.03.24 15:53
static void SomeDbRequest(Func<DbEntities, Expression<Func<Person, bool>>> advancedCondition)
{
    using (DbEntities db = new DbEntities())
    {       
        var result2 = query.Where(p => db.Set<Event>().Any(e => e.Author == p.Name));
    }
}

оно и без джойнов работает
вопрос был в том, как этот предикат передать извне

#19 
Срыв покровов патриот25.03.24 16:40
NEW 25.03.24 16:40 
in Antwort 7495 25.03.24 15:40
oпять же нифига не понял, в чем проблема была

это ветка не совсем для тебя, чел. Сорри

#20 
AlexNek патриот25.03.24 19:58
AlexNek
NEW 25.03.24 19:58 
in Antwort Срыв покровов 25.03.24 14:18

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

#21 
Срыв покровов патриот26.03.24 06:40
NEW 26.03.24 06:40 
in Antwort AlexNek 25.03.24 19:58

а теперь модифицируем задачу:

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

#22 
AlexNek патриот26.03.24 10:35
AlexNek
NEW 26.03.24 10:35 
in Antwort Срыв покровов 26.03.24 06:40

видимо срочно надо... может чем то поможет.

Обычно можно сделать так

var personsNotInEvent = dbContext.Persons
    .Where(p => !dbContext.Events.Any(e => e.PersonId == p.PersonId))
        .ToList();
#23 
alex445 коренной житель26.03.24 11:31
NEW 26.03.24 11:31 
in Antwort AlexNek 26.03.24 10:35

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

#24 
Срыв покровов патриот26.03.24 11:38
NEW 26.03.24 11:38 
in Antwort alex445 26.03.24 11:31
Только у вас подзапрос будет выполняться на каждое вхождение основного запроса (саечка за неоптимальность улыб)

нука расскажи, почему ты так решил?

Это то, что я выше предлагал.

ничего дельного ты тут не предложил

#25 
Срыв покровов патриот26.03.24 11:41
NEW 26.03.24 11:41 
in Antwort AlexNek 26.03.24 10:35
Обычно можно сделать так

это правильный ответ
но чтобы сохранить интригу, что изменится от того, если ЛИНК написать так(как у нас внегласно заведено)?

вместо ! напишем == false

var personsNotInEvent = dbContext.Persons
    .Where(p => dbContext.Events.Any(e => e.PersonId == p.PersonId) == false)
        .ToList();
#26 
alex445 коренной житель26.03.24 13:39
NEW 26.03.24 13:39 
in Antwort Срыв покровов 26.03.24 11:38, Zuletzt geändert 26.03.24 13:41 (alex445)
Только у вас подзапрос будет выполняться на каждое вхождение основного запроса (саечка за неоптимальность улыб)
нука расскажи, почему ты так решил?

потому что делегат в where выполняется для каждого вхождения

#27 
alex445 коренной житель26.03.24 13:43
NEW 26.03.24 13:43 
in Antwort Срыв покровов 26.03.24 11:41
var personsNotInEvent = dbContext.Persons
    .Where(p => dbContext.Events.Any(e => e.PersonId == p.PersonId) == false)
        .ToList();

Вы начитались "каверзных вопросов", где требуют знать все тонкости, как построитель и оптимизатор запросов внутри преобразует те или иные условия в фильтрующих делегатах?

#28 
Срыв покровов патриот26.03.24 14:06
NEW 26.03.24 14:06 
in Antwort alex445 26.03.24 13:39
потому что делегат в where выполняется для каждого вхождения

бред какой
весь этот LINQ конвертируется в один SQL-запрос

#29 
Срыв покровов патриот26.03.24 14:07
NEW 26.03.24 14:07 
in Antwort alex445 26.03.24 13:43
Вы начитались "каверзных вопросов", где требуют знать все тонкости, как построитель и оптимизатор запросов внутри преобразует те или иные условия в фильтрующих делегатах?

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

#30 
alex445 коренной житель26.03.24 14:24
NEW 26.03.24 14:24 
in Antwort Срыв покровов 26.03.24 14:06
весь этот LINQ конвертируется в один SQL-запрос

А если я использую в


dbContext.Events.Any(e => e.PersonId == p.PersonId)


какую-нибудь внешнюю по отношению к запросу коллекцию, типа


myCollection.Contains(item => item.PersonId == p.PersonId)


то вся коллекция myCollection будет передана в запрос?

#31 
AlexNek патриот26.03.24 17:33
AlexNek
NEW 26.03.24 17:33 
in Antwort Срыв покровов 26.03.24 11:41

Linqpad даёт следующее


List<LiveResult> (2 items)•••
Case ResultsGraph Mean Min Max Range AllocatedBytesΞΞ OperationsΞΞ Phase
BenchmarkDemoWhereNot 2.72 μs 2.67 μs 2.75 μs 3% 2'200 3'145'728 Complete
BenchmarkDemoWhereFalse 2.79 μs 2.70 μs 2.98 μs 10% 2'240 7'077'888 Complete
#32 
AlexNek патриот26.03.24 17:39
AlexNek
NEW 26.03.24 17:39 
in Antwort alex445 26.03.24 11:31
Это то, что я выше предлагал.

А можно оптимальный код повторить? смущ

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

#33 
Срыв покровов патриот26.03.24 18:37
NEW 26.03.24 18:37 
in Antwort alex445 26.03.24 14:24
какую-нибудь внешнюю по отношению к запросу коллекцию, типа


myCollection.Contains(item => item.PersonId == p.PersonId)


то вся коллекция myCollection будет передана в запрос?

Это имхо вообще не переведётся в SQL.
А вот если у тебя будет коллекция простых integer, то да, все значения передадутся в запрос.


А ты как думал: на каждый элемент по запросу в БД?))

#34 
Срыв покровов патриот26.03.24 18:38
NEW 26.03.24 18:38 
in Antwort AlexNek 26.03.24 17:33

твои бенчмарки в базу данных лезут или в памяти работают?

#35 
AlexNek патриот26.03.24 19:20
AlexNek
NEW 26.03.24 19:20 
in Antwort Срыв покровов 26.03.24 18:38

Там локальная SQLite, хотя обновил до нет 8.0

Немного изменил под существующие таблицы

#load "BenchmarkDotNet"

void Main()
{

}

[Benchmark]
public void BenchmarkDemoWhereNot() 
{
    var context = this;
    
    var personsNotInEvent = context.Artists
                    .Where (p => !Albums.Any(e => e.ArtistId == p.ArtistId));
}

[Benchmark]
public void BenchmarkDemoWhereFalse()
{
    var context = this;
    
    var personsNotInEvent = context.Artists
                    .Where (p => Albums.Any(e => e.ArtistId == p.ArtistId) == false);
}
#36 
alex445 коренной житель26.03.24 22:39
NEW 26.03.24 22:39 
in Antwort Срыв покровов 26.03.24 18:37
А ты как думал: на каждый элемент по запросу в БД?))

А я не помню, как оно работает. Вроде, если сущности из одного контекста, то он пытается это в один запрос сделать. Но в моём примере по ссылке либо джойны придлагают, либо сначала сделать один запрос, превратить его в просто коллекцию объектов, а потом второй запрос с использованием этой коллекции.

#37 
Срыв покровов патриот26.03.24 23:21
NEW 26.03.24 23:21 
in Antwort alex445 26.03.24 22:39

Я-то думал, ты в ЕФ шаришь
А ты теоретик.

#38 
Срыв покровов патриот26.03.24 23:24
NEW 26.03.24 23:24 
in Antwort AlexNek 26.03.24 19:20

ну и как, есть разница в скорости в SQL Lite?

И интересно было бы посмотреть сгенерированный SQL.
Я не исключаю, что моя проблема существует только при работе с ораклом.

#39 
AlexNek патриот26.03.24 23:36
AlexNek
NEW 26.03.24 23:36 
in Antwort Срыв покровов 26.03.24 23:24
И интересно было бы посмотреть сгенерированный SQL.

но проблемо, для этого linqpad и открывался

SELECT "a"."ArtistId", "a"."Name"
FROM "Artist" AS "a"
WHERE NOT EXISTS (
    SELECT 1
    FROM "Album" AS "a0"
    WHERE "a0"."ArtistId" = "a"."ArtistId")


ну и как, есть разница в скорости в SQL Lite?

на такой мелочевке данных то.


Отчего - это нужно изучать специально. Может и нет 8.0 починили

#40 
alex445 коренной житель27.03.24 06:17
NEW 27.03.24 06:17 
in Antwort Срыв покровов 26.03.24 23:21

Я-то думал, ты в ЕФ шаришь
А ты теоретик.

Я в последнее время с ним давно не работал. Так, мелочь. В основном приходится со старым самописным дерьмом разбираться в теме общения с БД. Зато не всякое старьё APS.NET MVC использую, как некоторые, а новомодный Blazor. ))

#41 
Срыв покровов патриот27.03.24 07:17
NEW 27.03.24 07:17 
in Antwort alex445 27.03.24 06:17
Я в последнее время с ним давно не работал

мы ж тут не на собеседовании, можешь так и сказать, что написал хеллоуворлд на ЕФ и полтора курса прошел))

#42 
Срыв покровов патриот27.03.24 08:39
NEW 27.03.24 08:39 
in Antwort AlexNek 26.03.24 23:36

Вариант с == false генерерует в оракле вот такой запрос
и он гораздо медленнеее

SELECT "a"."ArtistId", "a"."Name"
FROM "Artist" AS "a"
WHERE 0 = CASE WHEN EXISTS (
    SELECT 1
    FROM "Album" AS "a0"
    WHERE "a0"."ArtistId" = "a"."ArtistId") 
THEN 1 ELSE o END
#43 
alex445 коренной житель27.03.24 11:06
NEW 27.03.24 11:06 
in Antwort Срыв покровов 27.03.24 07:17

Не, почему, когда-то писал и code first, но теперь снова букварь надо читать, чтобы вспомнить, что там и как. Так-то подключиться к БД через контекст и что-то там позапрашивать могу - много ума не надо.

#44 
Срыв покровов патриот27.03.24 21:34
NEW 27.03.24 21:34 
in Antwort alex445 27.03.24 11:06

это я заметил.
у меня в соседнем проекте тоже коллеги местами не знают, в какой момент происходит запрос к БД.

#45 
alex445 коренной житель27.03.24 21:49
NEW 27.03.24 21:49 
in Antwort Срыв покровов 27.03.24 21:34, Zuletzt geändert 27.03.24 22:08 (alex445)

На работе ценится не зазубривание букварей, а умение решать неожиданно всплывающие проблемы типа таких, когда не понимаешь, почему и откуда. Вон, народ по 15 и более лет всё понять не может, почему им Студия не называет конкретную причину ошибки, которая может остоять от декларированной на несколько шагов.

#46 
AlexNek патриот27.03.24 21:54
AlexNek
NEW 27.03.24 21:54 
in Antwort Срыв покровов 27.03.24 08:39

Странно, жалко Оракле снёс, интересно что дуреет.

#47 
Срыв покровов патриот27.03.24 22:20
NEW 27.03.24 22:20 
in Antwort AlexNek 27.03.24 21:54

вангую, что Oracle.ManagedDataAccess.EntityFramework.dll

#48 
Срыв покровов патриот27.03.24 22:24
NEW 27.03.24 22:24 
in Antwort alex445 27.03.24 21:49
На работе ценится не зазубривание букварей

Никто этого и не требует

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

#49 
AlexNek патриот27.03.24 22:33
AlexNek
NEW 27.03.24 22:33 
in Antwort Срыв покровов 27.03.24 22:20
что Oracle.ManagedDataAccess.EntityFramework.dll

всё может быть, что Oracle.* смущ


Oracle.ManagedDataAccess.Core

#50 
alex445 коренной житель27.03.24 22:53
NEW 27.03.24 22:53 
in Antwort Срыв покровов 27.03.24 22:24

На работе ценится не зазубривание букварей

Никто этого и не требует

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

Если ребята с этим EF не работали, или мало работали - это нормально. Показать им, как надо, объяснить - в чём проблема?

#51 
Срыв покровов патриот28.03.24 06:54
NEW 28.03.24 06:54 
in Antwort AlexNek 27.03.24 22:33
Oracle.ManagedDataAccess.Core

там то же самое

Правда не последняя версия

#52 
alex445 коренной житель28.03.24 15:10
NEW 28.03.24 15:10 
in Antwort Срыв покровов 27.03.24 22:24
это гораздо важнее экономии 40% кода посредством использования новых фич.

Это ещё и 40% понимания добавляет. Когда у тебя весь класс на одном экране, а не на пяти, потому что чел решил везде писать типа такого


private Obj _obj;
public Obj Obj
{
    get
    {
        if(_obj == null)
        {
            _obj = new Obj();
        }
        return _obj;
    }
}


вместо такого


private Obj _obj;
public Obj Obj => _obj ??= new ();
#53 
alex445 коренной житель28.03.24 15:28
NEW 28.03.24 15:28 
in Antwort alex445 28.03.24 15:10, Zuletzt geändert 28.03.24 15:30 (alex445)

А вообще, есть у кого-нибудь такие правила по оформлению кода, что типа в этом проекте запрещено использовать инициализаторы - нужно обычный конструктор и потом каждый раз созданному объекту свойства присваивать? Или свичи новые нельзя - только старые (которые statement, а не expression). Или нельзя использовать часть операторов - например ??= и прочие null-coalescing и null-propagation? Или нельзя bodies expressions (со стрелочками)? Нельзя лямбды - метод отдельный специально определяй. При этом язык и версия фреймворка позволяют. Т.е. нужно себя заставить писать где-то на уровне C# 2, но на версии C# 12 (.NET 8).

#54 
Срыв покровов патриот28.03.24 17:20
NEW 28.03.24 17:20 
in Antwort alex445 28.03.24 15:10

твоя простыня это же эквивалент ?

public Obj Obj = new Obj() {get;}




#55 
Срыв покровов патриот28.03.24 17:22
NEW 28.03.24 17:22 
in Antwort alex445 28.03.24 15:28

у нас тут на днях прислали coding standards

В принципе все норм, но какой-то старпер запретил использовать + для конкатенации строк. только StringBuilder. Пришлось объяснить, что оно не всегда нужно.

#56 
alex445 коренной житель28.03.24 17:54
NEW 28.03.24 17:54 
in Antwort Срыв покровов 28.03.24 17:20

твоя простыня это же эквивалент ?

public Obj Obj = new Obj() {get;}

Не совсем. У вас нет модной ленивой инициализации.

#57 
alex445 коренной житель28.03.24 17:57
NEW 28.03.24 17:57 
in Antwort Срыв покровов 28.03.24 17:22, Zuletzt geändert 28.03.24 17:58 (alex445)
у нас тут на днях прислали coding standards
В принципе все норм, но какой-то старпер запретил использовать + для конкатенации строк. только StringBuilder. Пришлось объяснить, что оно не всегда нужно.

Это тоже запрещено?

А это?

#58 
Срыв покровов патриот28.03.24 18:08
NEW 28.03.24 18:08 
in Antwort alex445 28.03.24 17:54, Zuletzt geändert 28.03.24 18:09 (Срыв покровов)
Не совсем. У вас нет модной ленивой инициализации.

неприятность эту мы переживём.

#59 
Срыв покровов патриот28.03.24 18:14
NEW 28.03.24 18:14 
in Antwort alex445 28.03.24 15:10
public Obj Obj => _obj ??= new ();

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

#60 
AlexNek патриот28.03.24 18:38
AlexNek
NEW 28.03.24 18:38 
in Antwort alex445 28.03.24 15:10
40% понимания добавляет

Кому-то добавляет, кому-то отнимает...

#61 
AlexNek патриот28.03.24 18:45
AlexNek
NEW 28.03.24 18:45 
in Antwort alex445 28.03.24 15:28
есть у кого-нибудь такие правила по оформлению кода, что типа в этом проекте запрещено

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


#62 
alex445 коренной житель28.03.24 22:33
NEW 28.03.24 22:33 
in Antwort Срыв покровов 28.03.24 18:14
public Obj Obj => _obj ??= new ();

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

У вас наверное и от 2х2=4 он сломаться может?

Опасность всегда существует. Поскользнулся, упал, очнулся - гипс.

#63 
AlexNek патриот28.03.24 22:45
AlexNek
NEW 28.03.24 22:45 
in Antwort alex445 28.03.24 22:33
наверное и от 2х2=4 он сломаться может?

а то спок

        ConstantExpression constant2 = Expression.Constant(2);
        
        BinaryExpression multiply = Expression.Multiply(constant2, constant2);

        Expression<Func<int>> lambda = Expression.Lambda<Func<int>>(multiply);

        Func<int> multiplyFunc = lambda.Compile();

        int result = multiplyFunc();
#64 
Срыв покровов патриот28.03.24 23:45
NEW 28.03.24 23:45 
in Antwort AlexNek 28.03.24 22:45

зато как модно и молодёжно!

#65 
alex445 коренной житель29.03.24 01:23
NEW 29.03.24 01:23 
in Antwort AlexNek 28.03.24 22:45, Zuletzt geändert 29.03.24 01:25 (alex445)

И чё? Фабрика фабрик круче будет!


В моём-то примере наоборот упрощение.

#66 
AlexNek патриот29.03.24 10:27
AlexNek
NEW 29.03.24 10:27 
in Antwort alex445 29.03.24 01:23
В моём-то примере наоборот упрощение.

Количество строк не всегда означает проще.

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

#67 
alex445 коренной житель29.03.24 11:30
NEW 29.03.24 11:30 
in Antwort AlexNek 29.03.24 10:27

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


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

#68 
AlexNek патриот29.03.24 12:17
AlexNek
NEW 29.03.24 12:17 
in Antwort alex445 29.03.24 11:30
Если в вашем поселении не могут выучить один новый оператор в год,

Мне уже надоело повторять - не смотрите на проблему исключительно с своей личной точки зрения.


Проблема то разве в этом?

#69 
1 2 3 4 alle