Come evitare la duplicazione delle funzioni di utilità tra i moduli?

3

Ho visto questa domanda ma non lo fa aiutami perché sto scrivendo codice funzionale (Standard ML) e le risposte sono strongmente focalizzate su OOP (l'OP si consiglia di usare il modello di facciata, di usare l'ereditarietà, ecc. - risposte che non sono rilevanti per un programmatore SML) .

In due moduli separati, in gran parte non correlati, Foo e Bar , ho bisogno di svolgere lo stesso compito: date funzioni equal e equals con le firme:

val equal: t * t -> bool
val equals: t list * t list -> bool

crea due nuove funzioni con le seguenti firme:

val equal': t * t -> t option
val equals': t list * t list -> t list option

Qui, t rappresenta Foo.t o Bar.t . La soluzione naturale è utilizzare una funzione di ordine superiore:

local
  fun boolToOpt (comparison: ('a * 'a) -> bool) (left, right) =
    if comparison (left, right) then
      SOME left
    else
      NONE
in
  val equal' = boolToOpt equal
  val equals' = boolToOpt equals
end

Devo ripetere esattamente questo snippet di codice in entrambi i moduli.

Ora, questo è un dettaglio di implementazione minimo e minuscolo e sarebbe una cattiva idea renderlo pubblicamente visibile da Foo o Bar . Allo stesso tempo, sembra troppo piccolo - e troppo strettamente collegato alle due funzioni equal(s) - da includere in un modulo a sé stante. Forse in un'altra lingua, la funzionalità equals' meriterebbe una sua classe, ad esempio ComparisonDecorator , che sostituisce equal(s) per darmi funzioni con il tipo di ritorno t option , ma non è un'opzione qui.

Corro in situazioni come queste almeno una volta al giorno. Esiste un modo corretto per evitare solo copia e incolla qui?

    
posta Patrick Collins 13.09.2014 - 09:35
fonte

1 risposta

5

Se non si ha assolutamente idea di una buona astrazione per un modulo, inserire la funzione in un modulo di utilità generico, almeno temporaneamente. E dopo aver trovato diverse funzioni di utilità, probabilmente identificherai alcuni di loro "appartenenti insieme". Questo ti darà un suggerimento per un nome di modulo comune per questo gruppo di funzioni, così potrai finalmente spostarle dal modulo di utilità in un modulo con un nome migliore.

Fai attenzione a non far crescere arbitrariamente il tuo modulo di utilità - di tanto in tanto, devi ripulire le cose lì, altrimenti raggiungerai un punto in cui non sai cosa c'è lì dentro e cosa non lo è.

    
risposta data 13.09.2014 - 12:23
fonte

Leggi altre domande sui tag