Package-Based Object Patterns
State Records
Keep related state as named scalar values.
state-records
State is easier to reason about when each field has a clear name.
State Records
state_records.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;
package Badge;
sub summary {
my ($name, $level) = @_;
return "$name:$level";
}
package main;
my $level = 2;
my $name = "Rin";
my $summary = Badge::summary($name, $level);
print "name=$name\n";
print "level=$level\n";
print "summary=$summary\n";
use strict;
use warnings;
package Badge;
sub summary {
my ($name, $level) = @_;
return "$name:$level";
}
package main;
my $level = 1;
my $name = "Rin";
my $summary = Badge::summary($name, $level);
print "name=$name\n";
print "level=$level\n";
print "summary=$summary\n";
use strict;
use warnings;
package Badge;
sub summary {
my ($name, $level) = @_;
return "$name:$level";
}
package main;
my $level = 5;
my $name = "Rin";
my $summary = Badge::summary($name, $level);
print "name=$name\n";
print "level=$level\n";
print "summary=$summary\n";
$level ← 2, $name ← Rin
13my $level→ 2 = 2; #@level=1, 514my $name→ Rin = "Rin";15my $summary = Badge::summary($nameRin, $level2);$name ← Rin, $level ← 2
6sub summary {7 my ($name→ Rin, $level→ 2) = @_;8 return "$nameRin:$level2";9}$summary ← Rin:2
14my $name = "Rin";15my $summary→ Rin:2 = Badge::summary($nameRin, $level2);1617print "name=$nameRin\n";18print "level=$level2\n";19print "summary=$summaryRin:2\n";outputname=Rin level=2 summary=Rin:2
$level ← 1, $name ← Rin
13my $level→ 1 = 1;14my $name→ Rin = "Rin";15my $summary = Badge::summary($nameRin, $level1);$name ← Rin, $level ← 1
6sub summary {7 my ($name→ Rin, $level→ 1) = @_;8 return "$nameRin:$level1";9}$summary ← Rin:1
14my $name = "Rin";15my $summary→ Rin:1 = Badge::summary($nameRin, $level1);1617print "name=$nameRin\n";18print "level=$level1\n";19print "summary=$summaryRin:1\n";outputname=Rin level=1 summary=Rin:1
$level ← 5, $name ← Rin
13my $level→ 5 = 5;14my $name→ Rin = "Rin";15my $summary = Badge::summary($nameRin, $level5);$name ← Rin, $level ← 5
6sub summary {7 my ($name→ Rin, $level→ 5) = @_;8 return "$nameRin:$level5";9}$summary ← Rin:5
14my $name = "Rin";15my $summary→ Rin:5 = Badge::summary($nameRin, $level5);1617print "name=$nameRin\n";18print "level=$level5\n";19print "summary=$summaryRin:5\n";outputname=Rin level=5 summary=Rin:5