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");
這是否意味着每一個新記錄的用戶類字段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」應該是一個靜態方法,一個獨立的函數或構造函數,所以你可以這樣做:'new User(「David」)'或'new User(「Jow」)'。 – belka
您應該選擇完全不同的軟件模式來將邏輯和模型彼此分開。考慮到您使用的是vibe.d,請參閱MVC或其他相關內容。 – Bauss