Domanda

Uno dei miei demoni di programmazione personale è sempre stata una logica complessa che deve essere controllata da istruzioni if ??(o simili). Non sempre necessariamente così complesso, a volte solo pochi stati che devono essere considerati.

Esistono strumenti o passaggi che uno sviluppatore può eseguire durante la progettazione per aiutare a vedere gli "stati" e adottare misure per ridurre il codice verso il basso per semplificare il codice risultante? Sto pensando di elaborare una matrice o qualcosa del genere ...?

È stato utile?

Soluzione

Consiglierei un corso base in logica proposizionale per ogni aspirante programmatore. All'inizio, la notazione e le lettere greche possono sembrare scoraggianti per l'avversario matematico, ma è davvero uno degli strumenti più potenti (e spesso trascurati) nel tuo skillset, e piuttosto semplice, al centro.

Gli operatori di base , de Morgan's e altre leggi di base , tabelle di verità , ed es. es. disjunctive e forme normali congiuntive mi hanno aperto gli occhi. Prima che venissi a conoscenza di loro, le espressioni condizionate sembravano bestie pericolose. Da allora, so che posso portarli in sottomissione ogni volta che è necessario rompendo l'artiglieria pesante!

Altri suggerimenti

Le tabelle di verità sono sostanzialmente l'approccio esaustivo e (si spera) metterà in evidenza tutte le possibilità.

Potresti dare un'occhiata a Microsoft Pex , che può essere utile per individuare i casi marginali a cui non avevi pensato.

Penso che lo sviluppatore stia chiedendo come semplificare la sua vita quando si tratta di codice if complesso.

Il modo in cui gestisco il complesso se il codice è di programmare il più piatto possibile e di eliminare prima tutte le negazioni. Se riesci a sbarazzarti del composto posizionandone una parte sopra, allora fallo.

Il bello della semplicità è che non ci vuole un libro o una lezione per impararlo. Se riesci a romperlo, fallo. Se riesci a rimuoverne qualsiasi parte, fallo. Se non lo capisci, fallo diversamente. E flat è quasi sempre meglio di nidificato (grazie a Python!).

È più semplice da leggere:

if(broken){
  return false;
}
if (simple){
  doit();
  return true;
}
if(complicated){
  divide();
  conquor();
}
if(extra){
  extra();
}

di quanto non sia da leggere:

if(!broken && (simple || complicated)){
 ....
}
return false;

Tabelle di verità e unit test: elabora le tabelle (n dimensionali per n variabili), quindi usale come input per il tuo unit test, che può testare ogni combinazione di variabili e verificare i risultati.

Il problema più grande che ho riscontrato negli anni con IF complesse è che le persone non testano tutti i rami. Assicurati di scrivere un test per ogni possibile ramo, non importa quanto sia improbabile che lo colpirai.

Potresti anche provare mappe Karnaugh , che possono contenere fino a 4 variabili .

Se non lo hai già fatto, ti consiglio vivamente di leggere Codice completo . Ha molti consigli su argomenti come questo. Al momento non ho la mia copia a portata di mano, altrimenti pubblicherei un riassunto di questa sezione nel libro.

Suddividi la logica in unità discrete (a & amp; & amp; b, ecc.), ognuna con la propria variabile. Quindi costruiscili usando la logica di cui hai bisogno. Assegna un nome a ciascuna variabile con qualcosa di appropriato, in modo che l'istruzione complessa sia abbastanza leggibile (sebbene possa occupare diverse righe extra e alcune variabili temporanee).

Qualche motivo per cui non puoi semplicemente gestire la logica con le dichiarazioni di guardia?

mappe di Karnaugh può essere un buon modo per ottenere informazioni da una tabella di verità (suggerito da Visage ) e trasformandoli in espressioni compatte e / o / non. Questi sono in genere tenuti in un corso di logica digitale EE.

Hai provato un modello di progettazione? Potresti esaminare il cosiddetto modello di strategia: http://en.wikipedia.org/wiki/ Strategy_pattern

Dai un'occhiata all'opzione nucleare: Drools . C'è molto da fare - mi ci sono voluti un paio di giorni a esaminare la letteratura solo per capire le sue capacità. Ma se hai applicazioni in cui la tua complessa logica if-then è una parte in evoluzione del progetto (ad esempio, un'applicazione con algoritmi modulari) potrebbe essere la cosa giusta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top