Структура классов для создания текстового пользовательского интерфейса - PullRequest
0 голосов
/ 05 мая 2020

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


Я пытаюсь создать планировщик задач в VB. NET Консольный режим. Я создаю консольное приложение с текстовым пользовательским интерфейсом (TUI), в котором пользователи могут добавлять новые задачи, редактировать и удалять их, а также добавлять информацию о каждой задаче, например о сроках выполнения и завершении, путем ввода Консоль, а не форму Windows.

Для достижения этой цели нажатия клавиш пользователя перенаправляются функцией: поэтому вместо использования Console.ReadLine для всей информации я буду использовать Console.ReadKey для принятия пользовательского ввода, затем Console.SetCursorPosition и Console.Write для печати и стирания символов с экрана по мере необходимости.

Имея это в виду, мне интересно, как лучше всего структурировать мои классы, и как обращаться с методами, которые к ним относятся. На данный момент у меня три класса:

  • Task (отдельная задача или событие)
  • TaskList (список задач / событий)
  • Schedule (список задач / событий, организованный по дате, извлеченный из всех TaskLists.)

Поскольку мы делаем объектно-ориентированный подход, я хочу, чтобы каждый класс имел свои собственные методы . Например, TaskList и Schedule будут иметь метод Print для отображения информации о каждой задаче на консоли.

Я не уверен, в чем я не уверен: когда дело доходит до элементов пользовательского ввода, должно ли это выполняться внутри класса или снаружи?

Например, мне нужен метод Add, позволяющий пользователю создать новую задачу. Я мог бы либо:

  1. Создать метод Add в классе Task, который будет контролировать все нажатия клавиш пользователя и вводить всю необходимую информацию непосредственно в новый Task объект.

  2. Создайте метод AddTask в основном модуле, который создаст пустой объект Task, будет управлять всеми нажатиями клавиш пользователя и вводить информацию в новый объект Task.

Причина, по которой я не уверен, какой подход лучше всего, связана с TUI. Вся программа должна знать, где все находится по отношению ко всему остальному - например, если я помещу метод Add внутри класса Task, тогда класс Task должен знать, где на консоли печатать форму. , символы, вводимые пользователем, и т. д., чтобы не перезаписывать другие символы. Та же проблема, если я сделаю метод AddTask в основном модуле. Поэтому мне нужно либо иметь несколько глобальных переменных, хранящих ссылки на сетку, объявляющие, где должен go каждый элемент «Форма», либо я должен передать все эти ссылки на сетку в качестве параметров функции.

Итак, я действительно есть два вопроса здесь. Когда дело доходит до лучших практик для TUI, должен ли я:

  1. Объявить все методы внутри класса или за его пределами?

  2. Хранить информацию, необходимую для глобального создания TUI, или передавать информацию локально в виде параметров?

...