Je cherche à faire un code python qui évite la répétition des classes et faire le code le plus modulaire et plus propre possible.
Pour cela voici mon besoin :
Je souhaite avoir une classe mère qui décrit comment construire les messages de requêtes et les messages de réponse. Ainsi que des méthodes afin de pouvoir les décoder (requête et réponse) et me soustraire du protocole de communication. (Que je souhaite modifier dynamiquement lors de l'exécution du code)
J'ai donc pensé à créer deux méthodes.
Je prend maintenant l'exemple de LoRaWAN :
Il existe deux types de messages -> Les messages de Type "Uplink" et "Downlink".
- Dans ce cas Uplink correspond à getRequestMessageBuilder
- Et Downlink correspond à getResponseMessageBuilder
(Cela pointerait sur des classes différentes en HTTP, en Bluetooth, etc ...)
Ces messages ont de multiples attributs qui sont très nombreux (Chacun a ses propres attributs, difficile de mettre tout cela en commun)
- Port
- DevEUI
- EncodedPayload
- ...
Ces deux types de messages (Uplink et Downlink) peuvent être du type UplinkFragment, DownlinkFragment, UplinkMulticast, DownlinkMulticast, UplinkOwner, DownlinkOwner, etc etc ...
Par exemple DownlinkFragment utilise un port différent par exemple dans ce cas 201.
Je cherche à faire un code python qui évite la répétition des classes et faire le code le plus modulaire et plus propre possible.
Ça commence mal .
La répétition des classes n'est pas une mauvaise chose, tout particulièrement si on prête attention au principe SOLID.
Le principe DRY est souvent mal compris et on se retrouve avec des codes complexes et plus très lisibles (est-ce que 6 mois après je comprend ce j'ai écris).
Je n'ai pas lu vos docs, mais si vous suivez ce principe (SOLID) vous êtes bon !
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
en fait je n'ai pas forcément compris ton besoin : je crois comprendre que les paramètres sont différents à l'envoi et qu'aussi les réponses ? Et j'ignore si ce sont des classes ou un simple dict ou json
Il me semblait logique d'écrire:
class TransportChannel:
def __init(self, proto: Protocol) : self.protocole = proto
def __send(self) : self._resp = self.protocole.send() # un getter response() qui reformate _resp en plus génériue quel que soit le protocole ?
class protocol1(Protocol):
pass
p1 = Protocole1(x, y, z)
p2 = Protocole2(a, b)
transport = TransportChannel(p1) # ou p2
transport.send()
resp : TProtocolResponse = transport.response() # resp est spécifique à protocolX ? ou générique après être passé par le getter de transport ?
A noter qu'il existe des design pattern, oui plus de classes à la conception, mais pour maintenance plus simple et un code compréhensible par tous . Par exemple l'adaptateur et le décorateur sont plus que courant.
- Edité par papajoker 8 juin 2024 à 13:32:36
Architecture soft appliqué au protocole LoRaWAN
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)