Les spécifications sont utilisées pour faciliter l'utilisation de fonctions dans un contexte où les fonctions peuvent être utilisées par d'autres personnes que toi, bref dans un contexte de travail en équipe, de réutilisation de code, de création d'interfaces, API, etc.
En gros pour faire simple il s'agit de documentation qu'on ajoute aux fonctions, ça n'est pas destiné forcément à être exécuté (quoi que dans certains cas, voir plus bas). Cette documentation qui précède la fonction/procédure/etc doit être suffisante pour comprendre ce que fait le code de la dite-fonction/procédure/autre sans lire le code. Bref il s'agit de documentation de façon formelle (notations mathématiques éventuellement) ce que fait la fonction, et dans quels cas la fonction peut être utilisée, dans quels cas elle va planter, quels sont les cas qui sont couverts.
D'où usage de :
Préconditions : décrire le contexte dans lequel la fonction garantit de fournir des résultats.
Postconditions : décrire ce qui se passe quand l'exécution est terminée
Tu peux aussi les retrouver sous d'autres formes [Lis2000] avec les clauses suivantes :
REQUIRES (Préconditions sur le type, la présence de données, les valeurs des données ou du contexte...)
MODIFIES (les données impactées)
EFFECTS (effets de bord)
Il y a aussi ce qu'on appelle L'invariant de représentation et d'autres types d'invariants assez divers, qui peuvent aussi s'ajouter à la documentation
Pour plus d'information, tu peux te renseigner sur la programmation par contrat, il y a également des outils pour
automatiser la vérification de ces pré et post conditions (durant l'exécution par exemple)
[Lis2000] = Program Development in Java: Abstraction, Specification, and Object-Oriented Design - publié en 2000 par Barbara Liskov