Igen, ezért lebegtettem meg a kérdést, hogy esélyes, hogy a PersonCarPDF az egy külön osztály lesz. De egy sima person-t és car-t hogyan érdemes szépen megoldani, és miért?
Próbálom iteratívan levezetni, kíváncsi vagyok a véleményekre...
Naiv implementáció:
class Person{
String name;
...
}
class Car{
String rendszam;
...
}
class PDFGeneratorService{
public static byte[] generatePDF(Person p){
...
}
public static byte[] generatePDF(Car c){
...
}
public static byte[] generatePDF(Person p, Car c){
...
}
}
Ennek ugye van egy olyan előnye, hogy ha PDF generálás kell, akkor egy fileban kell keressem, viszont a single responsibility elvet üti, mivel a PDFGeneratorService az
generál car-t is és person-t is, és carperson-t is, ráadásul szépen kövérre fog hízni, ráadásul egyszerre nem tud több fejlesztő pdf generáláson dolgozni. Próbáljuk ezt szétszedni:
class PersonPDFGenerator{
public byte[] generatePDF(Person p){...}
}
class CarPDFGenerator{
public byte[] generatePDF(Car c){...}
}
class PersonCarPDFGenerator{
public byte[] generatePDF(Person p, Car c){...}
}
public class PDFGeneratorService{
public static PersonPDFGenerator personGenerator = new PersonPDFGenerator();
public static CarPDFGenerator carGenerator = new CarPDFGenerator();
public static PersonCarPDFGenerator personCarGenerator = new PersonCarPDFGenerator();
public static byte[] generatePDF(Person p){
return personGenerator.generatePDF(p);
}
public static byte[] generatePDF(Car c){
return carGenerator.generatePDF(c);
}
public static byte[] generatePDF(Person p, Car c){
return personCarGenerator.generatePDF(p, c);
}
}
Ezzel ugye annyit nyertünk, hogy nem egy osztályban van beleírva az összes PDF generálás, hanem több osztályban van szétdobva, ezért pl. 2-3 fejlesztő is dolgozhat egyszerre a pdf generáláson, egymástól függetlenül. Az az előny megmaradt, hogy van egy service osztályunk, és mindig ahhoz tudunk fordulni, viszont ez egy person-nál nem feltétlenül intuitív (tudni kell, hogy nyomtatni a PDFService-ből tudunk).
Próbáljuk ezt továbbvinni:
interface IPersonPDFGenerator{
public byte[] generatePDF(Person p);
}
class Person{
IPersonPDFGenerator pdfGenerator;
public byte[] generatePDF(){
pdfGenerator.generatePDF(this);
}
}
Az IPersonPDFGenerator pedig valamikor átadásra kerül az osztálynak (gondolom ide jönne a dependency injection). Viszont, továbbra is az a gond, hogy mi van akkor, ha person-t és car-t is akarunk nyomtatni, ha jól értem, ettől függetlenül ugyanúgy kellene a service osztály, de ha már van egy service osztály, csak akkor meg visszatértünk az előző lépéshez... Hogyan kellene ezt szépen megvalósítani?