2017-02-12 10 views
0

Я не могу понять, правильно ли я делаю код. У меня есть приложение 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 

И я не могу понять, почему ...

Другой вариант, как я понимаю, это сделать пользователей в качестве структуры и создать новую копию структуры для каждого пользователя. Это хорошо? Или, может быть, есть еще одно лучшее решение?

+0

Не было бы различий, если вы используете структуру или класс. Ваш пользовательский класс представляет одного пользователя. Я думаю, что «getUserByName» должен быть статическим методом, независимой функцией или конструктором, поэтому вы можете сделать: «новый пользователь (« David ») или новый пользователь (« Jow »). – belka

+0

Вы должны выбрать совершенно другой шаблон программного обеспечения, чтобы разделить логику и модели далеко друг от друга. Учитывая, что вы используете vibe.d, идите на MVC или что-нибудь в этом направлении. – Bauss

ответ

1
writeln("login before: ", login); 

Это login не относится к login полю класса, потому что у вас есть аргумент с именем login. Если вы хотите, чтобы поле класса вам понадобилось:

writeln("login before: ", this.login); 

 Смежные вопросы

  • Нет связанных вопросов^_^