Доступ статического члена - PullRequest
       3

Доступ статического члена

0 голосов
/ 14 сентября 2011

Вполне вероятно, что я все делаю неправильно, но у меня есть пользовательский элемент управления под названием CategoryControl, их может быть много, поэтому я решил, что многие из его функций лучше использовать в качестве статических методов.Я хотел знать, есть ли «лучший» способ доступа к этим методам, чем передача экземпляра по всему классу.Методы являются общедоступными, поскольку они будут обновляться другими методами.Мысль о создании методов расширения приходит на ум ..?

public CategoryControl(UserCategory userCategory)
{
   InitializeComponent();

   PopulateControl(userCategory, this);
}

private static void PopulateControl(UserCategory userCategory, CategoryControl instance)
{

   SetCategoryTitle(userCategory, instance);

   SetPercentCorrect(userCategory, instance);

   SetQuestionsMissed(userCategory, instance);

   SetBackgroundBar(userCategory, instance);

   SetForegroundBar(userCategory, instance);

}

Обновлено ::

Чем длиннее история, тем больше у меня панели на экранеПанель содержит соответствующие категории пользователей.Под релевантным я подразумеваю, что у пользователя есть возможность менять курсы, отображая новый набор категорий.Пользователь также может изменить значения категории в зависимости от их взаимодействия с программным обеспечением.Итак ...

На панели отображаются категории курса.

Я поддерживаю список активных элементов управления категориями на панели, а основная форма сообщает панели, когда рисовать новыйнабор категорий.

public void InitializeProgressPanel(UserCategories parentCategories)
{
   Contract.Requires(parentCategories != null, "parentCategories is null.");

   RemoveAllControlsFromList(_categoryControls);

   UserCategories sortedUserCategories = parentCategories.SortByWorst();

   int categoriesCount = parentCategories.Count();

   int spacer = (Height - (CategoryControl.Controls_Height * categoriesCount)) / categoriesCount+1;

   for (int i = 0; i < sortedUserCategories.Count; i++)
   {
      CategoryControl cc = new CategoryControl((UserCategory)sortedUserCategories[i]);

      cc.Left = 0;

      if (i == 0)
         cc.Top = spacer;
      else
         cc.Top = (Controls[i - 1].Bottom + spacer);

      Controls.Add(cc);
      _categoryControls.Add(cc);

      }
}

Ответы [ 5 ]

8 голосов
/ 14 сентября 2011

Я бы не стал делать методы расширения, если бы у меня в руках был класс, который я мог бы расширить.Помните, что цель методов расширения состоит в том, чтобы расширять типы, которые вы не можете расширить самостоятельно.

Тогда возникает вопрос, скажете ли вы:

class C 
{
    public void Foo() { ... }
}

или

class C
{
    public static void Foo(C c) { ... }
}

Я хотел бы задать несколько вопросов, таких как:

  • Будет ли когда-нибудь класс подклассом?Если так, то должен ли это быть виртуальный метод?
  • Является ли Фу тем, что экземпляр делает для себя, или тем, что он сделал с ним?Животное ест само по себе, но животное питается кем-то другим.

ОБНОВЛЕНИЕ:

Еще несколько вопросов, которые я хотел бы задать себе:

  • Будут ли когда-либо изменяться свойства и тому подобное, которые вы устанавливаете?Чем меньше изменчивости у вас в классе, тем проще тестировать, тем легче рассуждать и тем меньше будет ошибок.Если свойства и тому подобное никогда не изменятся, не устанавливайте их в методе any .Установите их в конструкторе и никогда больше не беспокойтесь о них;они правильные.
1 голос
/ 14 сентября 2011

Просто выстрел в темноте, но я бы, наверное, попробовал что-то более похожее на это:

private void PopulateControl(UserCategory userCategory)
{
    CategoryTitle = GetCategoryTitle(userCategory);
    PercentCorrect = GetPercentCorrect(userCategory);
    ...
}
1 голос
/ 14 сентября 2011

Кажется, лучше иметь функциональность для одного из двух классов, участвующих во взаимодействии, а не для какой-либо третьей стороны.

Вот два способа, которые приходят на ум:

  1. CategoryControl может иметь открытую функцию PopulateCategory (UserCategory userCat)
  2. UserCategory может иметь открытую функцию PopulateFromControl (CategoryControl ctrl)

Если все эти операции с заголовком и процентами и т. Д. Должны бытьотдельные действия, вы просто следовали бы приведенной выше модели, но имели бы отдельные функции для каждого элемента.

1 голос
/ 14 сентября 2011

Почему бы не сделать их членами экземпляра, и сделать это так

private UserCategory _userCategory;

public CategoryControl(UserCategory userCategory)
{
   InitializeComponent();

   this._userCategory = userCategory;
   this.PopulateControl();
}

private void PopulateControl()
{
   // to see userCategory you'd do "this._userCategory"
   // to see the specific instance you could simply do "this"

   SetCategoryTitle();

   SetPercentCorrect();

   SetQuestionsMissed();

   SetBackgroundBar();

   SetForegroundBar();

}
0 голосов
/ 14 сентября 2011

Некоторые вопросы могут помочь ... (?)

  • Какую выгоду вы чувствуете, делая методы статичными?Преобразовав метод в static, вы убираете неявную передачу «this» и каждый раз передаете его вручную.Как это поможет?(Это не сделает код более эффективным, это просто означает, что вы должны передавать 'instance' в каждый вызов, который вы делаете, поэтому вам нужно написать больше кода)

  • пользовательская категория сильно изменилась?Если нет, вместо того, чтобы передавать его для каждого вызова, имеет ли смысл сделать его переменной-членом?

  • Вы действительно хотите вызывать все эти статические методы один за другим, чтобыизменить все параметры управления?Посмотрите, как клиент будет использовать этот класс, и вы можете обнаружить, что вы можете свернуть все эти опции в один или два метода, которые принимают набор параметров и применяют их все в одном обращении.(Часто, если вы хотите изменить одну настройку, вы захотите изменить несколько настроек вместе)

...