C# - Отзыв об адресной книге - ООП - Консольное приложение

Последние пару недель я проходил несколько онлайн-курсов по C#, чтобы изучить программирование. Поскольку у меня нет друзей, которые занимаются программированием, мне было трудно получить обратную связь / отзывы о коде, который я пишу. Конечно, код работает, но как насчет качества кода?

Чтобы избежать наихудших ошибок новичков, я бы очень одобрил, если бы кто-нибудь мог быстро взглянуть на приведенный ниже код или направить меня на какой-нибудь другой форум, где проверка кода является темой. (Просто удалите эту ветку, если это неправильный подход к SO).

О проекте

Я создал простую адресную книгу (консольное приложение) на основе четырех классов:

  • Основной
  • Адресная книга
  • Человек
  • WriteAndReadToFile

Приложение имеет следующие возможности:

  • Магазин друзей
  • Обновить информацию о друзьях
  • Удалить пользователя
  • Показать всех пользователей
  • При добавлении / обновлении / удалении пользователя он должен сохраняться в txt-файле (который загружается при запуске программы).

Для простоты я добавил только имя и адрес в приложении, также есть очень плохая проверка ввода данных (фокусировка на изучении ООП). Что касается функции обновления, я знаю, что она обновит все, что соответствует firstName.

Вопросов

  • Я правильно добавляю ООП?
  • Мне было трудно поддерживать текстовый файл в правильном «состоянии» после обновлений и удалений, и я начал сбрасывать файл после этого и вместо этого переписывать файл. Это плохая практика?

Код

Основной

class Program
{
    static void Main(string[] args)
    {
        bool ProgramIsRunning = true;
        AdressBook ab = StartProgram();

        Console.WriteLine("--------- AdressBook 1.0 ---------");

        while (ProgramIsRunning)
        {
            // Print user options
            PrintUserOptions();
            var userInput = Console.ReadLine();

            switch (userInput)
            {
                case "1":
                    ab.CreateUser();
                    break;
                case "2":
                    ab.UpdateUserInformation();
                    break;
                case "3":
                    ab.RemovePersonFromList();
                    break;
                case "4":
                    ab.ShowAllPersonsInList();
                    break;
                case "x":
                    ProgramIsRunning = false;
                    break;
            }    
        }
    }

    private static void PrintUserOptions()
    {
        Console.WriteLine("Choose one of the following options: ");
        Console.WriteLine("#1 Create new user");
        Console.WriteLine("#2 Edit user information");
        Console.WriteLine("#3 Delete existing user");
        Console.WriteLine("#4 Show all users in adressBook");
    }

    private static AdressBook StartProgram()
    {
        AdressBook ab = new AdressBook();

        //Start program by loading saved users from txt-file
        WriteAndReadToFile writer = new WriteAndReadToFile();
        writer.ReadFromFile(ab);
        return ab;
    }
}

Человек

    class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Adress { get; set; }

        public Person(string firstName, string lastName, string adress)
        {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Adress = adress;
        }
    }
}

Адресная книга

class AdressBook
{
    private WriteAndReadToFile wtf;
    private List<Person> adressBookList = new List<Person>();
    public List<Person> AdressBookList
    {
        get { return adressBookList; }
        set { this.adressBookList = value; }
    }


    public AdressBook()
    {
        AdressBookList = new List<Person>();
        wtf = new WriteAndReadToFile();
    }

    // Create instance of Person-class and call AddPersonToList-method
    public void CreateUser()
    {
        Console.WriteLine("Enter firstName:");
        var firstName = Console.ReadLine();

        Console.WriteLine("Enter lastName:");
        var lastName = Console.ReadLine();

        Console.WriteLine("Enter adress:");
        var adress = Console.ReadLine();

        Person person = new Person(firstName, lastName, adress);
        AddPersonToList(person);
        wtf.WriteUserToFile(person);

    }

    // Add new person to AdressBookList
    private void AddPersonToList(Person person) => AdressBookList.Add(person);

    //Remove user from list where first and last name match
    public void RemovePersonFromList()
    {
        Console.WriteLine("Enter firstName of the user you want to remove");
        var firstName = Console.ReadLine();

        Console.WriteLine("Enter lastname of the user you want to remove");
        var lastName = Console.ReadLine();

        AdressBookList.RemoveAll(item => item.FirstName == firstName && item.LastName == lastName);
        wtf.UpdateUserOnFile(adressBookList);
    }

    //Show all Persons in AdressBookList
    public void ShowAllPersonsInList()
    {
        foreach (var person in AdressBookList)
        {
            Console.WriteLine("FirstName: {0}, LastName: {1}, Adress: {2}", person.FirstName, person.LastName, person.Adress);
        }
    }

    public void UpdateUserInformation()
    {
        Console.WriteLine("Which information do you want to update?");
        Console.WriteLine("#1: Firstname, #2: Lastname, 3# Adress");
        var userOption = Console.ReadLine();

        Console.WriteLine("Enter firstname on existing user to be updated");
        var oldFirstName = Console.ReadLine();
        UpdateUserFunction(userOption, oldFirstName);
    }

    private void UpdateUserFunction(string userOption, string oldFirstName)
    {
        var personsWithMatchingFirstName = AdressBookList.Where(person => person.FirstName == oldFirstName);
        string newValue;

        if (userOption == "1")
        {
            Console.WriteLine("Enter a new first Name");
            newValue = Console.ReadLine();

            foreach (var person in personsWithMatchingFirstName)
            {
                person.FirstName = newValue;
                wtf.UpdateUserOnFile(adressBookList);
            }
        }
        else if (userOption == "2")
        {
            Console.WriteLine("Enter a new last name");
            newValue = Console.ReadLine();

            foreach (var person in personsWithMatchingFirstName)
            {
                person.LastName = newValue;
                wtf.UpdateUserOnFile(adressBookList);
            }
        }
        else if (userOption == "3")
        {
            Console.WriteLine("Enter a new adress");
            newValue = Console.ReadLine();

            foreach (var person in personsWithMatchingFirstName)
            {
                person.Adress = newValue;
                wtf.UpdateUserOnFile(adressBookList);
            }
        }
    }
}

WriteToFile

class WriteAndReadToFile
{

    private readonly string UserTextFile = ConfigurationManager.AppSettings["textFileName"];

    public void WriteUserToFile(Person person)
    {
        using (StreamWriter sw = new StreamWriter(UserTextFile, true))
        {
            sw.WriteLine(person.FirstName + "," + person.LastName + "," + person.Adress + ",");
        }         
    }

    public void ReadFromFile(AdressBook ab)
    {
        string textLine;
        try
        {
            using (StreamReader sr = new StreamReader(UserTextFile))
            {
                while ((textLine = sr.ReadLine()) != null)
                {
                    string[] userInformation = textLine.Split(',');
                    Person p = new Person(userInformation[0], userInformation[1], userInformation[2]);
                    ab.AdressBookList.Add(p);
                }
            }
        }
        catch (FileNotFoundException fnf)
        {          
           Console.WriteLine("File does not exist " + fnf);
        }
        catch (Exception e)
        {
            Console.WriteLine("Something went wrong" + e);
        }
    }

    public void UpdateUserOnFile(List<Person> adressBookList)
    {
       // Remove old row
       using (StreamWriter sw = new StreamWriter(UserTextFile))
        {
            sw.Flush();
            foreach (var person in adressBookList)
            {
                sw.WriteLine(person.FirstName + "," + person.LastName + "," + person.Adress + ",");
            }
        }
    }
}

Для обратной связи о рабочем коде отправьте вместо этого Проверка кода.

JJJ 01.05.2018 21:22

Это действительно хорошо заданный вопрос, так что проголосуйте за него! Я уверен, что вы получите совет на форуме, предложенный @JJJ

brabster 01.05.2018 21:25

Спасибо за быстрый ответ. Вместо этого разместите его в обзоре кода!

Philip 01.05.2018 21:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
73
0

Другие вопросы по теме