Faker API для .NET — генерация случайных имен и других данных

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Помню, недавно выполнял задание на вакансию масленка после технического собеседования.

Формулировка следующая:

- Необходимо сгенерировать список случайных объектов по предоставленным моделям, сериализовать их в 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/


Интересные статьи

Интересные статьи

В Robot Operating System сообществе мы решили в эру изоляции проводить специализированные мини митапы на темы связанные с робототехникой. Теперь каждая встреча будет посвящена одной теме, которую мы б...
Привет! На связи Артемий – Analytics Engineer из Wheely.Сегодня хотел бы поговорить о вопросах конвертирования финансовых показателей в разные валюты. Вопрос достаточно актуальный, так ка...
Профессиональную сферу DWH (Data Warehouse, или, по-нашему, хранилище данных) отличает высокая технологичность, а также огромное многообразие используемых решений. Крупны...
Это вторая часть интервью с Андреем Карсаковым (kapc3d), к.т.н., старшим научным сотрудником Национального центра когнитивных разработок, доцентом Факультета цифровых трансформаций. ...
Привет! В этой статье я расскажу, как сделать страницу в Atlassian Confluence с таблицей, данные в которую будут приходить из REST запроса. Мы сделаем страницу в Confluence с та...