Ono můžete mít třeba taky tohle a bude to dávat smysl:
@Data
class Vector {
private double length;
private float angle;
public Vector(double length, float angle) {}
}
class Polygon {
protected List<Vector> vectors;
protected Polygon() {}
double calculateVolume() {}
}
class Rectangle extends Polygon {
Rectangle(double a, double b) {
vectors.add( new Vector(a, 90.0f) );
vectors.add( new Vector(b, 90.0f) );
vectors.add( new Vector(a, 90.0f) );
// vectors.add( new Vector(b, 90.0f) ); Polygon je vzdy uzavreny.
}
double getA() {
vectors.get(0).getLength();
}
double getB() {
vectors.get(1).getLength();
}
}
Jenže problém je v tom, že tohle OOP vypadá OK na takové kravince jako jsou geometrické útvary, ale v PRAXI, když se snažím reálnou úlohu udělat takto OOP, zabřednu do sraček a je lepší se na to úplně vykašlat. Podle mě má to OOP hoodně omezené použití na velmi malou množinu úloh.
Konkrétně třeba ten Polygon - ono je to správně OOP, zobecnil jsem celou řadu geometrických tvarů do jednoho jediného, Polygon, a genericky proto můžu počítat obsah, obvod, a další blbiny. V PRAXI ale je lepší se na to vysrat a udělat Rectangle prostě zvlášť, protože takto je to zbytečně překomplikované a postrádá to pointu.
Když budu mít jenom Rectangle, můžu udělat:
@Data
class Rectangle {
double a;
double b;
public double calculateVolume() {
return a*b;
}
}
A je to mnohem lepší, ve všech směrech. A teď je tam ta metoda calculateVolume(), zase jde o to, že u takové jednoduché věci typu Rectangle tu metodu můžu mít přímo uvnitř a byl bych asi blbec, kdybych dělal GeometricPatterns.calculateVolume(rectangle);, protože mám takovou pidi třídu, která řeší a obsahuje prd, je izolovaná od okolí, tak přece tam tomu tu metodu dám. Opět, je to ukázkové OOP. Jenže v PRAXI dpč, když budu chtít tohle dělat u trochu kompikovanějších tříd a vztahů, zabřednu opět do sraček. A ze všeho nejhorší na tom OOP je, že nad tím vším musí člověk přemýšlet a filozofovat, když přitom už to mohl mít dávno napsané.