Стас Выщепан @gandjustas
Умею оптимизировать программы
Информация
- В рейтинге
- 250-й
- Откуда
- Москва, Москва и Московская обл., Россия
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Архитектор программного обеспечения, Деливери-менеджер
Ведущий
C#
.NET Core
Entity framework
ASP.NET
Базы данных
Высоконагруженные системы
Проектирование архитектуры приложений
Git
PostgreSQL
Docker
То есть диспетчеризация происходит по первому типу-параметру. Так как это все происходит в compile-time, то есть никакого runtime полиморфизма, то чем это лучше, чем:
?
При этом callMethodX можно заменить на нормальные имена, а внутри будет банальный pimpl, возможно с typetest, и не нужны будут все эти пляски с кучей шаблонов.
Или я что-то не понимаю?
Для .NET код все проще, рефлектор очень помогает. Код шарика я именно рефлектором изучал, он дает на несколько порядков больше понимания, чем любая документация и гайды. ASP.NET MVC, особенно первых версий, очень простая вещь и нет проблем изучить как оно работает.
При чем тут качество я не понял. Нужно не абстрактное качество, а реализация конкретных сценариев.
Машины времени не существует, но это не означает что в 2013 году надо свой код писать так, как посоны из МС предполагали писать в 2005, не находите?
Авторы может и не медиумы, но сегодня есть куча примеров применения технологии и как-то неправильно на них не смотреть. Или у вас другое мнение?
Еще раз повторю слова поста — Linq позволяет описать только очень простые запросы, которые прекрасно оптимизируются SQL Server и Oracle. Если СУБД не оптимизирует запрос, то значит не хватает индексов\статистики\ограничений. Поэтому хинты вряд ли нужны будут. NOLOCK тоже не нужно ставить, лучше запросы оптимизировать, чтобы интервал блокировок был меньше. На крайний случай установить уровень изоляции read uncommitted. А в идеале поставить RCS.
Но вот чего точно не надо делать — пытаться адаптировать производственный конвейер, как в макдаке, под задачи разработки, не взлетит.
Код смотрел рефлектором, для ASP.NET MVC первой версии было его совсем немного, сумарно пару тыщ LOC, достойных внимания. Ушло на это примерно неделя.
Метрика достаточности знаний субъективная — когда очко перестает играть от мысли применения технологии в реальном проекте. некоторые вещи МС я бы до сих пор не взялся в реальном проекте применить.
Выбора между пятью обычно нет, есть выбор использовать готовое или наструячить свое. В этом случае имеет смысл потратить на изучение, ибо даже если струячить свое, то можно многому научиться разбираясь как работает существующая технология.
Но я как-то привык читать код и анализировать готовые решения ДО того, как кидаться применять технологию.
Например до применения ASP.NET MVC еще CTP версии, по которой не было никаких реальных примеров, я изучил ВСЕ видео и дважды просмотрел код рефлектором чтобы понимать чем мне грозит.
1) Его не надо писать руками
2) Уровень изоляции таки read commited
Именно поэтому EF ставит RCS для новых баз.
Я кстати видел dirty read баги в живой системе, которую «оптимизировали» с помощью nolock. Причем такие баги диагностировать почти нереально ибо весь код отрабатывает в этом случае корректно, а по сути бага была в том что чтение происходило между вставкой строк в одном insert операторе.
Это дает изолированность транзакций, то есть нет фантомов, неповторяемых и грязных чтений, но не дает сериализуемости.
READ COMMITED SNAPSHOT заставляет при записи не вешать лок, а делать копию строки, и при коммите заменять основную версию. При чтении никаких локов и копирование строк не происходит. Но работает только на уровне изоляции READ COMMITED, то есть позволяет неповторяемое чтение и фантомы.
Механизм версионирования внутри одинаковый, а применение разное и эффект разный.
Проблемы с обоими SNAPSHOT могут быть при высококонкурентном доступе к одним и тем же данным.
Именно. Если технология не прошла догфудинг в МС, то скорее всего в первой версии будет неюзабельна.
Я вижу недостаток, что автор использует неверный подход, при этом ругает технологию. К сожалению МС не озаботились дать верный подход, его приходится выковыривать из продуктов.
1) Бага в EF, описана в этом посте в мифе #2
2) Надо делать проекции, ибо при джоине двух таблиц без проекций генерируется довольно большой Dataset.
Вообще если из А следует Б, то это не значит что из Б следует А. ;)