Общедоступные статические переменные c # Используются правильно? - PullRequest
4 голосов
/ 06 августа 2010

Как уже упоминалось в предыдущем посте, в настоящее время я изучаю C #, и для моего первого (ну, во-вторых, если вы включите hello world и немного возитесь) реального проекта я собираюсь создать базовую систему EPOS, а затем расширить ее. это ..

Мое намерение состоит в том, чтобы все цены, детали кассира, торговые операции и т. Д. Хранились в базе данных MySQL (я могу перейти с PHP на C #, но не могу заставить себя отойти от MySQL!)

Я хотел бы проверить следующее:

У меня есть 2 формы (в настоящее время)

  • Экран входа в систему (где пользователь вводит свой ПИН-код)
  • Главный экран продаж.

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

Мне нужно каким-то образом передавать информацию между формами, поэтому я создал новый файл класса с именем variableStore.cs, я собираюсь сохранить userID, userName (чтобы я мог иметь «Текущий вход в систему»). : Джон Доу "в каждой строке состояния формы.

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

Является ли это правильным (хорошо, не правильно, но так ли это?) 1022 *

Ответы [ 5 ]

1 голос
/ 06 августа 2010

Говоря об аутентификации и авторизации, вы должны создать собственную реализацию IPrincipal и IIdentity, которые затем задаются в потоке ( Thread.CurrentThread ).

IPrincipal идет в потоке, и он удерживает ваш IIdentity. Ваша реализация может быть запрошена, чтобы определить, аутентифицирован ли пользователь и что ему разрешено делать (см. IsInRole).

Что касается использования глобальных переменных для хранения информации, это не очень хорошая идея. Тем не менее, вы начинаете, так что это может быть полезно для вас.

В качестве альтернативы, вы можете создать открытые свойства в ваших формах, где вы их установили, и после закрытия формы получить результаты действий пользователя над формой (не забывайте, что форма - это объект, как и все остальное). Таким образом, если форма A создает экземпляр формы B, показывает B модально, а затем возвращает контроль после закрытия формы B, форма A может затем получить результаты (независимо от того, что они есть) взаимодействия с пользователем из свойств на B.

public class B : Form
{
  // Set when the user completes a sale and closes the form with the OK button.
  public SaleItem Sale{ get; private set;}
}  

Это намного лучше, чем использование глобального хранилища для переменных. Если бы я делал это, я бы использовал инфраструктуру внедрения зависимостей, такую ​​как Unity, чтобы получить экземпляры классов, которые обеспечивают функции, такие как продажи, в моем приложении.

1 голос
/ 06 августа 2010

Я бы не поступил так, как ты сказал. Это веб-приложение?

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

Для передачи суммы транзакции вам необходимо запросить информацию из базы данных и показать ее на веб-странице. Ты можешь сделать это?

Вы также можете передавать данные, используя следующее: -

 1. constructor
 2. objects
 3. properties
 4. Delegates
1 голос
/ 06 августа 2010

Нет, я бы так не поступил.

Гораздо лучший способ обработки - передача значений между формами через конструктор, свойства или методы.

Конструктор

public class SalesForm : Form
{
    public SalesForm(string userName)
    {
        Text = "Currently Logged In: " + userName;
    }
}

Теперь в обработчике нажатия кнопки «Форма входа» (после аутентификации пользователя):

var mainForm = new SalesForm(userName);
mainForm.Show();

Недвижимость

public class SalesForm : Form
{
    private string _userName = null;

    public string UserName 
    { 
        get
        {
            return _userName;
        }
        set
        {
            _userName = value;
            if(!String.IsNullOrEmpty(_userName))
                Text = "Currently Logged In: " + _userName;
        }
    }
}

И снова, в форме входа в систему обработчик нажатия кнопки:

var mainForm = new SalesForm();
mainForm.UserName = userName;
mainForm.Show();

Метод

public class SalesForm : Form
{
    public void SetTitle(string userName)
    {
        Text = "Currently Logged In: " + userName;
    }
}

И

var mainForm = new SalesForm();
mainForm.SetTitle(userName);
mainForm.Show();
0 голосов
/ 06 августа 2010

Для небольшого, простого приложения, когда вы только начинаете, статические переменные могут помочь запустить работу, но вы не хотите в нее входить. Вы могли бы начать с записи всех ваших переменных состояния в одном месте, но затем отступите назад и найдите время, чтобы подумать о том, где вы на самом деле их используете. Если некоторые переменные используются только в одной небольшой части программы, попробуйте придумать способы скрыть их от остальной части программы, например, поместив их в класс, в котором экземпляру будет предоставлена ​​только эта часть программы. из. Когда вы пишете свою программу, периодически делайте перерывы, смотрите на свои занятия и думайте о следующем:

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

  2. Изоляция: Излагает ли мой класс информацию, которую другие классы не должны знать о ней? Я должен только рассказать другим классам, что им нужно, чтобы они использовали меня для моей работы. Мне также нужно, чтобы другие классы не мешали моей работе как можно лучше. Если другие классы используют меня неправильно, я должен громко жаловаться (выкидывать исключения), чтобы разработчик понял, что что-то не так.

  3. Неповторение: есть ли у меня части кода, которые выглядят очень похожими, с небольшими изменениями между ними? Попробуйте найти способ объединить эти фрагменты кода в один метод и вызывать этот метод из каждого места. Если вам когда-либо приходится исправлять ошибку и приходить к нескольким местам в коде, чтобы применить исправление, это признак того, что вы повторяете себя. Потратьте время, чтобы это исправить, и в будущем это будет полезно во многих отношениях.

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

0 голосов
/ 06 августа 2010

Обычно предпочитают использовать шаблон IServiceProvider, но в небольших и тривиальных случаях static будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...