Как перенести информацию с формы на форму в рамках ООП C#?

Уважаемые знатоки, прошу воспринять вопрос со всей серьезностью, так как для меня он имеет фундаментальную значимость для понимания принципов ООП. Раньше передавал информацию с формы на форму используя публичные статические глобальные переменные. Однако это противоречит принципу инкапсуляции. После продолжительных поисков пришел к методу перегрузки стандартной функции-инициализации формы с параметрами или дописыванию параметров в этой функции.
Пример:
public Form2(string text)
        {
            InitializeComponent();
        }

Но при дальнейшем углублении обнаружил, что если мне нужно будет создавать экземпляр класса, то при передаче его придется использовать только публичные поля. Осознав ошибку начал пользоваться сеттерами-сеттерами, конструктором и приватными полями.
Пример:
Класс:
public class User
    {
        private string name;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }

        public User(string name) 
        {
            Name = name;
        }
    }

Форма, с которой берутся данные:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            User user = new User(textBox1.Text);
            form2.LoadText(user);
            form2.Show();
        }
    }

Форма на которую передаются данные:
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public void LoadText(User user)
        {
            textBox1.Text = user.Name;
        }
    }

Насколько я понимаю в рамках инкапсуляции поля у класса остаются приватными, а работа с экземпляром происходит строго в рамках конструктора. В свою очередь перенос данных происходит не через глобальные переменные, а через вызов функции, что тоже не должно выходить за рамки.
Во время одной из дискуссий на форуме прочитал комментарий, в котором было написано, что подобное использование экземпляра класса является нерациональным. Прошу подсказать является ли последняя представленная реализация корректной в рамках ООП, и если нет, то подскажите, в какую сторону копать.
P.S. Намеренно не использую MVC, так пока что боюсь подступать к ней без погружения в ООП. Поэтому прошу писать про него только в том случае, если это единственный выход.
  • Вопрос задан
  • 307 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Я не гарантирую, что мой совет будет толковым, но... имхо, требование о приватности полей следует применять умеренно - в первую очередь в классах с нетривиальными методами. Там это позволяет избежать внезапного изменения поля, когда логика работы методов этого не ожидает. В этом случае сеттер свойства может проверить, разрешено ли изменять поле в настоящий момент, и действовать соответственно.

Разумеется, свойства необходимы, если мы планируем использовать паттерн Наблюдатель(Observer), который в C# реализуется через интерфейсы INotifyPropertyChanged и INotifyPropertyChanging. Если вкратце - если мы хотим, чтобы другие объекты могли подписаться на наш объект, и получать уведомления об изменении его состояния. Тут всё понятно - сеттер свойства будет эти уведомления рассылать.

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

В случае примитивных data transfer objects, как User в твоём примере, я не вижу особенного смысла в использовании свойств ради свойств. Я бы даже сделал его struct, а не class, но это уже пусть спецы по C# меня поправят.

Вообще, любую рекомендацию по проектированию нужно рассматривать не как заповедь, а как некий размен (trade-off): мы выигрываем в X, но проигрываем в Y (зачастую Y = сложность кода). И, соответственно, смотреть, что для тебя важнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы