OO Design

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.

 

 

 

Pratical Object-Oriented Design

Applicazioni OO

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.

 

Princìpi del OOD

  • Single Responsibility
  • Open-Closed
  • Liskov Substitution
  • Interface Segregation
  • Dependency Inversion

 

  • DRY Don't Repeat Yourself
  • LoD Low of Demeter

"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."

SRP

Single Responsibility Principle

Una classe dovrebbe avere una sola responsabilità, aka:

 

una sola ragione per essere cambiata

OCP

Open/Closed Principle

Una entità deve permettere la sua estensione (open for extension) ma senza cambiare il suo codice sorgente (closed for modification)

OCP

# 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!

LSP

Liskov Substitution Principle

Se un oggetto X è un subtype di (eredita da) un altro oggetto Y, allora X può sostituire Y

ISP

Interface segregation principle

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

LSP

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)
Made with Slides.com