Ich wollte zeigen, dass imperative Programmierung Seiteneffekte erzeugt, die man mit funktionaler Programmierung umgehen kann.
Das (fiktive) Szenario ist folgendes: In einer Klinik sind Patientendaten fehlerhaft gespeichert worden. Aus irgendwelchen Gründen ist das Geburtsjahr bei allen Patienten falsch hinterlegt. Das Geburtsjahr ist genau um 1 zu klein.
Ich simuliere das folgendermaßen. Ich habe eine Klasse Patient:
Code: Alles auswählen
public class Patient {
private String name;
private int year;
private boolean corrected = false;
public Patient(String name, int year) {
this.name = name;
this.year = year;
}
public Patient(String name, int year, boolean corrected) {
this.name = name;
this.year = year;
this.corrected = corrected;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public boolean isCorrected() {
return corrected;
}
public void setCorrected(boolean corrected) {
this.corrected = corrected;
}
}
Code: Alles auswählen
private void correctPatientsImperative() {
for (int i = 0; i < App.patients.size(); i++) {
Patient patient = App.patients.get(i);
if (!patient.isCorrected()) {
patient.setYear(patient.getYear() + 1);
patient.setCorrected(true);
}
}
}
Code: Alles auswählen
return List<Patient> correctedPatients = App.patients.stream().filter(patient -> !patient.isCorrected())
.map(patient -> new Patient(patient.getName(), patient.getYear() + 1, true))
.collect(Collectors.toList());
Ich arbeite mit einer Liste von Patienten. Da sind etwa 25 Patient-Objekte abgespeichert. Die Idee ist jetzt folgende: Ich erzeuge viele Threads (50 bis 5000) und alle rufen die Korrekturfunktion auf. Bei der imperativen Variante sollten Seiteneffekte auftreten, bei der funktionalen Variante nicht. Ich lasse mir die Liste vorher und nachher ausgeben, und lasse zusätzlich eine "Check"-Funktion drüber laufen, die prüft, ob die korrigierten Geburtsjahre zu den Patienten passen.
Ist diese Idee nachvollziehbar? Kann man das vom Grundansatz her so machen? Oder habe ich irgendwo einen Denkfehler?