Il termine di fantasia per ciò che hai a che fare è accoppiamento temporale .
My approach is to use types to enforce dependencies. Are there other ways?
Ci sono molti modi per farlo.
I metodi che mascherano la loro dipendenza dallo stato dell'oggetto o dalle variabili globali spesso causano questo problema. La soluzione è rendere esplicite tali dipendenze.
Ad esempio potresti avere
ProcessOne();
ProcessTwo();
ProcessThree();
e l'unico suggerimento per cui devono essere chiamati in ordine sono i loro nomi. Questo è meno ideale visto che non è applicato e ci lascia bloccati con nomi che non sono molto descrittivi.
Un modo per rendere esplicite le loro dipendenze è prendere lo stato di cui hanno bisogno come argomenti.
ProcessThree(ProcessTwo(ProcessOne()));
Ciò rende impossibile chiamarli fuori servizio. Funziona all'interno di oggetti e in linguaggi funzionali.
Per un'API orientata agli oggetti a cui si accede dall'esterno, è possibile utilizzare la cosa più propriamente detta Lingua di dominio specifica interna (iDSL). Questo non deve essere confuso con altre interfacce fluenti che consentono di chiamare i metodi in qualsiasi ordine restituendo this
. iDSL, come Java 8 stream e JOOQ , restituisce un oggetto intermedio che stabilisce quali metodi sono legali per essere chiamati. Questo è ciò a cui stai suggerendo quando parli di controllare l'ordine delle chiamate con i tipi.
Il ritorno del tipo intermedio e this
possono essere mescolati per formare una lingua complessa piena di passaggi obbligatori e facoltativi. Ma se sei in una lingua che offre parametri con parametri predefiniti, questo potrebbe sembrare inutile. Quasi come se ci fosse un sacco di problemi per aggirare un limite di linguaggio.