@I_suss

Можете покритиковать мой код?

Здраствуйте, я новичок в программирование и учусь программировать на яп C++ и качестве практики решил сделать небольшую программу для регистрации и входа. Так как я не могу адекватно оценивать свой код из за полного отсутствия опыта, я бы хотел чтобы Вы дали конструктивную критику, чтобы в будущем мог отталкиваться от своих ошибок.
Заранее отвечу на вопрос который точно напишут: Я эту программу написал для практики написания кода на C++, а не написание запрос SQL и настройки баз данных. От этого логин и пароль хранятся в txt файле, на вашем пк, не зашифрованном виде, это практика, надеюсь на понимание.

#include <iostream>
#include <fstream>
#include <string>

void Menu();
void Registration(std::string &RegEmail, std::string &RegPassord);
void Login(std::string &LogEmail, std::string &LogPassord);
void Input(std::string& Email, std::string& Password);

int main()
{
	Menu();
	std::cin.get();
}

void Menu()
{
	int Number = 0;

	std::string Email;
	std::string Password;

	std::cout << "-Меню-" << std::endl;
	std::cout << "1. Регистрация" << std::endl;
	std::cout << "2. Войти" << std::endl;
	std::cout << "3. Выход" << std::endl;
	std::cout << " " << std::endl;
	std::cout << "Введите номер пункта:" << std::endl;
	std::cin >> Number;

	switch (Number)
	{
	case 1:
		Input(Email,Password);
		Registration(Email, Password);
		break;
	case 2:
		Input(Email, Password);
		Login(Email, Password);
		break;
	case 3:
		std::cout << " " << std::endl;
		exit(0);
		break;
	default:
		system("cls");
		std::cout << " " << std::endl;
		std::cout << "Нет такого пункта" << std::endl;
		std::cout << " " << std::endl;
		Menu();
		break;
	}
}

void Registration(std::string &RegEmail, std::string &RegPassword)
{
	std::ofstream Data("Data.txt");
	Data << RegEmail << std::endl << RegPassword;
	Data.close();

	std::cout << " " << std::endl;
	std::cout << "Вы успешно зарегистрировались!" << std::endl;
	std::cout << " " << std::endl;
	Menu();
}

void Login(std::string &LogEmail, std::string &LogPassword)
{
	std::string Email;
	std::string Password;
	std::ifstream Data("Data.txt");

	if (Data.is_open())
	{
		std::getline(Data, Email);
		std::getline(Data, Password);
		Data.close();

		if (LogEmail == Email && LogPassword == Password)
		{
			system("cls");
			std::cout << " " << std::endl;
			std::cout << "Вы вошли в систему!" << std::endl;
			std::cout << " " << std::endl;
		}
		else
		{
			system("cls");
			std::cout << " " << std::endl;
			std::cout << "Не верный логин или пароль" << std::endl;
			std::cout << " " << std::endl;
			Menu();
		}
	}
	else std::cout << "Ошибка. У вас нет аккаунта" << std::endl;
}

void Input(std::string &Email, std::string &Password)
{
	system("cls");
	std::cout << "-Вход-" << std::endl;
	std::cout << "Почта: ", std::cin >> Email;
	std::cout << "Пароль: ", std::cin >> Password;
}
  • Вопрос задан
  • 273 просмотра
Решения вопроса 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
1) (Вкусовщина) стиль наименования не самый удачный. И переменные и функции называются одинаково - каждое слово с большой буквы без разделителей. Во всех массово применяемых стилях обычно переменные, функции и константы называются по разному. Например, переменные можно называть log_password. Функции и так оставить с большой буквы, а константы - полностью большими буквами.

2) обилие вложенных if. Практикуйте ранний выход. Например в Login() можно сделать так:
if (Data.is_open()) {
  std::cout << "Ошибка. У вас нет аккаунта" << std::endl;
  return;
}


И весь оставшийся код оказывается на 1 уровень выше.

3) Бесконечные рекурсивные вызовы - это плохо. Рано или поздно программа упадет с закончившимся стеком.
У вас Menu вызывает Login, который опять вызывает Menu. Да и сам Menu тоже.

Лучше сделать в Menu бесконечный цикл (while(true)) и или выходить из программы через exit(), или возвращать из Login, что надо завершаться и тогда в Menu делать break.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Мда. Любители крестов - мозохисты. Я-бы так написал.

using namespace std;

cout << "-Меню-\n";

Лаконично?

И зачем вам такой перевод строки?
Что, хотите под DOS и Mac сразу писать? Готов спорить что не грозит.

А это что?
LogPassword == Password
Пароли так никто не проверяет. Есть функция которая сверяет хеши паролей. Потому что их не хранят никогда.
В базе тоже их не хранят.

А это что?
std::ofstream Data("Data.txt");
Всё пишем в один файл? Всех пользователей? И файл переписывается?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Macaronin
Не слушай никого, главное чтобы работало
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы