About use cases. In my project, a symbolic algebra library, I work with mathematical expressions. At the beginning of the project, I had method Evaluate(). Every time I called it I knew that it would take some time to process, so I wouldn't call it multiple times.
However, it's hard to track how many times it is called for an expression, there many methods, such as Simplify(), Solve() and many others which used this method. In fact, there were many cases when the same expression's Evaluate() was called.
With implementation of this pattern, I don't hesitate to address Evaluated property. This helps a lot when designing/developing new functional and makes the code faster and safer.
В матрице 4x4 всего 16 элементов, столько же, сколько у автора машина умеет за одну инструкцию. А вот для видеокарты мне кажется размер матрицы маловат (и эффективность будет низкая)
Кто-нибудь может в паре слов сказать, как с этим обстоит в США, Европе и Китае? Ну, условно, уже в каждой деревне, или только центры городов? Или вообще мало где?
Шарп еще не стал классикой, чтобы наслаждаться его старостью).
public class AdministrativeArea {
public string ID { get; set; }
public string LocalizedName { get; set; }
public string EnglishName { get; set; }
public int Level { get; set; }
public string LocalizedType { get; set; }
public string EnglishType { get; set; }
public string CountryID { get; set; }
}
->
public record AdministrativeArea(string ID, string LocalizedName, string EnglishName, int Level, string LocalizedType, string EnglishType, string CountryID);
Ну и много каких моментов можно переписать.
UPD: я правда с json не работаю, нужно чекать, умеет ли он в рекорд писать.
1Вт же отраженным от матовой поверхности точно даст не временную слепоту.
Очень странное суждение. У меня есть одноваттный лазер-указка Thor II, но не красный, а синий. Никаких проблем со зрением не видел, когда смотрел на отражение от него. Говоря про темные матовые поверхности — так там так, пятнышко было синее. Либо в данном случае красный настолько более коварный?
Так можно говорить про каждую версию и остаться в итоге на net20
Я на нем и остаюсь (если вы не про core2.0 или боже упаси второй fw).
ValueObject выполняет другую задачу. С рекордами вы получаете возможность построить граф из коробки. Ну и паттерн матчинг.
ValueObject обычно для небольших оберток, я никогда не видел структуры, которая достаточно самостоятельна и выполняет какую-то ключевую задачу.
Ну а как добавлять какие-то вещи типа generics? Или вот DIM (default interface member)? Хотя про последнее не уверен, может это только от рантайма зависит
C# 9 определенно не является серьезным мотивом для переезда на новый дотнет
Добавлю. Новый шарп — это в основном синтаксические накрутки, генерируемый IL не изменяется. Например, record — это на самом деле класс под капотом. А значит можно использовать многие фичи девятого шарпа даже на netstandard2.0.
Для этого вам нужно написать следующий костыль где-нибудь.
Либо почитайте пост от автора Nullables, который сделал nuget-пакет для этой же цели (чтобы использовать девятый шарп в < 5 версиях)
У меня есть проект (библиотека), таргетящий 2.0, и при этом использующий девятый шарп. Очень удобно
Просто смотреть мемесы в соцсетках выполнять типичные пользовательские сценарии спокойно можно на смартах, которые вышли и 6 лет назад.
А губки, отнюдь не морские, на что фоткать? Впрочем, это где все преимущства новых смартов кончаются. Офигенный экран? Это планшетам и ноутам… Мощный проц ну это смешно. Вот я и сижу на xperia z 7-летней давности
Я уже говорил, почему приватное поле с Lazy я не могу позволить себе. И я же в итоге делаю что-то похожее, просто лишенное недостатков классического подхода.
И на всякий случай скажу: меня верно подправили выше, это скорее ленивая инициализация, а не кеш, потому что в ленивой инициализации не надо ничего инвалидировать (в отличии от топика, что вы кинули).
Смотрите, может быть кейс когда их много и когда одно свойство ссылается на пару других. Ваш подход поощряет стиль написания кода, который может привести к такой ситуации.
Да, верно. А вот что значит "искать начало и конец инициализации" — не очень понятно. Если вы хотите что-то отдебажить, достаточно изолировать ваш объект от других, и при первом обращении попадете туда, куда нужно. Хотя можно и проще: поставить условные бряки и когда-нибудь ваш метод вызывется.
Сейчас я использую это в библиотеке. Вместо того, что бы думать, где запускать Eval(), а где нет, а где один раз запустить, я просто обращаюсь к одному свойству. Это сильно увеличило скорость разработки и производительность (потому что все результаты все время кешируются).
Может лучше было и обертку, я просто писал о наивной реализации. Может еще смогу добить его по скорости, но задача все-таки была не в этом, а поделиться идеей дизайна
Сам FieldCache использую в своем проекте (через NuGet). Не уверен, что кому-то нужен сам пакет, потому что гениального тут ничего нет, и, вероятно, проще написать свой велосипед.
Я использую эту штуку в своей библиотеке символьной алгебры, в которой такой паттерн чертовски полезен для математических выражений. Например, у математического выражения есть свойства InnerSimplified, Evaled, IsFinite и прочие, которые необходимо кешировать, так как количество обращений к ним непредсказуемо.
Тут вызываются рекурсивные методы, которые в общем случае должны были бы обходить все дерево выражения. В данном случае, при первом обращении к свойству, вычисления будут происходить основываясь на свойствах детей. К примеру, если мы хоть раз обратились к свойству Evaled у выражения 2^5, то при обращении к этому же свойству у выражения 2^5 + 3 у нас не будет заново вычисляться 2^5. И это, по моему мнению, должно инкапсулироваться именно холдером, чтобы при обращении к свойству ни о чем думать не нужно было, и считать это обращение — бесплатным.
Ну, не знаю насчет "плохо", если только неидеально. Но латех рендерю не я, поэтому если хотите оставить отзыв авторам рендерера или предложить улучшение, можете обратиться к ним.
Юпитером — дофига кто, те, кто занимаются исследованиями
Чем это удобнее локальной разработки?
Тем, что это не разработка вовсе. Вот вам надо посчитать какую-нибудь формулу, найти производную, или посмотреть, что выдаст нейросетка по данной модели — открываете блокнотик в юпитере и смотрите
Просто даже визуализировать локальные данные проще (банально цеплянием либ)
Не понял. В юпитере ты просто накидываешь библиотеки и ими пользуешься оттуда, не перезапуская весь код, в отличии от промышленных IDE
Результаты дампить, разумеется, ничуть несложнее
С приходом мелкомягких в GH открыли всякие фичи, которые раньше были платными. Например, увеличили максимальное число коллабораторов в закрытых репах, дали плюшки открытым организациям
По статистике люди с аппаратом изнасилуют с большей вероятностью, чем без.
Тут такая же логика: ото всех не закрыться, но без публичного софта количество скаченного контента уменьшится.