Seit ich Java 8 für Unternehmen verwende, habe ich nach Möglichkeiten gesucht, mit Lambda-Ausdrücken etwas flüssigeren Code zu schreiben. Ich habe in letzter Zeit endlich einen netten Code geschrieben, daher würde ich ihn gerne mit Java-Ingenieuren teilen, also schreibe ich zum ersten Mal einen Artikel über Qiita.
Dieses Mal möchte ich nur das Beispiel beschreiben und den Mechanismus dahinter separat vorstellen.
https://github.com/mt-village/nagare
Das Beispiel ist ein Programm, das das Verfahren zum Brühen von Kaffee imitiert.
python
public void easygoing() {
WholeCoffeeBeans wholeBeans = WholeCoffeeBeans.inGrams(50);
GroundCoffeeBeans groundBeans = Mill.grind(wholeBeans);
Water water = Water.inMilliliters(500);
HotWater hotWater = Kettle.boil(water);
Coffee coffee = Dripper.drip(groundBeans, hotWater);
CoffeeAddict saya = new CoffeeAddict();
saya.drink(coffee);
}
Saya-san ist auf Japanisch geschrieben und mahlt Kaffeebohnen mit einer Mühle, kocht Wasser mit einem Yakan und trinkt Kaffee, der mit einem Tropfer extrahiert wurde. Ich schreibe es absichtlich sorgfältig, ohne es zu verschachteln, aber es ist ziemlich mühsam, weil ich die Form einzeln schreiben muss.
Sie können den gleichen Vorgang wie folgt schreiben
python
public void impatient() {
new CoffeeAddict().drink(Dripper.drip(
Mill.grind(WholeCoffeeBeans.inGrams(50)), Kettle.boil(Water.inMilliliters(500))));
}
Es ist viel kürzer, aber es ist ein bisschen hart für das menschliche Gehirn, weil es eine doppelt verschachtelte Struktur hat und in der Reihenfolge von innen nach außen interpretiert werden muss.
Mit den 8 von nagare hinzugefügten Klassen ist die folgende Beschreibung möglich.
python
public void nagare_prepositive() {
CoffeeAddict saya = new CoffeeAddict();
Do.when(WholeCoffeeBeans.inGrams(50), Water.inMilliliters(500))
.then(Do.first(Mill::grind).and(Kettle::boil))
.then(Dripper::drip)
.done(saya::drink);
}
python
public void nagare_postpositive() {
CoffeeAddict saya = new CoffeeAddict();
Do.first(Mill::grind).and(Kettle::boil)
.then(Dripper::drip)
.done(saya::drink)
.by(WholeCoffeeBeans.inGrams(50), Water.inMilliliters(500));
}
python
public void nagare_logic_and_exec() {
Saver<Coffee> brewCoffee = Do.when(WholeCoffeeBeans.inGrams(50), Water.inMilliliters(500))
.then(Do.first(Mill::grind).and(Kettle::boil))
.then(Dripper::drip);
CoffeeAddict saya = new CoffeeAddict();
saya.drink(brewCoffee.let());
}
Die Grundidee ähnelt dem in Java 8 hinzugefügten Stream. Die erste ist die Schreibmethode, die das Argument zuerst angibt, die zweite ist die Schreibmethode, die das Argument am Ende angibt, und die dritte ist die Schreibmethode, die Logik und Ausführung trennt.
Sie können eine Reihe von Prozessen in der Reihenfolge von links nach rechts (von oben nach unten) schreiben. Sobald Sie sich daran gewöhnt haben, stimmen Ihre Gedanken und Ihr Code überein und es wird ziemlich lustig. Bitte versuchen Sie es mit dem Code, den Sie als Hobby schreiben. (Ich weiß nicht, ob jemand Java als Hobby schreibt)
Muster sind auch als Komponententest enthalten. Wenn Sie also daran interessiert sind, sie mit dem dahinter liegenden Mechanismus zu kombinieren, schauen Sie bitte nach. https://github.com/mt-village/nagare
Recommended Posts