2017-06-01 13 views
-1

ライブラリ用のシンプルなソフトウェアを作りたいと思います。私はちょうどC#でOOPの概念を把握し始めました。私は教授の一人から、クライアントコードがデータを扱うクラスと直接対話しないように、コードにリポジトリクラスを持たせるのがよいことを教えられましたベース。だから、私はWindowsフォームでログインフォームを登録しようとしていますが、いくつか問題があります。OOPを使用したC#シンプルライブラリプロジェクト

public User GetByUsernameAndPassword(string username, string password) 
    { 
     using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate)) 
     { 
      using (StreamReader sr = new StreamReader(fs)) 
      { 
       while (!sr.EndOfStream) 
       { 
        User item = new User(); 
        item.FirstName = sr.ReadLine(); 
        item.LastName = sr.ReadLine(); 
        item.Username = sr.ReadLine(); 
        item.Password = sr.ReadLine(); 
        if (item.Username == username && item.Password == password) 
        { 
         return item; 
        } 
       } 
       return null; 
      } 
     } 
    } 

私のポイントは、私は、私は、新しいユーザーを登録するとき場合、既に同じユーザ名を持つ別のユーザーが存在するかどうかを確認したいということで、そこにある場合、私はメッセージボックスが同じユーザー名をすることはできませんと言って表示させたいです2回使用されます。どうすればこれを達成できますか?返された結果がnullの場合にメッセージボックスを表示させ、結果がクラスUserからオブジェクトを返すときにユーザーにログインするにはどうすればよいですか?

ありがとうございます。

+1

ヒントは、使用している文の間の '{'を削除することができます。彼らは同じ '{...} 'を共有し、ネスティングを少し減らします。 – Amy

+0

実際に 'GetByUsernameAndPassword'を呼び出すコード(フォームのコード)も見てください。 2つの部分の間の接続を作ることは、この問題を解決するのに役立ちます。 –

+0

あなたのメソッドは失敗時に 'null'を返しますが、少なくとも2つの失敗シナリオがあり、発生したコードを呼び出しコードに知らせることはできません。このメソッドをあまり具体的にしないと便利だと思います。特定のユーザー名*と*パスワードを使用してユーザーを検索するのではなく、特定のユーザー名でユーザーを検索するメソッドを作成します。これは、複数のシナリオで役に立ちます。登録コードは、ユーザー名がすでに使用されているかどうかを判断するために使用します。ログインコードは、ユーザーが存在するかどうかを判断するために使用します。 –

答えて

1

重複するユーザー名を探すことを考える前に、「データベース」の構造を定義することをお勧めします。分では、これは単純なテキストファイルのように見えますが、複数のユーザーを格納するための規定はありません。

アプリケーションのユーザーカウントが低い場合、テキストファイルは問題ありませんが、フォーマットを定義することが重要です(たとえば、1行に1人のユーザー、プロパティはコンマで区切られます)。この場合、起動時にファイル全体をRAMに読み込んでIEnumerable型に格納することをお勧めします。

あなたのアプリケーションのユーザー数が多い場合は(コンテキストによってはそれがないと思われますが)、適切なデータベースソリューション(おそらくSQLベースのもの)を検討することをお勧めします。テキストファイルはこの時点で非効率になります。

これをソートすると、重複を検出することが簡単になります。あなたはユーザーオブジェクトのリストを持っていた場合たとえば、あなたは可能性:

private List<User> users; 

internal bool DoesUsernameExist(string username) 
{ 
    return (this.users.Where(x => x.Username == username).Count() > 0); 
} 

もう一つの事は注意します。パスワードをプレーンテキストで保存するのは良い考えではないでしょう。 https://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1(v=vs.110).aspxを保護するために、業界標準のハッシュアルゴリズムを使用してパスワードをハッシュしてみることをお勧めします。

+0

私は 'Count()> 0'の代わりに' Any() 'を使います。なぜなら、一致が見つかるとすぐに反復をやめるからです。 'Count'は完全なシーケンスを反復しなければなりません。しかし、ユーザ名でユーザを探しているのであれば、 'List 'の代わりに 'Dictionary 'を使うでしょう。 –

関連する問題