Помню, недавно выполнял задание на вакансию масленка после технического собеседования.
Формулировка следующая:
- Необходимо сгенерировать список случайных объектов по предоставленным моделям, сериализовать их в json, после загрузить их из файла в обратно память.
В общем, простое задание на джуна, хоть не аналог авито писать, и на том спасибо.
Оригинальная формулировка задания:
Create a program which will execute the next steps: 1) Create collection of randomly generated objects in memory by provided models, number of ofjects 10000; 2) Serialyze it to JSON format; 3) Write the serialization result to the current user desktop directory, the text file name should be "Persons.json"; 4) Clear the in memory collection; 5) Read objects from file; 6) Display in console persons count, persons credit card count, the average value of child age. Use POSIX format for dates. Use lowerCamelCase JSON notation in result file.
// Data models class Person { public Int32 Id { get; set; } public Guid TransportId { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public Int32 SequenceId { get; set; } public String[] CreditCardNumbers { get; set; } public Int32 Age { get; set; } public String[] Phones { get; set; } public Int64 BirthDate { get; set; } public Double Salary { get; set; } public Boolean IsMarred { get; set; } public Gender Gender { get; set; } public Child[] Children { get; set; } } class Child { public Int32 Id { get; set; } public String FirstName { get; set; } public String LastName { get; set; } public Int64 BirthDate { get; set; } public Gender Gender { get; set; } } enum Gender { Male, Female }
Я если честно не понимаю, почему нельзя просто использовать псевдонимы системных типов, подскажите в комментариях.
Подключаем Faker
Faker можно добавить в проект через менеджер пакетов NuGet.

У данного пространства есть целая куча классов, с помощью которым можно генерировать те или иные данные:
Faker.Address — генерация адресов
Faker.Boolean— генерация логических данных
Faker.Company— генерация компаний
Faker.Identification— генерация идентификационных данных
Faker.Finance— генерация финансовых значений
Faker.Name— генерация имен
Подключаем нужное пространство имен и начинаем пользоваться:
using Faker; using Collection.Data; namespace Collection.Generator { internal class PersonsGenerator { public List<Person> persons = new List<Person>(); Random random = new Random(); DateTimeGeneration birthdayDate = new DateTimeGeneration(); PhonesGenerator phones = new PhonesGenerator(); ChildGenerator children = new ChildGenerator(); CreditCardsGeneration creditCards = new CreditCardsGeneration(); public PersonsGenerator(int count) { for (int i = 0; i < count; ++i) { persons.Add(new Person { Id = i, TransportId = Guid.NewGuid(), // Случайная генерация имен FirstName = Faker.Name.First(), LastName = Faker.Name.Last(), SequenceId = i, CreditCardNumbers = creditCards.CreateCreditCards(), // Числа тоже можно генерировать Age = Faker.RandomNumber.Next(18, 100), Phones = phones.CreatePhones(), BirthDate = ((DateTimeOffset)birthdayDate.CreateBirthdayDate()).ToUnixTimeSeconds(), Salary = (double)Faker.RandomNumber.Next(10000, 100000), IsMarred = Faker.Boolean.Random(), // Можно рандомизировать константы из перечислений Gender = Faker.Enum.Random<Gender>(), Children = children.CreateChildren(out childrenCount) }); } } } }
Теперь можно попробовать вывести все это в консоль, я написал небольшой класс с рефлексией, который выводит данные в консоль:
internal class ConsoleWriter<T> where T: class { public ConsoleWriter(List<T> collection) { Type type = typeof(T); PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var o in collection) { for (int i = 0; i < properties.Length; i++) { Console.WriteLine($"{properties[i].Name}:\t{properties[i].GetValue(o)}"); // Не обращаем внимание, так, для себя сделал if (properties[i].PropertyType.IsArray) { Console.WriteLine("Array!"); } } Console.WriteLine(); } } }
static void Main(string[] args) { // Здесь генерация объектов PersonsGenerator generator = new PersonsGenerator(5); JsonWriter<Person> jsonWriter = new JsonWriter<Person>(); JsonReader<Person> jsonReader = new JsonReader<Person>(); // Вот здесь вывод данных в консоль после генерации ConsoleWriter<Person> debuger = new ConsoleWriter<Person>(generator.persons); Console.WriteLine("Reflection is end. Push ENTER to continue..."); // Запись данных в JSON jsonWriter.WriteToFile(generator.persons); Console.WriteLine("Serialization is complete!"); // Очистка после подтверждения Console.ReadLine(); generator.persons.Clear(); generator.Dispose(); // Чтение из файла var persons = jsonReader.ReadFromFile(); // Вывод данных ValueCounter counter = new ValueCounter(); Console.WriteLine($"Persons count is {persons.Count}"); Console.WriteLine($"Average children age is {counter.AverageChildAge(persons)}"); Console.WriteLine($"Credit cards count is {counter.CreditCardCount(persons)}"); Console.ReadKey(); }
Результат в консоли следующий:

Имена конечно иногда странные, но, как мне кажется для тестов вполне сойдет.
Итоги
В конечном итоге, меня не взяли на работу масленком, дав следующий ответ:
HR: Даниил, здравствуйте!
Мы благодарим Вас за проявленный интерес к нашей компании и желание с нами сотрудничать.
На позицию, которую мы Вас рассматривали, мы пока не готовы Вам сделать предложение о работе. С Вашего позволения мы хотели бы Ваше резюме добавить в кадровый резерв, чтобы в случае, если у нас появится подходящая вакансия, связаться с Вами.
Также мы желаем Вам успехов в поисках работы!Я: Опишите пожалуйста более точно причину отказа.
HR: Уточнила, тимлид обещал ответить сегодня вечером или завтра до обеда
—«Через 3 часа»—
HR: Даниил, по поводу обратной связи: самое основное — недостаточно теоретических знаний и отсутствие опыта работы с asp net.
Как мне сказали люди, скорее всего они нашли кандидата лучше, но ничего страшного, может в другой раз повезет. Зато я познакомился с новым интересным инструментом, надеюсь, что в дальнейшем.
Было бы интересно почитать ваши советы и отзывы по поводу статьи, так как пишу первый раз что-то подобное. Спасибо!

ссылка на оригинал статьи https://habr.com/ru/post/673674/
Добавить комментарий