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

Alexander Andronov #203

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

Alexander Andronov #203

wants to merge 2 commits into from

Conversation

batyadmx
Copy link

No description provided.

Copy link

@a-zhelonkin a-zhelonkin left a comment

Choose a reason for hiding this comment

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

  • Всегда при написании кода рекомендую писать все типы/поля максимально закрытыми и нередактируемыми. Т.е. почаще использовать sealed, private/internal, readonly, IReadonly* и т.д.


namespace ObjectPrinting
{
public class Options

Choose a reason for hiding this comment

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

  • Рекомендую всегда и все свои классы делать sealed (можно даже в шаблоне к классу это добавить). В некоторых ситуациях это микроскопически улучшает производительность, но что более важно - напоминает более тщательно продумывать иерархию наследования
  • Поля в подобных классах обычно делают пропами. Это поможет закрыть следующую рекомендацию - параметры желательно ограничить для редактирования. В идеале они должны быть init-only. Это даст хоть какую-то гарантию где-то в неожиданном месте не произойдет мутация и не внесет суету в поведение. Можно заморочиться и ввести еще и интерфейс, с аналогичными полями но только getterами, тогда у тебя будет абсолютная иммутабельность и полиморфность

if (obj == null)
return "null";

if (obj.GetType() == typeof(string) && configuration.Options.MaxStringLength != -1)

Choose a reason for hiding this comment

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

Можно просто obj is string str


foreach (var propertyInfo in properties)
{
var serialized = "";

Choose a reason for hiding this comment

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

Любой другой вариант чуть лучше. Иначе выглядит так, будто бы забыли что-то вписать в кавычки

  • var serialized = string.Empty;
  • var serialized = default(string);
  • string serialized;


var identation = new string('\t', nestingLevel + 1);
var type = obj.GetType();
var lines = new List<string>() { type.Name};

Choose a reason for hiding this comment

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

Было бы более оптимально заменить на StringBuilder

serialized = PrintToString(propertyInfo.GetValue(obj),
nestingLevel + 1);

var line = string.Format("{0}{1} = {2}",

Choose a reason for hiding this comment

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

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

var line = $"{identation}{propertyInfo.Name} = {serialized}";

{
if (obj is IDictionary)
{
var list = new List<string>();

Choose a reason for hiding this comment

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

StringBuilder

return string.Join("\n", lines);
}

private string PrintCollection(object obj)

Choose a reason for hiding this comment

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

Подразумевается, что сюда будут отправляться только нечто наследуемое от ICollection. Сейчас проблема может быть с непреднамеренной передачей сюда чего-нибудь левого. Поэтому два варианта на выбор.

  • Заменить object на ICollection и обязать данный метод сериализовать буквально любые коллекции
  • Переделать метод в формат типа bool TryPrintCollection(object obj, out string result), который будет принимать любой объект, анализировать тип и при удачно стечении обстоятельств отдавать какой-то результат

serializer = configuration.Serializers
.FirstOrDefault(x => x.predicate(info))
.serializer;
return !(serializer is null);

Choose a reason for hiding this comment

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

nit: Не люблю отрицания через !, стараюсь всячески их избегать, т.к. часто неприглядно выглядят и могут создавать какую-то запутанную логику с отрицаниями. Поэтому я бы сделал return serializer is not null

{
private Configuration configuration;

private readonly Type[] finalTypes;

Choose a reason for hiding this comment

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

Лучше заиспользоваться что-нибудь IReadonly*, иначе мало ли кто и почему захочет поменять какое-нибудь значение в массиве где-нибудь в середине кода. Судя по тому что коллекция используется для проверки наличия типов в списке, оптимальнее было бы взять IReadonlySet + HashSet

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