Я не могу понять, правильно ли я делаю код. У меня есть приложение vibed.Должны ли пользователи быть классами или массивами структур?
код внутри основной: Класс
User user = new User(database);
user.getUserByName("admin");
Пользователь:
class User
{
string login;
string password;
//....
void getUserByName(string login)
{
// sql request here
this.login = row[1].coerce!string;
this.password = row[2].coerce!string;
}
//...
}
Как долго на экземпляр класса будет жить? Например, 3 пользователя приходят на мой сайт: Дэвид, Джоу, Майк, так getUserByName
будут называться 3 раза.
user.getUserByName("David");
user.getUserByName("Jow");
user.getUserByName("Mike");
Означает ли это, что с каждым новым полям пользователей протоколирования класса login
и password
будут перезаписаны в моем коде? Кажется, да. Но это хорошо? Или у меня возникли бы такие проблемы:
например, если поле в экземпляре класса будет инициализировано David
, а затем второй пользователь будет логин и поле будет изменено на Jow
?
Я решил проверить свою идею. И сделал:
void getUserByName(string login)
{
writeln("login before: ", login);
Prepared prepared = prepare(database.connection, `SELECT id, login, password, usergroup from users WHERE login=?`);
Thread.sleep(1.seconds); // pause till new getUserByName with another name will be called (as I think)
prepared.setArgs(login);
ResultRange result = prepared.query();
...
}
и в main
:
user.getUserByName("David");
user.getUserByName("Jow"); // calling another
Но это очень странно, что я получаю:
login before: David
login after: David
login before: Jow
login after: Jow
Но я ожидал, что после вызова (второй): user.getUserByName("Jow");
и после sleep
Я получу что-то вроде:
login before: David
login after: Jow
И я не могу понять, почему ...
Другой вариант, как я понимаю, это сделать пользователей в качестве структуры и создать новую копию структуры для каждого пользователя. Это хорошо? Или, может быть, есть еще одно лучшее решение?
Не было бы различий, если вы используете структуру или класс. Ваш пользовательский класс представляет одного пользователя. Я думаю, что «getUserByName» должен быть статическим методом, независимой функцией или конструктором, поэтому вы можете сделать: «новый пользователь (« David ») или новый пользователь (« Jow »). – belka
Вы должны выбрать совершенно другой шаблон программного обеспечения, чтобы разделить логику и модели далеко друг от друга. Учитывая, что вы используете vibe.d, идите на MVC или что-нибудь в этом направлении. – Bauss