Un punto che non vedo esplicitamente menzionato (anche se Amon allude ad esso) è che la radice quadrata può essere pensata come un'operazione "derivata": se l'implementazione non ce la fornisce, possiamo scrivere la nostra.
Poiché la domanda è taggata con il design del linguaggio, potremmo prendere in considerazione una descrizione indipendente dal linguaggio. Sebbene molte lingue abbiano filosofie diverse, è molto comune tra i paradigmi usare l'incapsulamento per preservare gli invarianti; cioè per evitare di avere un valore che non si comporta come suggerisce il suo tipo.
Ad esempio, se abbiamo un'implementazione di numeri interi che usano parole macchina, probabilmente vorremmo incapsulare la rappresentazione in qualche modo (ad esempio per impedire che i bit shift cambino il segno), ma allo stesso tempo abbiamo ancora bisogno di accedere a quei bit per implementare operazioni come Inoltre.
Alcune lingue possono implementarlo con classi e metodi privati:
class Int {
public Int add(Int x) {
// Do something with the bits
}
private List<Boolean> getBits() {
// ...
}
}
Alcuni con sistemi di moduli:
signature INT = sig
type int
val add : int -> int -> int
end
structure Word : INT = struct
datatype int = (* ... *)
fun add x y = (* Do something with the bits *)
fun getBits x = (* ... *)
end
Alcuni con ambito lessicale:
(defun getAdder ()
(let ((getBits (lambda (x) ; ...
(add (lambda (x y) ; Do something with the bits
'add))
E così via. Tuttavia, nessuno di questi meccanismi è necessario per implementare la radice quadrata: può essere implementato utilizzando l' interfaccia pubblica di tipo numerico, e quindi non ha bisogno di accedere ai dettagli dell'implementazione incapsulata.
Quindi la posizione della radice quadrata si riduce alla filosofia / ai gusti della lingua e del progettista della biblioteca. Alcuni potrebbero scegliere di metterlo "dentro" ai valori numerici (ad esempio renderlo un metodo di istanza), alcuni potrebbero scegliere di metterlo allo stesso livello delle operazioni primitive (questo potrebbe significare un metodo di istanza o potrebbe significare vivere al di fuori del valori numerici, ma all'interno dello stesso modulo / classe / spazio dei nomi, ad esempio come una funzione autonoma o un metodo statico), alcuni potrebbero scegliere di inserirlo in una raccolta di funzioni "helper", altri potrebbero scegliere di delegarlo a librerie di terze parti.
1.sqrt()
valido?