2017-02-12 29 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); 
相關問題