Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Заколюкин Степан #227

Open
wants to merge 13 commits into
base: master
Choose a base branch
from

Conversation

StepanZakolukin
Copy link

No description provided.

throw new ArgumentException();
var memberExpr = (MemberExpression)memberSelector.Body;
if (memberExpr.Member.MemberType != MemberTypes.Field && memberExpr.Member.MemberType != MemberTypes.Property)
throw new ArgumentException();
Copy link

Choose a reason for hiding this comment

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

Здесь бы в исключении написать в чем проблема селектора, который нам передали. В коде это очень просто подсветить, а нашей SDK будет сильно проще пользоваться

Copy link
Author

Choose a reason for hiding this comment

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

Исправил. Добавил сообщение, поясняющее почему конкретно возникла ошибка

Copy link

Choose a reason for hiding this comment

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

  1. У этого исключения есть хорошая перегрузка: https://learn.microsoft.com/en-us/dotnet/api/system.argumentexception.-ctor?view=net-8.0#system-argumentexception-ctor(system-string-system-string)

Она красиво выедет, что не так с параметром, если ты передашь message

  1. Старайся для всех параметров использовать nameof (memberSelector) -- тогда если другой разработчик (или ты) переименует аргумент, сообщение останется актуальным.

Copy link
Author

Choose a reason for hiding this comment

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

Исправил, использовал для исключения указанную перегрузку и nameof()

ObjectPrinting/PropertyPrintingConfig.cs Outdated Show resolved Hide resolved

public PrintingConfig<TOwner> Using(CultureInfo? culture)
{
return AddAlternativeSerializationMethod(obj =>
Copy link

Choose a reason for hiding this comment

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

Посмотри на конвертор. Это более привычный и правильный вариант сериализации в dotnet

https://learn.microsoft.com/en-us/dotnet/api/system.convert.tostring?view=net-9.0

Copy link
Author

Choose a reason for hiding this comment

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

Исправил. Поменял на Convert.ToString(obj, culture)

}

[Test]
public void PrintToString_CyclicLinks_NoStackOverflowException()
Copy link

Choose a reason for hiding this comment

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

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

Т.е.

  1. Такие кейсы не будут понятны: нет исключения, нет какого-то вывода в сериализуемом файле
  2. Такой кейс не зафиксирован в тестах

Copy link
Author

Choose a reason for hiding this comment

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

Исправил. Добавил тест, отражающий как себя будет вести сериализатор. Кроме того переписал логику класса сериализации, для более корректной обработки циклических ссылок

Copy link

Choose a reason for hiding this comment

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

Чётенько

}

private string PrintToString(object obj, int nestingLevel)
private string PrintToString(object? obj, int nestingLevel, HashSet<object> searized)
Copy link

Choose a reason for hiding this comment

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

Опечатка в названии аргумента) Должно быть serIALIzed

Copy link
Author

Choose a reason for hiding this comment

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

Исправил

{
private static readonly ImmutableArray<Type> FinalTypes =
Copy link

Choose a reason for hiding this comment

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

NIT: Эти поля не будут шариться между всеми классами. В dotnet так не работает :(

Если честно, я бы переписал так код, чтобы проверки были в отдельном методе. Смысла от общей структуры тут очень мало.

Copy link
Author

Choose a reason for hiding this comment

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

Не исправил. Не совсем понял что ты имеешь ввиду, вообще убрать это поле и создать метод, в котором входной тип будет проверяться на перечисленные в FinalTypes или просто обернуть FinalTypes.Contains(inputType) в метод

Copy link

Choose a reason for hiding this comment

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

Оба варианта норм! Поступай на своё усмотрение

Copy link

Choose a reason for hiding this comment

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

Главное, чтобы у класса с generic параметрами не было статических полей :) Только в тех случаях, когда без этого никак

Copy link
Author

Choose a reason for hiding this comment

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

Исправил, обернул проверку на финальный тип в метод IsFinalType(Type type)


namespace ObjectPrinting.Tests;

public class PrintingConfigTests
Copy link

Choose a reason for hiding this comment

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

Такое ощущение, что большинство тестов имеют очень маленький extected и его проще оставить в коде. Потому что:

  1. проще читать и расширять
  2. не может быть проблем с файлами

...
Но история с тем, что у тебя есть тесты из файлов очень крутая для функциональных тестах: их суть в том, чтобы за 1 тест проверить очень много логики на жирных данных. Такие тесты полезны, например тем, чтобы на уровне тестов давать гарантии по обратной совместимости: сгенерил вывод для оч большого обьекта, проверил его глазами и положил в файл. Этот тест начнёт падать, если какие-то данные сериализации начнут меняться (из-за обновления дотнета, кривого кода и т.п.)

Copy link
Author

Choose a reason for hiding this comment

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

Исправил. Тесты с небольшим extected вытащил в код

Copy link

Choose a reason for hiding this comment

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

Раз ты вытащил в код, кажется, можно убрать кучу ненужных полей, а содержание не поменяется. Ну и ИМХО строки через @"" и переносы строк выглядит более лаконично.

Copy link
Author

Choose a reason for hiding this comment

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

Ты имеешь ввиду убрать expected в строку с проверкой?

CheckSerializationOfTheCollection(expected, dict);
}

private void CheckSerializationOfTheCollection<TCollection>(string expected, TCollection collection)
Copy link

Choose a reason for hiding this comment

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

Тут не полностью выполнено требование: о перечислении всех публиных полей: у списка нет свойства Count.

Copy link
Author

Choose a reason for hiding this comment

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

Поправил логику в классе сериализатора и тесты

return sb.ToString();
}

private string SerializeNameOfType(Type type)
Copy link

Choose a reason for hiding this comment

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

NIT: тот формат, как пишет Type.GetType().ToString() более распространённый формат. Всякие декомпиляторы часто его использую и он общепризнанный. А то, что он не совпадает с тем, что пишем мы в IDE в нормально. Не все, что мы пишем в коде, легко конвертируется в код и обратно!

Copy link
Author

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.

2 participants