La mia domanda precedente riguardava solo il diagramma di classe e, a causa di alcuni commenti, ho pensato di provare a trovare un esempio con una piccola porzione di codice per il diagramma per vedere se i principi sono stati compresi correttamente?
class Rectangle {
private int width, height;
public void setHeight(int h) { height = h; }
public void setWidth(int w) { width = w; }
public int area() { return height * width; }
}
class Square extends Rectangle {
public void setHeight(int h) { height = width = h; }
public void setWidth(int w) { width = height = w; }
}
// A test function for rectangles
public void areaTest(Rectange rect) {
rect.setHeight = 20;
rect.setWidth = 10;
int area = rect.area();
assert area == 200;
}
Penso che il primo problema è che Principio di sostituzione di Liskov è ferito perché il quadrato estende il rettangolo quindi non vi è alcun problema nel dire che un quadrato è un rettangolo ma non si può dire che un rettangolo è un quadrato che fa il codice, quindi questo principio è ferito, penso per questo motivo.
Un altro principio ferito credo sia Principio di responsabilità singola perché nel rettangolo di classe, per modificare le proprietà di un rettangolo, ad esempio la sua area (), è necessario modificare l'intera implementazione in per questo motivo, credo che il Principio Aperto / Chiuso sia ferito anche perché se vuoi aggiungere un'estensione, diciamo una funzione di disegno per disegnare gli oggetti (rettangolo / quadrato), non puoi fare questo correttamente.
Penso che altri principi non siano feriti da questo design.