Skip to content

2. Lazy - #2

Open
ArtemNikit1n wants to merge 4 commits into
mainfrom
02-lazy
Open

2. Lazy#2
ArtemNikit1n wants to merge 4 commits into
mainfrom
02-lazy

Conversation

@ArtemNikit1n

Copy link
Copy Markdown
Owner

No description provided.

Comment on lines +47 to +51
else
{
throw new InvalidOperationException(
"Failed to initialize the lazy value. The supplier delegate is unavailable.");
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно убрать лишнюю вложенность, если перенести эту часть выше с условием if (this.supplier is null)
Хотя на мой взгляд это избыточно -- уже проверяете supplier при создании объекта, а в дальнейшем состояние объекта, когда либо suppplier = null и isCalculated=true, либо supplier не null -- это уже его инвариант

private readonly Lock lockObject = new();
private Func<T>? supplier = supplier ?? throw new ArgumentNullException(nameof(supplier));
private T? value;
private bool isValueCreated;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Чтобы снизить количество блокировок, стоит isInitialized пометить как volatile, чтобы потоки смотрели на актуальное значение, а не на значение в своих кешах

[Test]
public void Get_Should_ReturnCorrectValue_ForInt()
{
foreach (var lazy in GetLazyImplementations(() => 42))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для таких случаев можно атрибут TestCaseSource использовать, чтобы руками меньше писать

{
threads[i] = new Thread(() =>
{
results.Add(lazy.Get());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

чтобы просимулировать одновременный запуск потоков, используйте manualResetEvent или Barrier


#pragma warning disable CS1591
#pragma warning disable SA1600
public class LazyMockTests

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А эти тесты что прооверяют?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эти тесты сейчас проверяют, что моки правильно работают :)
В остальном окей

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants