Sfatiamo un po' di miti:
- non è vero che con l'OOP non si fan le cose rapidamente, è solo questione di abitudine e forma mentale nel pensare le soluzioni
- bene e in fretta sono impossibili a sostenersi nello stesso contesto se non accompagnati da "costoso", infatti nelle società non di sviluppo in genere il risultato è male e in fretta, ma che fa quel tanto che può bastare alla necessità contingente.
Che è anche giusto fino ad un certo punto, non lo è più nel momento in cui si manca di aver un attimo di lungimiranza per spendere un po' di tempo e denaro in più al tempo zero per risparmiarne un sacco dopo.
Ma questo spesso purtroppo non è nelle mani di chi sviluppa.
- In genere a chi sta su però, frega na mazza se si sviluppa ad oggetti, o a topi morti, frega il risultato, a meno che un certo tipo di tecnologia / tecnica non rientri vagamente nell'interfaccia commerciale o desiderata del cliente. Quindi basta sviluppare ad oggetti ogni volta che ti pare sia utile e bon. La lentezza deriva solo da mancanza di dimistichezza con quel tipo di design. E oramai qualsiasi IDE integrata è un aiuto alla generazione di codice che accelera ancora di più la produttività.
Il vantaggio principale dell'OOP è quello che veniva sbandierato quando l'OOP lanciava i suoi primi vagiti, ma oggi si tende a dimenticarsene: incapsulamento, struttura ordinata, blah blah, tutto vero...ma il fondamentale si riassume in una sola affermazione:
"Pensa ad oggetti per il semplice motivo che vivi in un mondo di oggetti"
Oggetti con proprietà e che compiono operazioni.
Quando ci si rende conto che l'OOP non è altro che un modo di accelererare ( incredibile eh? ) il design fornendo uno strumento che ti permette di pensare allo stesso modo in cui pensi quando fai una frittata o guidi l'auto ... l'OOP oltre che dare tutti i vantaggi a corollario, diventa anche rapido e naturale.
Se devo sviluppare un simulatore automobilistico, mi servono un auto. un auto ha quattro ruote, 2 sportelli, un motore, colorata, una chiave, i finestrini ... stop. Mi serve tutto questo?
No, io voglio qualcosa di più semplice, quindi ho bisogno di un'auto, che si può accendere, spegnere, posso accelerare e frenare e guardarne il colore.
Non c'è una riga di codice, ma praticamente l'oggetto è già definito.
Da qui a far questo:
Codice:
public interface Auto {
public void accelera(int forza) throws SpentaException;
public void frena(int forza) throws SpentaException;
public void accendi();
public void spegni();
public int getVelocita();
}
son trenta secondi netti
e da qui a far questo:
Codice:
public class SempliceAutoRossa implements Auto {
public static int DEFAULT_SPEED_STEP = 5;
private int velocita = 0;
private final String color = "Rosso";
private boolean accesa = false;
public void accelera(int forza) throws SpentaException {
if (!accesa)
throw new SpentaException();
velocita += forza * DEFAULT_SPEED_STEP;
}
public void frena(int forza) throws SpentaException {
if (!accesa)
throw new SpentaException();
velocita -= forza * DEFAULT_SPEED_STEP;
}
public void accendi() {
this.accesa = true;
}
public void spegni() {
accesa = false;
}
public int getVelocita() {
return velocita;
}
public boolean isAccesa() {
return accesa;
}
public void setAccesa(boolean accesa) {
this.accesa = accesa;
}
}
Cosa hai fatto?
Hai definito un interfaccia, qual è il vantaggio? Che chiunque nel codice usi le tue auto, se ne frega di come "dentro" le auto funzionino ( esattamente come tu te ne freghi di sapere esattamente quanto carburante viene combusto ad ogni ciclo del motore ), usa l'interfaccia.
Cosa ti permette di fare?
Quel che qualcuno ti diceva poco sopra, di scrivere la tua prima implementazione ( il secondo codice ) di una semplice auto rossa, che è quell'implementazione fatta in fretta e bene ( questa volta sul serio ) che il tuo capo ti chiede.
Però ... se un domani il tuo capo ti dice, voglio una Jaguar nera con un'accelearazione pazzesca appena sfioro il pedale ( chiamo accelera() ), tu non sei costretto a rispondere: eh, che casino, devo rifare l'implementazione delle funzioni di accelerazione dell'auto, ma allora devo cambiare alcune cose che ci stanno attorno, eh allora ... no, puoi guardarlo serenamente in faccia e dire: e che ci vuole. Cambio solo l'oggettino che dice COME l'auto accelera, e forse neanche ( ma questo è troppo tecnico, tienlo per te ), mi basta estendere la mia SempliceAutoRossa così:
Codice:
public class JaguarNera extends SempliceAutoRossa implements Auto {
JaguarNera() {
DEFAULT_SPEED_STEP = 20;
color = "Nera";
}
}
Quanto ci hai messo? 10 secondi a dir tanto, e hai la tua bella jaguarnera che accelera ( e frena ... visto le velocità, meglio ) di brutto.
Ovviamente in questo esempio ci son tante cose che sarebbero da raffinare, correggere, rivedere... per fare l'interfaccia magari ci si ferma 2 minuti invece di 30 secondi...e si specificano bene le esigenze che si hanno. ( ad esempio ho dimenticato nell'interfaccia un modo per sapere il colore )
Però dovrebbe darti un'idea di cosa voglia dire pensare ad oggetti, che è diverso da scrivere codice ad oggetti.
Se questo esempio ti è utile dammi un feedback, che io poi li riuso a volte, quando devo far un po' di formazione rapida