Sto lavorando a un progetto con altri e discutiamo sulla protezione delle informazioni e sulla sicurezza del tipo statico. Il nostro scenario è descritto di seguito.
Lingua : C ++ 11
Scenario : vogliamo creare una struttura ad albero. Ogni albero ha una propria classe, che sono tutti sottotipi di classe base NodeType
. Ogni sottotipo ha la propria regola per collegare altri nodi. Ad esempio, NodeTypeA
, NodeTypeB
e NodeTypeC
sono sottoclassi di NodeType
e
-
NodeTypeA
può avere soloNodeTypeB
come primo figlio,NodeTypeA
come secondo figlio. -
NodeTypeB
può avere soloNodeTypeB
come childron. (Può avere qualsiasi numero di childron) -
NodeTypeC
può avere soloNodeTypeA
come primo figlio,NodeTypeB
come secondo figlio.
L'esempio potrebbe avere un problema di ricorsione, ma per l'illustrazione va bene.
Ora esiste una classe Factory
per creare ciascun nodo:
-
createNodeTypeA
-
createNodeTypeB
-
createNodeTypeC
Esiste una classe, Builder
, che vuole convertire l'input di testo dell'utente nell'albero.
Builder
non è necessario conoscere le informazioni sul tipo di ogni nodo. Porta solo i puntatori ottenuti da Factory
e li passa a un altro metodo di Factory
. Nella prospettiva di Builder
, il tipo di tutti i nodi può essere la classe base NodeType
.
Dilemma :
Se valutiamo Nascondere le informazioni di più, il metodo di Factory dovrebbe essere:
-
NodeType *createNodeTypeA(NodeType *first, NodeType *second)
-
NodeType *createNodeTypeB(std::vector<NodeType *> children)
-
NodeType *createNodeTypeC(NodeType *first, NodeType *second)
e per fornire correttezza, dobbiamo fornire un controllo run-time su ogni parametro nel metodo Factory.
Se valutiamo Sicurezza statica di tipo di più, il metodo di Factory dovrebbe essere:
-
NodeTypeA *createNodeTypeA(NodeTypeB *first, NodeTypeA *second)
-
NodeTypeB *createNodeTypeB(std::vector<NodeTypeB *> childron)
-
NodeTypeC *createNodeTypeC(NodeTypeA *first, NodeTypeB *second)
e Builder
devono conoscere i sottotipi di ciascun nodo. Ciò che otteniamo è la sicurezza del tipo.
La figura seguente illustra i due modi:
Discussione:
FavorisciNascondereleinformazioni:
- L'informazionechesinascondeèimportante.Glisviluppatoridi
Builder
possonolavoraresenzaconoscenzadeisottotipidinodi. - Siamoingradodicompensarelaperditadisicurezzaditipostaticomedianterevisionedelcodice,testestrumentodianalisiautomatica.Cisiaspettacheunteamqualificatocompletiabbastanzabene.
FavorisciSicurezzadeltipostatico:
- Aumentalasicurezzadellacorrettezzadelprogramma.
- Quandosichiamailmetododi
Factory
,l'informazionesultipo(cheèindicatadalnomedellafunzione)èstataespostaaBuilder
.L'ultimacosacheBuilder
dovrebbefareèsoloconservarla. - Secancellassimoleinformazionisultipo,violeremmodiversebuonepratichedicodicesuggeriteda
Linee guida del C ++ , che potrebbe causare errori nel codice: - Evita il tempo di test e il controllo run-time corrispondenti.
Domanda :
Quale può essere una buona pratica? Apprezziamo di più l'impatto a lungo termine.