У меня возникла проблема с разработкой части моей программы (не написав ее, на этот раз!). Это трудно объяснить, не написав роман, поэтому я постараюсь быть кратким.Правильный способ компоновки интерфейса C#
В принципе, у меня есть программа, которая считывает/записывает параметры с части оборудования. В настоящее время он делает это через Serial, но в конце концов, мне понравится это сделать через USB, используя .NET-обертку для чипа FTDI. http://www.ftdichip.com/Projects/CodeExamples/CSharp.htm
Я думаю, что моя проблема в том, что я знаю, что хочу несколько уровней абстракции , но я не могу понять, где рисовать линии. Во-первых, я не хочу, чтобы мои функции ReadParam()
, WriteParam()
и SendCommand()
были в моем основном классе форм. Это просто кажется мощеным. Поэтому очевидно, что они должны быть в каком-то другом классе, который я создам. Назовем это Comm
.
Первый вариант: я мог бы сделать интерфейс, допустим, IComm
, и мои интерфейсы Serial и USB оба реализуют это. Проблема в том, что большой процент кода будет дублироваться в обоих вариантах, потому что у меня есть специальные ReadReplyData()
и другие функции, которые выполняют предварительную обработку последовательных данных, прежде чем возвращать их в графический интерфейс.
Итак, следующая опция: Comm является промежуточным классом, который определяет интерфейс ICommDriver
. Comm
будет реализовывать частную функцию форматирования ReadReplyData()
, а также общественность ReadParam()
, WriteParam()
и SendCommand()
, а ICommDriver
будет указывать только более простые функции Read
и Write
.
Все это кажется тривиальным, за исключением двух поворотов. Во-первых, я хочу, чтобы это было многозадачное, очевидно, поэтому GUI не зависает. Поэтому я думаю, что Comm
будет использовать BackgroundWorker
для выполнения всех операций чтения/записи. Кроме того, Serial-аромат нужно сообщить, какой порт COM открыть (из раскрывающегося меню GUI), в то время как USB-аромат не работает. Так я делаю эту часть интерфейса или нет?
Спасибо за помощь всем, я писал/удалял код в течение нескольких дней, пытаясь выяснить правильный способ сделать это!
Джонатона
У меня уже есть программное обеспечение, и я пытаюсь реорганизовать и очистить код. Как я уже упоминал, я ненавижу наличие функций 'ReadParam()' и 'WriteParam()' в моем классе MainForm. Эти два варианта в основном представляют собой оболочку класса .NET SerialPort и класс FTD2XX_NET FTDI. Таким образом, они почти идентичны, за исключением основных функций, которые они называют. –
@ Jonathon, что не так с абстрактным классом, который реализует общую функциональность? –
Я согласен с этой реализацией, когда у вас есть проблема с общим кодом. –