gpt4 book ai didi

perl - 在 Perl 中表示允许的状态转换图

转载 作者:行者123 更新时间:2023-12-04 15:27:21 24 4
gpt4 key购买 nike

在我们的应用程序中有类似状态更改检查逻辑的东西。

当前检查由丑陋的 if 语句处理

我想用转换矩阵替换它:

my %allowed_status_changes = (
1 => (2,5),
2 => (1,2,3,4,5),
3 => (4,2),
4 => (3,2),
5 => (),
);
my $is_allowed_transition =
$submitted_status ~~ $allowed_status_changes {$original_status};

if ($prerequestsites && !$is_allowed_transition) {
return;
}

某些转换只能在附加条件下允许,因此我需要类似的东西
2 => ( 
(target => 1)
(target => 2, condition => $some_condition)
(target => (3,4), condition => $other_condition),
(target => 5)
),

(在我看来它太长了)

如果您应该关注可读性和可维护性,在这种情况下您会使用什么结构?

您将如何解析它以检查是否允许转换?

最佳答案

如果条件非常普遍(例如,几乎每个允许的转换都有它们),那么您的后一种结构非常好,除了用“()”而不是“{}”表示哈希引用的语法错误。

如果条件很少见,我建议使用#1,并通过类似于#2 的可选结构进行扩充。

请注意,恕我直言,检查代码的可读性非常清晰,虽然数量庞大且不太惯用。

OTOH,矩阵的可维护性很高 - 您从 #1 中获得了简洁但可读的语法,其中不需要条件,并且条件的清晰但更长的语法对于每个许多设置(如 #2)的许多条件来说足够灵活。

my %allowed_status_changes = (
1 => [2,5],
2 => [1,5,{targets=>[2], conditions=>[$some_condition]}
,{targets=>[3,4], conditions=>[$other_condition, $more_cond]}]
3 => [4,2],
4 => [3,2],
5 => [],
);

sub is_allowed_transition {
my ($submitted_status, $original_status ) = @_;
foreach my $alowed_status (@$allowed_status_changes{$original_status}) {
return 1 if !ref $alowed_status && $alowed_status == $submitted_status;
if (ref $alowed_status) {
foreach my $target (@$alowed_status{targets}) {
foreach my $condition (@$alowed_status{conditions}) {
return 1 if check_condition($submitted_status
, $original_status, $condition);
}
}
}
}
return 0;
}

if ($prerequestsites
&& !$is_allowed_transition($submitted_status, $original_status )) {
return;
}

关于perl - 在 Perl 中表示允许的状态转换图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com