Je développe une application qui sera utilisée pour ouvrir et fermer les vannes dans un environnement industriel, et je pensais à quelque chose de simple comme ceci: -
public static void ValveController
{
public static void OpenValve(string valveName)
{
// Implementation to open the valve
}
public static void CloseValve(string valveName)
{
// Implementation to close the valve
}
}
(L'implémentation écrirait quelques octets de données sur le port série pour contrôler la vanne - une "adresse" dérivée du nom de la vanne, et soit "1" ou "0" pour ouvrir ou fermer la vanne).
Un autre développeur a demandé si nous devrions plutôt créer une classe distincte pour chaque vanne physique, dont il existe des dizaines. Je suis d'accord qu'il serait plus agréable d'écrire du code PlasmaValve.Open()
plutôt que ValveController.OpenValve("plasma")
, mais est-ce exagéré?
De plus, je me demandais comment aborder au mieux la conception avec quelques exigences futures hypothétiques à l'esprit: -
- On nous demande de prendre en charge un nouveau type de vanne nécessitant différentes valeurs pour l'ouvrir et la fermer (pas 0 et 1).
- On nous demande de supporter une valve qui peut être réglée dans n'importe quelle position de 0 à 100, plutôt que simplement "ouverte" ou "fermée".
Normalement, j'utiliserais l'héritage pour ce genre de choses, mais j'ai récemment commencé à me concentrer sur "la composition plutôt que l'héritage" et je me demande s'il y a une solution plus lisse à utiliser en utilisant la composition?
la source
Réponses:
Si chaque instance de l'objet valve exécutait le même code que ce ValveController, il semble que plusieurs instances d'une même classe seraient la bonne solution. Dans ce cas, il suffit de configurer la valve qu'il contrôle (et comment) dans le constructeur de l'objet valve.
Cependant, si chaque contrôle de vanne a besoin d'un code différent pour fonctionner, et que le ValveController actuel exécute une instruction de commutateur géant qui fait des choses différentes selon le type de vanne, vous avez mal réimplémenté le polymorphisme. Dans ce cas, réécrivez-le dans plusieurs classes avec une base commune (si cela a du sens) et laissez le principe de responsabilité unique être votre guide de conception.
la source
Mon principal reproche est d'utiliser des cordes pour le paramètre identifiant la valve.
Créez au moins une
Valve
classe qui agetAddress
sous la forme les besoins d'implémentation sous-jacents et transmettez-les à laValveController
et assurez-vous que vous ne pouvez pas créer de vannes inexistantes. De cette façon, vous n'aurez pas à gérer les chaînes incorrectes dans chacune des méthodes d'ouverture et de fermeture.Que vous créiez des méthodes pratiques qui appellent l'ouverture et la fermeture
ValveController
vous appartient, mais pour être honnête, je garderais toutes les communications vers le port série (y compris l'encodage) dans une seule classe que d'autres classes appelleront en cas de besoin. Cela signifie que lorsque vous devez migrer vers un nouveau contrôleur, vous devez uniquement modifier une classe.Si vous aimez les tests, vous devez également créer
ValveController
un singleton pour pouvoir vous en moquer (ou créer une machine de formation pour les opérateurs).la source