Er is zo veel mis met die code, maar het enige valide punt dat 'ie heeft is dat
resource.LastContract().deadline().after(new Date()) daar niet hoort.
De methode
Department.printSlips() moet, zo haal ik uit de code, van alle resources binnen dat department de laatste contracten printen waarbij de deadline van dat contract na de huidige datum liggen. Afhankelijk van de herbruikbaarheid van dat predicaat (
"laatste contracten waarbij de deadline van dat contract na de huidige datum liggen") zou je dát kunnen abstraheren naar een aparte methode of op z'n plek kunnen zetten in de bijbehorende klasse.
Hij claimt dat dit
"something more readable and well designed" en
"readable line with the same level of abstraction" is:
Java:
1
2
3
| public void printSlips() {
new ResourceOrderedCollection(this.resources).select(new InForcePredicate()).forEachDo(new PrintSlip());
} |
Laat de "not sure if serious" maar weg, want dit
moet wel een troll zijn. Toch?
Ik zou er dit van maken:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| public class Department {
public void printSlips() {
Date today = new Date();
for (Resource resource : resources) {
if(resource.HasLastContractWithDeadlineAfter(today)) {
SlipPrinter.printSlip(resource);
}
}
}
}
public static class SlipPrinter {
public static void printSlip(Resource resource) {
System.out.println(resource.name());
System.out.println(resource.salary());
}
}
public class Resource {
public boolean HasLastContractWithDeadlineAfter(Date date) {
return this.lastContract().deadline().after(date)
}
} |
Uiteindelijk wil je wel iets als lambda's, zodat je over een reeds gefilterde lijst kunt itereren (
for (resource : resources.Where(r => r.HasLastContractWithDeadlineAfter(today)))). Maar of je nou moeilijk doet met iterators en je logica in een generiek genaamde klasse stopt, je moet uiteindelijk een keer over je collectie wandelen. Het probleem zit niet in de
for.
Het is een discussie, geen specificatie. Als het om configuratie gaat, heeft Hydra gewoon gelijk: je wéét wat je op die plek kunt verwachten. Succes met "%windir%\System32\drivers\services" passen aan de constructor van een socket, als poortparameter.