Соответствующие вопросы дизайна программирования - PullRequest
2 голосов
/ 30 мая 2010

У меня есть несколько вопросов о хорошем дизайне программирования.Сначала я опишу проект, который я строю, чтобы вы были лучше подготовлены, чтобы помочь мне.

Я пишу инструмент удаленного помощника, похожий на TeamViewer, Microsoft Remote Desktop, CrossLoop.Он будет включать такие понятия, как сетевое соединение UDP (с использованием сетевой библиотеки Lidgren ), обход NAT (поскольку многие компьютеры в настоящее время невидимы за маршрутизаторами), зеркальные драйверы (используя зеркальный драйвер DFMirage (http://www.demoforge.com/dfmirage.htm) для экрана реального временизахватывая удаленный компьютер).

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

У меня есть форма Windows, которая позволяетпользователь может выбирать между предоставлением помощи и получением помощи. У меня есть другая форма Windows для модуля проводника файлов. У меня есть другая форма Windows для модуля чата. У меня есть другая форма Windows Form для модуля редактора реестра. У меня есть другая форма Windows длямодуль живого управления. Так что яПолучил форму для каждого модуля, которая поднимает первый вопрос:

1.Должен ли я обрабатывать специфичные для модуля команды внутри кода соответствующей формы Windows? Имеется в виду, скажем, я получаю команду с некоторыми данными, которая перечисляет файлы удаленного пользователя для определенного каталога.Очевидно, мне придется обновить это в форме Windows File Explorer и добавить записи в ListView.Должен ли я обрабатывать этот код внутри формы Windows, хотя?Или я должен обработать это в другом классе (хотя я должен в конечном итоге передать данные в форму для рисования, конечно).Или это как гибрид, в котором я обрабатываю большую часть данных в другом классе и передаю окончательный результат в форму для рисования?

Итак, у меня есть 5-6 форм, по одной на каждый модуль.Пользователь запускает мою программу, вводит идентификатор удаленного компьютера (не IP, ID, потому что мы регистрируемся на промежуточном сервере для включения прохождения NAT), его пароль и подключается.Теперь давайте предположим, что соединение успешно.Затем пользователю предоставляется форма со всеми различными модулями.Таким образом, он может открыть Проводник, или он может связываться с Редактором реестра, или он может общаться в чате со своим другом.Так что теперь программа находится в режиме ожидания, просто ожидая, что пользователь что-то сделает.Если пользователь открывает Live Control, то программа будет тратить большую часть своего времени на получение пакетов с удаленного компьютера и их отрисовку в форму, чтобы обеспечить просмотр в реальном времени.

2. Второй вопрос дизайна.Выделите вопрос № 1. Как бы я передавал специфичные для модуля команды в соответствующие Windows Forms? Я имею в виду, что у меня есть класс, подобный "NetworkHandler.cs", который проверяет сообщения с удаленного компьютера.NetworkHandler.cs - это статический класс, доступный в глобальном масштабе.Допустим, я получил команду, которая перечисляет файлы удаленного пользователя для определенного каталога. Как я бы " передал " эту команду в форму Проводника.Я думал о создании OnCommandReceivedEvent внутри NetworkHandler и о том, чтобы каждая форма регистрировалась на это событие.Когда NetworkHandler получит команду, она вызовет событие, все формы проверит его, чтобы увидеть, является ли оно актуальным, и соответствующая форма примет действие.Это подходящее / лучшее решение?

3.Сетевая библиотека, которую я использую, Lidgren, предоставляет две опции для проверки сетевых сообщений. Можно либо опросить ReadMessage (), чтобы вернуть null, либо сообщение, либо можно использовать AutoResetEvent OnMessageReceived (я полагаю, что это похоже намероприятие).Какой из них больше подходит?

1 Ответ

1 голос
/ 30 мая 2010
  1. Введите как можно меньше кода в форме. Вы должны создать отдельный класс / набор классов для обработки этого и заставить форму использовать их для рисования.

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

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

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