2016-10-14 5 views
0

ここにコードがあります。この記事の最後にある質問をご覧ください。これは効率的ですか、より良い方法でカプセル化を使用すべきですか?

public partial class myClass : Other.Class 
    { 
     long check1parameter = CurrentSession.CurrentFile.ID; 

     protected override void EnquiryLoaded(object sender, System.EventArgs e) 
     { 
      disableFields(); 
     } 
     private void disableFields() 
     { 
      if (checkEverything()) { 
       EnquiryForm.GetControl("Status").Enabled = true; 
      } 
     } 

     public bool check1_method(long check1parameter) { 
      bool Check1 = false; 
      string stringToCheck = check1parameter.ToString(); 
      if (stringToCheck.Contains("something")) { 
        Check1 = true; 
       } 
      return Check1; 
     } 

     public bool checkEverything() { 
      bool roleCheck = CurrentSession.CurrentUser.IsInRoles("RequiredRole"); 
      bool check1 = check1_method(check1parameter); 
      bool checkEverything = false; 
      if (roleCheck && check1) { 
       checkEverything = true; 
      } 
      return checkEverything; 
     } 
     //other methods 
    } 

コードは、誰かが役割を持っていることを確認すると、文字列が情報のビットが含まれていることをして、フィールドを無効にすることです。私は、これを実際のコードから簡略化して、キーポイントを概説しました。これらの単純なチェックを実行してフィールドを無効にすることだけが意図されていますが、後で展開できるように、これらのタスクの個別のメソッドを作成することをお勧めします。

long check1parameterがその位置に定義されていると、オブジェクト参照エラーが発生します。それはcheck1_method()にあり、正しく動作しましたが、可能ならば一度宣言して、複数の領域にわたって使用したいと思っています。

また、パラメータ\変数を内部で宣言するのではなくcheck1_methodに渡したいとします。この部分クラスのすべてのメソッドでcheck1parameterを利用できるようにするにはどうすればよいでしょうか?何らかの形でOther.Classにリンクされている別のクラスを指します。

私の主な質問は - これをできるだけ効率的にするにはどうすればいいですかここでpublicの代わりにprivateを使用する必要がありますか?私はまだC#で​​非常に新しく、まだカプセル化を理解していないので、簡単に私に行ってください! :)

+0

'check1parameter'は長いです、なぜあなたはそれを文字列' something "と比較していますか? – Enfyve

+0

長いですが、ときどきテキストを含み、文字列に変換されます。私は '何か'が文字列の一部であることをチェックしています(文字列に変換されていることを確認しています - 'stringToCheck = check1parameter.ToString()' –

+0

longは数値型です。文字列リテラル '' Something "'を実際には比較していないのですが、 '' 123456 ''の行に沿って何かを意味しているのではないかと混乱しています。 ? – Enfyve

答えて

1

myClassあなたが別のファイルに実装し続けるつもりでない限り、部分的に宣言する必要はありません。

それらを削除することができ、単純なif文を使用して、たとえば次のように書くことができます:不要なboolsを宣言するから自分を救うために

public partial class myClass : Other.Class 
    { 
     long check1parameter = CurrentSession.CurrentFile.ID; 

     protected override void EnquiryLoaded(object sender, System.EventArgs e) 
     { 
      disableFields(); 
     } 
     private void disableFields() 
     { 
      EnquiryForm.GetControl("Status").Enabled = checkEverything(); 
     } 

     public bool check1_method(long check1parameter) { 
      return check1parameter.ToString().Contains("something"); 
     } 

     public bool checkEverything() { 
      bool roleCheck = CurrentSession.CurrentUser.IsInRoles("RequiredRole"); 
      bool check1 = check1_method(check1parameter); 

      return (roleCheck && check1); 
     } 
     //other methods 
    } 

。それを超えると、より少ない行で読みやすさを犠牲にすることになります。

publicとprivateの場合は、クラスの外部からアクセスする必要がある場合を除き、常にprivateを指定することをお勧めします。一見すると、disableFields()はおそらく公開され、check1_method()checkEverything()はプライベートであるべきです。

EDIT:check1parametermyClassにグローバルにインスタンス化されている場合 また、あなたは、あなたが提供されたコードがOKに見えるcheck1_methods()

+0

disableFieldのifステートメントを削除することは、論理的には同等ではありません。ディセーブルフィールドが呼び出されるたびに、コードによってステータスが更新されます。元のコードは、checkEverythingがtrueの場合にのみフィールドを有効にします。 –

+0

@PaulTsai実際、disableFields()関数は、フィールドが無効になっている可能性があることを意味しています。 @ jbab8がカプセル化を使用しようとしていて、 'EnquiryForm.GetControl(" Status ")。Enabled'を他の場所でfalseに設定している場合は、最初に関数を持つ目的を破っています。だから私はそこにいくつかの自由を取ったのです。 – Enfyve

+0

'status'フィールドは実際に' disableFields() 'メソッドの前にfalseに設定されています。すべてのチェックが真でない限り、それは無効になっているという考えがあります。あなたが提案した変更を試してみますが、効率を最大化するためのプロパティの使用に関する他の答えに示唆されている変更とそれらを結びつけることができますか? –

1

にパラメータとしてそれを渡す必要はありません。私はいくつかの変更、主にコードの美学を作りました。主なものは、2つのチェックメソッドをプロパティにすることです。

public partial class myClass : Other.Class 
{ 
    long check1parameter = CurrentSession.CurrentFile.ID; 

    protected override void EnquiryLoaded(object sender, System.EventArgs e) 
    { 
     disableFields(); 
    } 

    private void disableFields() 
    { 
     if (checkEverything) 
     { 
      EnquiryForm.GetControl("Status").Enabled = true; 
     } 
    } 

    // the parameter name was the same as a variable in the class 
    // renamed to avoid confusion 
    public bool check1_method 
    { 
     get {return check1parameter.ToString().Contains("something");} 
    } 

    public bool checkEverything 
    { 
     get { return CurrentSession.CurrentUser.IsInRoles("RequiredRole") 
      && check1_method; } 
    } 
    //other methods 
} 
+0

ありがとう、それはもっときれいに見えます。私がやったやり方の代わりに、プロパティを使うことによって、どんな利点がありますか?ポールが言及したように、 –

+0

@ jbab8は、それは主に美学です。関数を使用することによっていくらかのオーバーヘッドがありますが、最初は無視できますが、どちらの状況でもコンパイラは同じマシンコードを出力するでしょう。読みやすさと好みになります。 – Enfyve

+0

@ jbab8概念レベルでは、あなたの心の中でデザインを強化するのに役立ちます。プロパティはクラスのアスペクト/メンバ/変数であり、メソッドはアクションです。何かをチェックすべきかどうかは、実際にはアクションではなく、いくつかの変数の状態を前提としています。それが何かが財産であるかどうかを判断するのに役立ちます。 –

関連する問題