Помню, недавно выполнял задание на вакансию масленка после технического собеседования.
Формулировка следующая:
- Необходимо сгенерировать список случайных объектов по предоставленным моделям, сериализовать их в 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.
Как мне сказали люди, скорее всего они нашли кандидата лучше, но ничего страшного, может в другой раз повезет. Зато я познакомился с новым интересным инструментом, надеюсь, что в дальнейшем.
Было бы интересно почитать ваши советы и отзывы по поводу статьи, так как пишу первый раз что-то подобное. Спасибо!