2017-02-12 73 views
0

我无法理解我是否以正确的方式执行代码。我振动了应用程序。用户应该是类还是数组结构?

代码里面主要:

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位用户访问我的站点:David,Jow,Mike,所以getUserByName将被调用3次。

user.getUserByName("David"); 
user.getUserByName("Jow"); 
user.getUserByName("Mike"); 

这是否意味着每一个新记录的用户类字段loginpassword会在我的代码被覆盖?这似乎是。但这很好吗?或者我会有这样的问题:

例如,如果类的实例中的字段将被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”应该是一个静态方法,一个独立的函数或构造函数,所以你可以这样做:'new User(“David”)'或'new User(“Jow”)'。 – belka

+0

您应该选择完全不同的软件模式来将逻辑和模型彼此分开。考虑到您使用的是vibe.d,请参阅MVC或其他相关内容。 – Bauss

回答

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

login不是指类的login领域,因为你有一个名为login参数。如果你想要的类字段,你将需要:

writeln("login before: ", this.login); 
相关问题