Un bell'esempio è una codifica orientata agli oggetti di booleani. La maggior parte dei linguaggi, anche quelli orientati agli oggetti come Java, optano per una codifica orientata al tipo di dati astratti di booleani, ma ad es. Smalltalk utilizza una codifica OO e quasi nessuno dei metodi utilizza alcun stato di istanza. Sembra un po 'come questo:
import java.util.function.Supplier;
@FunctionalInterface interface Block { void call(); }
interface Bool {
Bool not();
Bool and(Bool other);
Bool or(Bool other);
<T> T ifThenElse(Supplier<T> thenBranch, Supplier<T> elseBranch);
void ifThenElse(Block thenBranch, Block elseBranch);
static final Bool T = new TrueClass();
static final Bool F = new FalseClass();
class TrueClass implements Bool {
public Bool not() { return F; }
public Bool and(Bool other) { return other; }
public Bool or(Bool other) { return this; }
public <T> T ifThenElse(Supplier<T> thenBranch, Supplier<T> elseBranch) {
return thenBranch.get();
}
public void ifThenElse(Block thenBranch, Block elseBranch) {
thenBranch.call();
}
}
class FalseClass implements Bool {
public Bool not() { return T; }
public Bool and(Bool other) { return this; }
public Bool or(Bool other) { return other; }
public <T> T ifThenElse(Supplier<T> thenBranch, Supplier<T> elseBranch) {
return elseBranch.get();
}
public void ifThenElse(Block thenBranch, Block elseBranch) {
elseBranch.call();
}
}
}
public class Main {
public static void main(String... args) {
Bool.F.ifThenElse(() -> System.out.println("True"),() -> System.out.println("False"));
// False
}
}
In realtà, se si segue un serio impegno per OO, utilizzare un sacco di metodi referenzialmente trasparenti, e favore il polimorfismo sopra condizionali, è spesso finire con metodi in un sacco di sottoclassi, in cui ogni implementazione in una delle classi restituisce un valore costante.
fonte
2015-08-04 19:34:34
L'argomento API è il punto più importante qui. Un metodo 'static' non può implementare metodi da interfacce ereditate. Un metodo 'statico' non è soggetto al polimorfismo. I metodi 'static' sono in effetti molto limitati per quanto riguarda le loro capacità. –
@BoristheSpider Certo, è sia una benedizione che una maledizione. Molti linguaggi funzionali si basano pesantemente su funzioni "statiche": in pratica, qualsiasi cosa che non deve essere esplicitamente legata a un'istanza (ad esempio, implementazioni di interfacce polimorfiche) tenderà ad essere statica. In un certo senso è un ritorno ai giorni C della vecchia scuola, ma è piuttosto rinfrescante. Dal momento che la programmazione funzionale tende a favorire piuttosto la composizione piuttosto che l'ereditarietà, ciò ha perfettamente senso. – Luaan