2016-10-14 3 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() и работало правильно, но это то, что я хотел бы объявить один раз и использовать по нескольким областям, если это возможно.

Я также хочу передать параметры \ variables в check1_method, а не объявлять их внутри него. Каков наилучший способ сделать check1parameter доступным для всех методов в этом частичном классе? Он относится к другому классу, который каким-то образом связан с Other.Class.

Мой главный вопрос: как я могу сделать это как можно более эффективным, и должен ли я использовать private вместо public где угодно? Я все еще очень новичок в C# и еще не совсем понял инкапсуляцию, поэтому, пожалуйста, успокойся! :)

+0

'check1parameter' длинный, почему вы сравниваете его со строкой' 'something''? – Enfyve

+0

Хотя он длинный, он иногда содержит текст и преобразуется в строку. Я проверяю, что «что-то» является частью строки (обратите внимание, что она преобразуется в строку чуть выше - «stringToCheck = check1parameter.ToString()» –

+0

Длинный - это числовой тип, поэтому он может содержать только целое число, вы имеете в виду для использования 'char []' или 'byte []'? Или меня путают, что вы на самом деле не сравниваете строковый литерал '' Something '', но вы имеете в виду что-то в строках' '123456" ? – Enfyve

ответ

1

myClass не обязательно должен быть объявлен как частичный, если вы не намерены продолжать его реализацию в другом файле.

При использовании простой, если заявление они могут быть удалены, например, вы могли бы написать:

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 
    } 

Для того, чтобы спасти себя от объявления ненужных Bools. Помимо этого вы жертвуете удобочитаемостью для меньшего количества строк.

Когда дело доходит до публичных или частных, рекомендуется всегда указывать частное, если вам не нужен доступ к нему за пределами класса. На первый взгляд, disableFields() должен быть общедоступным, а check1_method() и checkEverything() быть закрытым.

EDIT: Кроме того, если check1parameter инстанциируется глобально myClass, то вам не нужно передать его в качестве параметра для check1_methods()

+0

Удаление оператора if в disableField не является логически эквивалентным. Ваш код будет обновлять статус каждый раз, когда вызывается поле. Исходный код будет включать только поле, если checkEverything истинно. –

+0

@PaulTsai Правда, функция disableFields() означает, что поле может быть отключено. Если @ jbab8 намеревается использовать инкапсуляцию и по-прежнему устанавливает 'EnquiryForm.GetControl (« Status »). Включен' в false в другом месте, то он побеждает цель иметь функцию в первую очередь. Вот почему я взял некоторые свободы там. – Enfyve

+0

Поле 'status' действительно установлено в значение false, ранее в методе' disableFields() '. Идея состоит в том, что, если все проверки не верны, она отключена. Я попробую изменения, которые вы предложили, но могу ли я их связать с изменениями, предложенными в другом ответе об использовании свойств для максимальной эффективности (угадывая здесь ..)? –

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 На концептуальном уровне это помогает укрепить дизайн вашего ума. Свойство является аспектом/членом/переменной (-ами) класса, метод - это действие. Независимо от того, нужно ли вам что-то проверять, определяется состояние некоторых переменных, а не действие. Это должно помочь определить, что-то является собственностью или нет. –

Смежные вопросы