【发布时间】:2021-09-23 18:17:29
【问题描述】:
我非常喜欢 raku OO 的低样板文件,以至于我有点惊讶于我无法摆脱某些集成层样板文件。
这是我今天的工作(有点打高尔夫球):
class Error {
has Real $.absolute;
method percent( $value ) {
"{ ( $!absolute / $value ).abs * 100 }%"
}
}
class Measure {
has Real $.value;
has Error $.error;
method new( :$value, :$error ) {
self.bless( :$value, error => Error.new( absolute => $error ) )
}
method error-percent { # <==== why do I need this intermediary method??
self.error.percent( $!value )
}
}
my $m = Measure.new( value => 10, error => 1 );
say $m.error-percent; #10%
这适用于...
- 它将Measure“容器”和Error“元素”的关注点分开
- $.value 正确地保留在度量中,并在需要时“向上”传递
但是
这并不反映许多错误操作都需要测量值的事实。那么(如何)Raku 很酷的 OO 模式可以帮助我在 Error 类中为 $.value 放置一个“代理”
我的目标是这样的伪代码:
class Error {
has Real $.absolute;
has Callable &!value-cb;
method percent {
"{ ( $!absolute / &!valuecb() ).abs * 100 }%"
}
}
class Measure {
has Real $.value;
has Error $.error;
method new( :$value, :$error ) {
self.bless( :$value, error => Error.new( absolute => $error ), value-cb => &.value() )
}
}
my $m = Measure.new( value => 10, error => 1 );
say $m.error.percent; #10% <=== note the difference, I just go straight there!
所以我正在摸索的概念是为 $.value 创建某种闭包/函数,并将其推入构造时的 Error 属性中。
我很乐意坚持我所拥有的,用 $.value 装饰 Error 对象上的大多数方法,如果这被认为是最安全的方法。对于我对这个技巧的各种 OOP / 模式术语缺乏了解,我提前道歉。
【问题讨论】: