|
Труд вопреки насмешкам
|
|
.NET 9 Приемлема ли такая реализация поиска в списке?26.04.2025, 21:41. Показов 3634. Ответов 35
Метки нет (Все метки)
Ссылка. Разумеется, не по "чистому коду", а функционально. На самом деле я мог бы сделать и "традиционную" реализацию, это не очень сложно, но это привело бы к большому количеству косвенной рекурсии, которой я стараюсь избегать, так как сильно сомневаюсь, что компилятор оптимизирует ее (на самом деле там была бы не "чистая" косвенная рекурсия, которую как раз легко оптимизировать, предварительно преобразовав в прямую, а адская комбинация из прямой и косвенной рекурсии, когда каждая функция в паре вызывает как себя, так и другую) (и такая комбинация у меня уже была, я даже ввел goto, чтобы избавиться от этой "всенаправленной" рекурсии) (а как мы знаем, мои проекты и без такой рекурсии тормозят, нет смысла добавлять еще один тормоз там, где легко обойтись без него). Также на этом месте могла бы быть вообще реализация "в лоб", которая тоже раньше была у меня, но это еще бо́льшие тормоза из-за рекурсивного спуска на каждом элементе, а не по одному разу за ветку. Надеюсь, устранив лишние спуски и эту адскую рекурсию, я не ввел других тормозов или чего-то еще похуже?
0
|
|
| 26.04.2025, 21:41 | |
|
Ответы с готовыми решениями:
35
Выбор обфускатора: сочетание бесплатности и приемлемого качества WCF метод должен вернуть приемлемый тип для dataGridView |
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
|||
| 28.04.2025, 23:19 | |||
|
еще можно просто списки неэффективно использовать , держать в памяти даже тогда когда они уже не нужны - если данных дофига (а судя по тому что это биг.коллекшон свой , то их видимо дофига). Добавлено через 9 минут
, т.е настолько наговнокодили . что уже даже нет никакого контроля над переменными , кто кого и почему обнуляет - черт ногу сломит в попытках разобраться , класс в несколько тысяч строк точно нуждается в декомпозиции.
0
|
|||
|
Труд вопреки насмешкам
|
||||
| 28.04.2025, 23:30 [ТС] | ||||
high, low обнуляется и наоборот. Разве что если многопоточно вызывать методы добавления и удаления, теоретически можно словить такое исключение. Но класс изначально не потокобезопасный.
0
|
||||
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
||
| 28.04.2025, 23:57 | ||
|
а так , например , если у Вас полно функций из нескольких слов , по типу IncreaseCapacityLinear , IncreaseCapacityExponential ... то это уже сущность размытая , которую можно вынести , далее всякие мат.операции можно оформить в какой нибудь Math.Collection , валидаторы-верификаторы унифицировать и вынести так же отдельно , все что internal - тоже отдельные сервисы и т.п. Добавлено через 7 минут И комментарии , сейчас человек со стороны посмотрит и ужаснется , этот код никто и никогда не захочет взять дорабатывать , вникать - просто окинув его взглядом хочется сразу закрыть. плюс это так же полезно для выявления скрытых сущностей, ибо когда будете комментировать назначения внутренних блоков , задумываясь над смыслом происходящего , то сразу увидите зависимости которые могут быть оформлены отдельным классом. А еще попробуйте юнит.тесты пописать не только на паблик , но и на внутренние методы , у Вас ничего не выйдет , потому что что бы его дернуть , нужно черт его знает что и где настроить , появится желание это упростить и будет понятно что именно нужно отрефакторить.
0
|
||
|
|
|||||||
| 29.04.2025, 04:44 | |||||||
![]() Отдельно замечу что кроме фантастической "читаемости" этого кода, в момент отлова проблемы у нас есть 25% шанс угадать что в тот момент было null. Ещё и ApplicationException... Ощущается как "сгорел сарай, гори и хата". Если это входные аргументы, то нужно делать что-то в таком духе
Если это просто локальные переменные.... Ну блин не знаю, кажись отсутствие метода расширения у NullReferenceException должен намекать что Nullable reference types существует не просто так и нужно проверять на null и обращать внимание на warning.
0
|
|||||||
|
Труд вопреки насмешкам
|
|||||||
| 29.04.2025, 14:22 [ТС] | |||||||
|
sau, разбил на два файла, слегка изменил текст исключения, добавил комментарии там, где они не "капитанские", добавил Dispose() (по факту получилось добавить только в одном месте при уменьшении емкости, в остальных случаях внутренние списки нужны). Так лучше?
0
|
|||||||
|
2875 / 2080 / 386
Регистрация: 22.07.2011
Сообщений: 7,837
|
|||||||
| 29.04.2025, 22:14 | |||||||
|
return; - вот это как раз капитанский коммент , и практически бесполезный , из самого определения понятно что если 0 то возвращаемся , но это не раскрывает сути происходящего , комментарий должен объяснять «почему», а не «что». допустим функция CopyToInternal - из названия понятно , что какое-то внутренне копирование чего-то куда-то , но в самом теле куча каких-то проверок/условий , глядя на которые не понять почему они тут и что вообще происходит , почему там какой-то реверс - это все требует погружения в какой-то контекст , было бы неплохо в summary более развернуто указать целевое назначение функции , если она реализует какой-то стандартный алгоритм - можно ссылочку на RFC доку оставить , ну и для каждого IF-ELSE блока в кратце пояснить какую задачу он решает , иначе это просто какой-то ассемблер по факту: intIndex , bReversed , ignoreReversed , sourceIndex = Length - length - sourceIndex; - ничерта непонятно , набор ничего не говорящих переменных и каких-то манипуляций с ними. (Capacity тоже выглядит страшно) Ладно , допустим я просто не в теме , но представим что Вы уволились/пропали , и кто-то должен будет разобраться в этом коде , вопрос как ? , - сами-то , в целом , предполагаете что это возможно ? Если посмотрите на , скажем , какие-то более менее известные библиотеки на гитхабе . то я видел примеры , где в начале файла целая история про сам файл , и к каждой функции описание больше чем сама функция , и не скажу что это плохо , во всяком случае в подобном коде это точно лишним не будет , т.к иначе его не понять.
2
|
|||||||
|
|
||
| 30.04.2025, 06:57 | ||
Дело ваше, можете не расписывать. Не мне потом угадывать откуда прилетел баг. В целом глядя на россыпь high != null && highLength != null выглядит как будто есть смысл в первую очередь применить совет от sau, и декомпозировать код, чтобы временный элемент содержал логику внутри себя и не нужно было делать 100500 проверок на null.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||
| 30.04.2025, 07:59 | ||
|
0
|
||
|
|
||
| 30.04.2025, 08:30 | ||
Основная трудность -- выделить этот самый скоп для инкапсулирования. Когда пишешь в моменте, то тыкнуть new|dispose|null можно в любой момент и поначалу так и строчишь. А потом осознаешь, что на строчку кода у тебя десять проверок на null.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 30.04.2025, 14:06 | |
|
Wolfdp, я немного не про это. Вот нет у вас проверки на null, вроде всё хорошо, но как вы узнаете сработает код или нет? Вы все равно поставите проверку, только она будет не
if (aaa != null), а будет if (!dbObject.aaaIsNull()).
0
|
|
|
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,732
|
|
| 30.04.2025, 16:09 | |
|
0
|
|
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||
| 30.04.2025, 16:17 | ||
|
В одном месте, там где это необходимо, или нигде, если в этом нет нужды, или эти проверки будут на каждом уровне, что излишне и затратно. Уровни, это уровни абстракции, включая отношения вызываемый<->вызывающий код. Одного "тормоза" уже написали, С#, со всем что нужно и не нужно. Теперь что, "тормоз" над "тормозом"? Утрировано. Это я про сурс этой темы.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||||||
| 30.04.2025, 17:19 | |||||||||||||
|
простой пример, у вас есть например двухсвязный список
Несомненно можно написать методы IsLast() или GotoLast() и получить нужный результат, но так вы просто условие перекинули в другое место кода. Об этом речь?
0
|
|||||||||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|||||||
| 30.04.2025, 17:56 | |||||||
|
Но там где можно написать код без проверок, написав контракт что входные данные будут в априори валидные, можно и нужно. Оставить проверки на вызывающий код, конечно, если это приемлемо. Не знаю что там за 4 проверки в коде ТС, но это перебор. Учитывая что у него есть какой то length. А по вашему примеру, вот вариант:
Когда мы берем у списка first, мы же не проверяем на nullptr и не кричим во всю глотку, аларм, там же nullptr!? Нет. Выше, было предложение лишь в декомпозиции, а не убрать проверки вовсе, вероятно.
0
|
|||||||
|
|
|
| 30.04.2025, 18:42 | |
|
Идея не в том чтобы наглухо избавится от проверки, а чтобы:
- делать её в одном месте для одного объекта. Т.е. вместо километрового is null для 100500 полей чекаем единый объект и пляшем от него - логика работы с полями переносится в этот объект, где эта проверка не нужна. Т.е. даже поля не нужно делать null, что резко упрощает код и IDE перестает лишний раз паниковать. Я выше писал что нет универсального правила когда нужно паковать это добро, а когда нет. У ТСа в коде вроде парой ходят значения high и highLength, так что допускаю что там есть возможность запаковки в что-то единое. Пример с элементом направленного списка не совсем про это. Пустое свойство Next как бы валидно и имеет логическое значение что это "end". Я же скорее говорил про случай когда есть набор значений, которые либо все сразу существуют, либо все null, и третьего состояния не должно быть. --------- Мне сейчас с головы сложно дать хороший пример прям из практики. Обычно если поле допускает null, то это штатная ситуация и просто идем по другой ветке кода (как с направленным списком). Если нужно просто временно что-то куда-то сохранить, то прям в методе создается переменная и это не пихается в поля.
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 30.04.2025, 19:19 | |
|
SmallEvil, Wolfdp, понял, спс
0
|
|
| 30.04.2025, 19:19 | |
|
Является ли это приемлемой практикой? Написать программы вставки, удаления и поиска элементов несортированного списка, используя для реализации списка массив Реализация функции вычисления электронно-цифровой подписи RSA. Реализация функции проверки ЭЦП RSA Binding списка объектов из другого списка объектов списка Работа со списком, поиск элемента в списке по параметрам элемента в списке, удаление одинаковых и изменение существующих Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни
1. Механизм отложенного высвобождения фосфора
Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ
Реализована разная скорость. . .
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|