Domanda

Recentemente ho avuto un paio di scenari in cui piccole modifiche al codice hanno portato a cambiare presupposti su diverse basi e mi chiedevo se il design per contratto si suppone che sia così oppure no.

public Goal getNextGoal() {
    return goalStack.pop();
}

Se goalStack.pop() ha una precondizione che lo stack non è vuota, poi fa getNextGoal() necessità di avere in modo esplicito lo stesso presupposto? Sembra che ereditando i presupposti renderebbe le cose fragili, e cambiando a una coda o altra struttura avrebbe cambiato i presupposti per getNextGoal(), è chiamanti, e chiamanti IT di chiamanti. Ma sembra che non ereditare i presupposti sarebbero nascondere i contratti e le chiamanti, e chiamanti i chiamanti, non sarebbe conoscere i presupposti.

codice così fragile in cui tutti i chiamanti conoscono e ereditano le precondizioni e postcondizioni del codice che chiamano, o un codice misterioso in cui i chiamanti mai sapere quali sono le precondizioni e postcondizioni sono più profonde?

È stato utile?

Soluzione

Dipende da ciò che il vostro metodo chiamante fa esattamente. La cosa importante con precondizioni è che il chiamante è responsabile soddisfi le condizioni preliminari .

precondizioni Quindi, se i chiamanti del vostro metodo di GetNextGoal dovrebbero essere responsabili per la fornitura di una pila non vuota, allora si dovrebbe davvero anche impostare sul vostro metodo di GetNextGoal. La chiarezza di precondizioni è uno dei grandi vantaggi di contratti di codice, quindi consiglio di metterli in tutti i luoghi in cui i chiamanti devono soddisfare le condizioni preliminari.


Se il codice sembra fragile tuttavia, potrebbe essere un segno che avete bisogno di refactoring del codice .

Sembra che ereditare il precondizioni renderebbe le cose fragile, e cambiando a una coda o altra struttura cambierebbe la precondizioni per getNextGoal (), è chiamanti, e chiamanti IT di chiamanti.

Se si espone la coda per i chiamanti e modificare in un secondo momento (ad un'altra struttura, come hai detto), è chiamanti avrebbe anche al cambiamento. Questo è di solito un segno di codice di fragili.

Se si desidera esporre un interfaccia invece di un'implementazione coda specifica , i tuoi presupposti potrebbero anche utilizzare l'interfaccia e non avrebbe dovuto cambiare i presupposti ogni volta che le modifiche di implementazione. Così con conseguente codice meno fragile.

Altri suggerimenti

Le eccezioni sono una soluzione, ma forse non è fattibile per la situazione.

documentare ciò che accade se non ci sono obiettivi è normal.E.G. Questo è ciò che malloc () fa in C

non posso dire se si utilizza Java o C ++ o qualcosa d'altro, come ogni lingua potrebbe avere un po 'più modi naturali per quella lingua specifica.

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