( sz332 | 2016. 03. 20., v – 16:10 )

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?