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
-
NodeTypeApuò avere soloNodeTypeBcome primo figlio,NodeTypeAcome secondo figlio. -
NodeTypeBpuò avere soloNodeTypeBcome childron. (Può avere qualsiasi numero di childron) -
NodeTypeCpuò avere soloNodeTypeAcome primo figlio,NodeTypeBcome 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
Builderpossonolavoraresenzaconoscenzadeisottotipidinodi. - Siamoingradodicompensarelaperditadisicurezzaditipostaticomedianterevisionedelcodice,testestrumentodianalisiautomatica.Cisiaspettacheunteamqualificatocompletiabbastanzabene.
FavorisciSicurezzadeltipostatico:
- Aumentalasicurezzadellacorrettezzadelprogramma.
- Quandosichiamailmetododi
Factory,l'informazionesultipo(cheèindicatadalnomedellafunzione)èstataespostaaBuilder.L'ultimacosacheBuilderdovrebbefareè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.
