Il compito di chi progetta (e scrive) le applicazioni è quello di gestire nel modo corretto le dipendenze tra gli oggetti che formano l'applicazione.
I programmatori non sono in grado di predire il futuro e considerare ogni possibile scenario.
La motivazione per cui il design è importante è favorire il design nel futuro (forse non dalla stessa persona che ha progettato inizialmente l'applicazione) e il suo scopo è ridurre il costo dei futuri cambiamenti.
Sono fatte di parti che interagiscono tra di loro per definirne il comportamento.
Queste parti sono gli oggetti.
L'interazione è fatta dai messaggi che vengono scambiati tra gli oggetti.
Mandare il corretto messaggio tra gli oggetti implica che chi invia un messaggio (sender) sappia qualcosa dell'oggetto che lo riceve (receiver).
Questa conoscenza crea una dipendenza tra gli oggetti ed è esattamente questa dipendenza che rende complesso il cambiamento.
"Indica un concetto, un’affermazione o un enunciato alla base di una dottrina, di una scienza o di una disciplina, o anche di un ragionamento, di una convinzione."
Una classe dovrebbe avere una sola responsabilità, aka:
una sola ragione per essere cambiata
Una entità deve permettere la sua estensione (open for extension) ma senza cambiare il suo codice sorgente (closed for modification)
# Library
class Bicycle
def initialize(wheels)
@wheels = wheels
end
def move(distance)
wheels.last.move_forward(distance)
end
end
class ThugBicycle < Bicycle
def noose_up!
wheels.first.move_up(height)
end
end
bicycle = ThugBicycle.new([Wheel.new, Wheel.new])
bicycle.noose_up!
Se un oggetto X è un subtype di (eredita da) un altro oggetto Y, allora X può sostituire Y
Se un oggetto X è un subtype di (eredita da) un altro oggetto Y, allora X può sostituire Y
https://drive.google.com/file/d/0BwhCYaYDn8EgOTViYjJhYzMtMzYxMC00MzFjLWJjMzYtOGJiMDc5N2JkYmJi/view
def move_bicycle_forever(bicycle)
loop { bicycle.move(1) }
end
bicycle = Bicycle.new([Wheel.new, Wheel.new])
thug_bicycle = ThugBicycle.new([Wheel.new, Wheel.new])
move_bicycle_forever(bicycle)
move_bicycle_forever(thug_bicycle)