Skip to content

Копытов Михаил#253

Open
Mihail3141 wants to merge 8 commits intokontur-courses:masterfrom
Mihail3141:master
Open

Копытов Михаил#253
Mihail3141 wants to merge 8 commits intokontur-courses:masterfrom
Mihail3141:master

Conversation

@Mihail3141
Copy link
Copy Markdown

Copy link
Copy Markdown

@Yrwlcm Yrwlcm left a comment

Choose a reason for hiding this comment

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

В целом решение хорошее, приятно читается, большую часть комментов не критичные и накидывал их скорее как мысли вслух и за что зацепился глаз)

var actual = setUpPerson.PrintToString();

actual.Should().NotBeNullOrEmpty();
actual.Should().Contain("Id = f14dd761-3260-4463-a4ad-6ba14de2026c");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

А давай в эти строчки, где есть значения, положим значения из setUpPerson, чтобы руками не править в двух местах потом

actual.Should().Contain("Id = f14dd761-3260-4463-a4ad-6ba14de2026c");
actual.Should().Contain("Person");
actual.Should().Contain("Name = Fai");
actual.Should().Contain("Age = 20");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

А перетащи Height выше Age, чтобы порядок полностью совпал с порядком в Person. Ни на что не влияет, но так попроще читать)

actual.Should().Contain("Name = Fai");
actual.Should().Contain("Age = 20");
actual.Should().Contain("Height = 160,5");
actual.Should().Contain("Tags = List");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Тут потерял Scores



[Test]
public void PrintToString_ShouldApplyMemberExclusion_WhenNameExcludedInConfig()
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Название теста не совсем правильное, WhenNameExcluded не совсем явно о том, что мы на самом деле тестируем исключение конкретного поля, вдруг мы только Name умеем исключать

}

[Test]
public void PrintToString_ShouldApplyTypeExclusion_WhenIntTypeExcludedInConfig()
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Тут тоже я бы предложил убрать Int из названия, мы же тестируем исключение типов. А еще было бы классно завести вторую интовую переменную и её тоже проверить, что мы исключили обе, а не первую попавшуюся

Comment on lines +122 to +123
sb.Append(prop.Name);
sb.Append(" = ");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

А почему это в одну строчку не обьединить? И ниже тоже

Comment on lines +217 to +221
if (!t.IsGenericType) return t.Name;

var defName = t.Name;
var backtick = defName.IndexOf('`');
if (backtick > 0) defName = defName.Substring(0, backtick);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Тут тоже стоит вынести тело условия на отдельную строчку и для return-а и для просто переменной. И можно заюзать и range indexer [..backtick]

return s.EndsWith(Environment.NewLine) ? s : s + Environment.NewLine;
}

private static string InvokeSerializer(Delegate del, object value)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Вызовы функций в рефлексии, да и сама рефлексия очень хитрая тема, с которой вообще практически не работаешь в обычной жизни, поэтому всегда забывается. Поэтому всегда ставь её по 10 раз под сомнение, а сейчас есть еще и достаточно умные ллмки которые помогут быстро проверить, что же ты написал и окей ли это ;)

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

Тут например такая штука (это если что ответ ллмки, не мой)
DynamicInvoke медленный, потому что это универсальный механизм рефлексии: при каждом вызове он создает в памяти массив для аргументов (нагружая GC), проверяет соответствие типов в runtime и использует сложную логику для передачи данных из массива в регистры процессора. Прямой вызов делегата (через Func или Action) быстрый, потому что компилятор заранее знает сигнатуру метода; это компилируется в одну процессорную инструкцию (callvirt) без создания лишних объектов, без проверок типов и с возможностью JIT-компилятора оптимизировать или даже встроить (inline) этот код.

Простым языком, если захочется оптимизировать, то нужно будет сменить типы у сериализаторов на вот это, но явно требовать сделать не буду, кажется в целом и так читабельно, но помнить об этом стоит)

internal readonly Dictionary<Type, Func<object, string>> CustomTypeSerializers = new();
internal readonly Dictionary<MemberInfo, Func<object, string>> CustomMemberSerializers = new();

И переписать юзинги с вот такими врапперами

Func<object, string> wrapper = obj => func((TMemberType)obj);

return value + Environment.NewLine;
}

private string ApplyTrimming(string s, MemberInfo? parentMember)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Лучше для строчек тоже использовать нулабельность через ?, так можно немного упростить себе жизнь с проверками на null, где они нужны а где нет

return sb.ToString();
}

private void Serialize(object? obj, StringBuilder sb, int level, MemberInfo? parentMember)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

А попробуй декомпозировать метод на подметоды внутри. 130 строчек уже кажется многовато и стоит подумать над разбиением на блоки

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.

2 participants