J'ai un problème pour concevoir une partie de mon programme (ne l'écris pas, pour une fois!). C'est un peu difficile à expliquer sans écrire un roman, alors je vais essayer d'être bref.Correct façon de mettre en page l'interface C#
Fondamentalement, j'ai un programme qui lit/écrit des paramètres d'un morceau de matériel. Actuellement, il le fait sur Serial, mais finalement, je vais le faire sur USB, en utilisant l'encapsuleur .NET pour la puce FTDI http://www.ftdichip.com/Projects/CodeExamples/CSharp.htm
Je pense que mon problème est, je sais que je veux plusieurs couches d'abstraction , mais je n'arrive pas à savoir où dessiner les lignes. Premièrement, je ne veux pas que mes fonctions ReadParam()
, WriteParam()
et SendCommand()
soient assises dans ma classe principale. Cela semble juste pavé. Donc, évidemment, ils devraient être dans une autre classe, que je vais instancier. Appelons cela Comm
pour l'instant.
La première option est, je pourrais faire une interface, disons IComm
, et mes deux modes Serial et USB implémentent cela. Le problème avec ceci est, un grand pourcentage du code serait dupliqué dans les deux saveurs, parce que j'ai ReadReplyData()
spécial et d'autres fonctions, qui font le pré-traitement des données sérielles avant qu'elles le retournent à l'interface graphique. L'option suivante est donc Comm, une classe intermédiaire, qui définit une interface ICommDriver
. Comm
implémenterait une fonction de formatage privée ReadReplyData()
, ainsi que les fonctions publiques ReadParam()
, WriteParam()
et SendCommand()
, alors que ICommDriver
ne spécifierait que des fonctions Read
et Write
plus simples.
Tout cela semble trivial, sauf pour deux rebondissements. Premièrement, je veux que ce soit multi-theaded, évidemment, de sorte que l'interface graphique ne se bloque pas. Donc, je pense que Comm
utiliserait un BackgroundWorker
pour faire toutes les lectures/écritures. En outre, la saveur Serial doit être indiquée au port COM à ouvrir (à partir d'une liste déroulante GUI), alors que la saveur USB ne le fait pas. Est-ce que je fais cette partie de l'interface ou pas?
Merci pour votre aide tout le monde, j'ai écrit/supprimé du code pendant des jours en essayant de trouver la bonne façon de le faire!
Jonathon
J'ai déjà le logiciel qui fonctionne, et j'essaie de refactoriser et de nettoyer le code. Comme je l'ai mentionné, je déteste avoir mes fonctions 'ReadParam()' et WriteParam() 'dans ma classe MainForm. Les deux versions sont essentiellement des wrappers de la classe .NET SerialPort et de la classe FTD2XX_NET de FTDI. Ils sont donc presque identiques, à l'exception des fonctions sous-jacentes qu'ils appellent. –
@Jonathon qu'est-ce qui ne va pas avec une classe abstraite qui implémente la fonctionnalité partagée? –
Je suis d'accord avec cette implémentation lorsque vous avez ce problème de code partagé. –