вот нахрен так писать?
От: nikkit  
Дата: 13.08.23 19:15
Оценка: +1
это лишь лист от той партянки, в которой надо разобраться.
сложного ничего. да. но вот как с листа охватить взглядом реально вообще? специально не говорю какой контекст. т.к. тоже в первый раз отчет этот вижу. и даже не знаю работало там изначально или нет
просто мата не хватает. как такое можно поддерживать, не имея доступа к проду. и не зная как должно быть.
вот для кого пишут книжки типа канонической "чистый код"?
я бы на код ревью точно такое развернул нахрен. ну строк 10 кода, которые сможешь сразу прочитать — да. без проблем. но такое заворачивать.. НАХРЕНА???? Убил бы.
так он там блин еще коменты пишет о красоте кода....

var resultCollection = reportData.GroupBy(g => g.CropId).Select(g =>
            {
                var crop = g.First();
                return new PlanExecutionControlReportItem
                {
                    CropId = crop.CropId,
                    CropName = crop.CropName,
                    Technologies = g.GroupBy(t => t.TechnologyId).Select(t =>
                    {
                        var technologyFirst = t.First();
                        var dateRange = t
                            .Where(x => x.FactOperationSquare > 0)
                            .Select(x => x.FactDateEnd.Date)
                            .Distinct()
                            .OrderBy(d => d)
                            .ToArray();

                        if (t.Any(tr => tr.OperationGroupId.HasValue && tr.TreatmentId != Guid.Empty) && t.Key.HasValue)
                        {
                            var planExecutionControlItems = t.Where(x => x.OperationGroupId.HasValue).ToList();
                            var reportItem = new List<PlanExecutionControlReportTreatment>();
                            var excludedItems = new List<PlanExecutionControlItem>();
                            var operationGroupItems = planExecutionControlItems.GroupBy(x => x.OperationGroupId);
                            foreach (var group in operationGroupItems)
                            {
                                var operationTypeIds = operationTypes.Where(p => p.Value.Contains(group.Key.Value)).Select(p => p.Key).ToList();
                                operationTypeIds.Add(Guid.Empty);
                                var rows = group.Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId)).ToArray();
                                if (!rows.Any()) continue;
                                var operationItemRow = CreateReportItem(rows, dateRange, null, true);
                                reportItem.Add(operationItemRow);
                                var technologyOperation = rows.First();
                                var groupByTreatment = group.Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId)).GroupBy(x => x.TreatmentId);
                                foreach (var treatmentItems in groupByTreatment)
                                {
                                    if (!treatmentItems.Any()) continue;
                                    var treatmentRow = CreateReportItem(treatmentItems.ToArray(), dateRange, operationItemRow.Path.ToList(), false, operationItemRow.PlanDateBegin, operationItemRow.PlanDateStop, technologyOperation);
                                    reportItem.Add(treatmentRow);

                                    reportItem.AddRange(treatmentItems
                                        .Where(tr => tr.OperationGroupId == group.Key && operationTypeIds.Contains(tr.TreatmentId))
                                        .GroupBy(tr => new { tr.LayerId })
                                        .Select(tr => CreateReportItem(tr.ToArray(), dateRange, treatmentRow.Path.ToList(), false, treatmentRow.PlanDateBegin, treatmentRow.PlanDateStop, technologyOperation))
                                        .ToArray());
                                    
                                }
                                excludedItems.AddRange(group.Where(tr => tr.OperationGroupId == group.Key && !operationTypeIds.Contains(tr.TreatmentId)));
                            }

                            excludedItems.AddRange(t.Where(x => !x.OperationGroupId.HasValue));
                            reportItem.AddRange(excludedItems
                                .GroupBy(tr => new { tr.LayerId })
                                .Select(tr => CreateReportItem(tr.ToArray(), dateRange))
                                .ToArray());

                            return new PlanExecutionControlReportTechnology
                            {
                                TechnologyId = technologyFirst.TechnologyId,
                                TechnologyName = technologyFirst.TechnologyName,
                                Treatments = reportItem.OrderBy(tr => tr.TreatmentName).ToArray(),
                            };
                        }

                        if (t.Any(tr => tr.OperationGroupId.HasValue) && t.Key.HasValue)
                        {
                            var planExecutionControlItems = t.ToList();
                            var reportItem = new List<PlanExecutionControlReportTreatment>();
                            var excludedItems = new List<PlanExecutionControlItem>();
                            var operationGroupItems = planExecutionControlItems.GroupBy(x => x.OperationGroupId);
                            foreach (var group in operationGroupItems)
                            {
                                var operationTypeIds = operationTypes.Where(p => p.Value.Contains(group.Key ?? Guid.Empty)).Select(p => p.Key).ToArray();
                                var rows = group.Where(tr => tr.OperationGroupId == group.Key || operationTypeIds.Contains(tr.TreatmentId)).ToArray();
                                var operationItemRow = CreateReportItem(rows, dateRange, null, true);
                                reportItem.Add(operationItemRow);
                                reportItem.AddRange(rows
                                    .Where(tr => tr.OperationGroupId == group.Key || operationTypeIds.Contains(tr.TreatmentId))
                                    .GroupBy(tr => new { tr.LayerId })
                                    .Select(tr => CreateReportItem(tr.ToArray(), dateRange, operationItemRow.Path.ToList()))
                                    .ToArray());
                                excludedItems.AddRange(group.Where(tr => tr.OperationGroupId == group.Key && !operationTypeIds.Contains(tr.TreatmentId)));

                            }

                            excludedItems.AddRange(t.Where(x => !x.OperationGroupId.HasValue));
                            reportItem.AddRange(excludedItems
                                .GroupBy(tr => new { tr.LayerId })
                                .Select(tr => CreateReportItem(tr.ToArray(), dateRange))
                                .ToArray());
                            return new PlanExecutionControlReportTechnology
                            {
                                TechnologyId = technologyFirst.TechnologyId,
                                TechnologyName = technologyFirst.TechnologyName,
                                Treatments = reportItem.OrderBy(tr => tr.TreatmentName).ToArray(),
                            };
                        }

                        return new PlanExecutionControlReportTechnology
                        {
                            TechnologyId = technologyFirst.TechnologyId,
                            TechnologyName = technologyFirst.TechnologyName,
                            Treatments = t
                                .GroupBy(tr => new { tr.TreatmentId, tr.LayerId })
                                .Select(tr => CreateReportItem(tr.ToArray(), dateRange))
                                .OrderBy(tr => tr.TreatmentName)
                                .ToArray()
                        };
                    }).OrderBy(t => t.TechnologyName).ToArray()
                };
            }).OrderBy(g => g.CropName).ToArray();
Re: вот нахрен так писать?
От: bnk СССР http://unmanagedvisio.com/
Дата: 13.08.23 19:38
Оценка:
Здравствуйте, nikkit, Вы писали:

N>это лишь лист от той партянки, в которой надо разобраться.

N>сложного ничего. да. но вот как с листа охватить взглядом реально вообще? специально не говорю какой контекст. т.к. тоже в первый раз отчет этот вижу. и даже не знаю работало там изначально или нет

Сочувствую.

N>просто мата не хватает. как такое можно поддерживать, не имея доступа к проду.


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

N>вот для кого пишут книжки типа канонической "чистый код"?

N>я бы на код ревью точно такое развернул нахрен. ну строк 10 кода, которые сможешь сразу прочитать — да. без проблем. но такое заворачивать.. НАХРЕНА???? Убил бы.
N>так он там блин еще коменты пишет о красоте кода....

Да ничего страшного. Write-Only код
Re: вот нахрен так писать?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 14.08.23 07:27
Оценка: +1
Здравствуйте, nikkit, Вы писали:

Я бы сюда добавил, что использование синтаксис запроса намного лучше читается.
https://habr.com/ru/companies/otus/articles/723438/
Совмещение Linq и foreach.
в 1С например есть конструкторы запросов. Там простыни по 10 листов нормальное явление
В Linq это решается через промежуточные запросы. Но есть проблемы с анонимными классами, которых надо явно объявлять.

А вообще конечно удобно сворачивать подзапросы и раскрывать их по необходимости.
Ну это можно решить через #region и #endregion

Есть конструкторы запросов https://www.linqpad.net
Где тоже было бы удобно сворачивать разворачивать подзапросы
и солнце б утром не вставало, когда бы не было меня
Отредактировано 14.08.2023 10:59 Serginio1 . Предыдущая версия . Еще …
Отредактировано 14.08.2023 7:43 Serginio1 . Предыдущая версия .
Отредактировано 14.08.2023 7:28 Serginio1 . Предыдущая версия .
Re: вот нахрен так писать?
От: namespace  
Дата: 14.08.23 14:05
Оценка: +1
N>это лишь лист от той партянки, в которой надо разобраться.
N>сложного ничего. да. но вот как с листа охватить взглядом реально вообще? специально не говорю какой контекст. т.к. тоже в первый раз отчет этот вижу. и даже не знаю работало там изначально или нет
Я в таких случаях разбираюсь по частям и пишу комментарии по ходу, и, если делаю там исправления, то сохраняю вместе с комментариями.
Обычно не требуется вникать как работает весь блок кода чтобы дописать, или исправить баг.
Re: вот нахрен так писать?
От: 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒  
Дата: 14.08.23 18:42
Оценка:
нормальный код просто ранняя итерация. тебе повезло, что есть хотя бы какое количество форичей, человек видимо не смог протащить логику через линк, а есть те, кто могут, вот их код читать — истинное удовольствие, не говоря о дебаге.
Re: вот нахрен так писать?
От: Codealot Земля  
Дата: 14.08.23 19:42
Оценка:
Здравствуйте, nikkit, Вы писали:

Ну ужас, но не ужас-ужас-ужас.
А вот метод на 10 экранов в ширину не хотите ли?
Ад пуст, все бесы здесь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.