Вопрос по комментарию к уроку о функциях C++ (функция авторизации пользователя)
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Приветствую уважаемые мэтры. Не хотел создавать отдельную тему по просьбе Cranium, но увидев, что форум не особо многолюден решил написать. В предыдущей версии предложенного мною решения был БАГ, который я вроде исправил в нижеприведенном коде(отмечен примечанием). Суть темы не сколько получить рабочий код, сколько узнать, какой вариант решения более приемлем.
Программа проверяет ввод логина и пароля. Если пароль или логин не верны, она предлагает попробовать ввести их заново (если логин подтвержден, то предлагается ввести повторно только пароль к нему). Решение, соответственно, с использованием функций и без спец. возможностей языка (на основе уроков C++ до темы с функциями).
Спасибо за потраченное время.
Непрокатилло :/
раз:
два:
Что мне не понравилось в коде (относится к обеим версиям):
(1) Код работает неправильно. Это — главный недостаток.
(2) Хардкодить логины и пароли — плохая идея. Ещё более плохая идея хардкодить их в разных местах программы. Не будем обращать внимание, что эта информация хранится в открытом виде — считаем, что программа учебная и задача криптозащиты не стоит.
В комментарии в программе ты сам написал: номер элемента массива с паролем соответствует номеру элемента массива с логином. Вопрос: зачем тогда два массива, когда можно обойтись либо одним двумерным массивом, либо одномерным массивом структур из двух полей? (Второе предпочтительнее.)
Исходя из вышесказанного, вырисовывается структура данных для хранения логинов/паролей. В примитивной реализации это
Массив из таких структур легко инициализировать литералами в тексте программы (исключительно в целях отладки!). Но можно так же легко читать из внешнего источника, например из текстового файла (или БД). В дальнейшем эту структуру легко преобразовать в класс, который обеспечивает безопасное хранение логина/пароля, чтение из потока, запись в поток, криптозащиту, очистку памяти, сравнение и т.д., и т.п.
(3) Не знаю на сколько обоснована раздельная проверка логина и пароля. С точки зрения взлома, брутить сначала логин, а затем брутить пароль к уже известному логину гораздо проще, чем пытаться подбирать пару.
(4) Интерфейс работы с пользователем, по возможности, надо отделять от основной логики программы. Т.е. в данном случае, запросили у пользователя логин и пароль и вызвали функцию, которая обработает эту информацию. По результату, возвращённому функцией, сказали пользователю всё, что мы о нём думаем.
Сейчас у тебя всё смешано в одну кучу и размазано по коду ровным слоем.
В более продвинутом случае, все строки, которые показываются пользователю, лучше хранить в файле ресурсов, или хотя бы в отдельном cpp-файле в виде глобального константного массива строк. Это позволяет сделать безболезненную локализацию программы (перевод на другой язык, например на английский). Но это так, к слову.
(5) Использовать рекурсию вместо очевидного цикла — зло. На чём ты, кстати, и словил свои баги.
«Итерация свойственна человеку, рекурсия божественна.» — L Peter Deutsch. И, как всякий инструмент бога, рекурсию надо применять очень осмотрительно.
Попробуй переписать программу с учётом вышеописанных соображений.
Спасибо большое за отзыв! Как получу верное решение, постараюсь отписаться.