正しい方法でコードを実行しているかどうかわかりません。私はアプリケーションを振動させた。メイン内部ユーザーはクラスまたは構造の配列ですか?
コード:
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
で初期化され、2番目のユーザーがログインし、フィールドが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
と私は理解して、私がなぜ...
他の変形を理解することはできませんが構造として、ユーザーを作成し、すべてのユーザーのための構造の新しいコピーを作成することです。いいですか?それとももっと良い解決法がありますか?
構造体またはクラスを使用すると違いはありません。ユーザークラスは1人のユーザーを表します。私は "getUserByName"は静的メソッド、独立した関数またはコンストラクタでなければならないと思いますので、 'new User( "David")'または 'new User( "Jow")'とすることができます。 – belka
ロジックとモデルを互いに分離するためには、まったく別のソフトウェアパターンを選択するべきでしょう。あなたがvibe.dを使用していることを考慮して、MVCかその行に沿ったものを探してください。 – Bauss