Последние пару недель я проходил несколько онлайн-курсов по C#, чтобы изучить программирование. Поскольку у меня нет друзей, которые занимаются программированием, мне было трудно получить обратную связь / отзывы о коде, который я пишу. Конечно, код работает, но как насчет качества кода?
Чтобы избежать наихудших ошибок новичков, я бы очень одобрил, если бы кто-нибудь мог быстро взглянуть на приведенный ниже код или направить меня на какой-нибудь другой форум, где проверка кода является темой. (Просто удалите эту ветку, если это неправильный подход к SO).
О проекте
Я создал простую адресную книгу (консольное приложение) на основе четырех классов:
Приложение имеет следующие возможности:
Для простоты я добавил только имя и адрес в приложении, также есть очень плохая проверка ввода данных (фокусировка на изучении ООП). Что касается функции обновления, я знаю, что она обновит все, что соответствует 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
Спасибо за быстрый ответ. Вместо этого разместите его в обзоре кода!
Для обратной связи о рабочем коде отправьте вместо этого Проверка кода.