gpt4 book ai didi

c# - 不同类的大量命令行参数

转载 作者:行者123 更新时间:2023-12-02 15:50:55 24 4
gpt4 key购买 nike

我们使用特定的软件来执行带有大量参数的控制台应用程序(现在是 25 个(!),并且可能会越来越多)。当然,不同的类别需要不同的论据。我用 NDesk.Options 解析它。但是,我一次又一次地在所有类(class)中这样做。

class A {
A (IEnumerable<String> args){
new OptionSet {
{ "arg1=", value => foo1 = value },
{ "arg2=", value => foo2 = value },
...
}.Parse(args);
}
}
class B {
B (IEnumerable<String> args){
new OptionSet {
{ "arg10=", value => foo10 = value },
{ "arg11=", value => foo11 = value },
...
}.Parse(args);
}
}

如何才能实现良好的设计?解析静态类中的所有参数并使用它还是其他东西?

最佳答案

既然您要求设计模式,这听起来像是 Interpreter pattern 的工作.

否则,根据我的经验,命令行参数“解析”是模式匹配的一个很好的例子,不幸的是,C# 没有,但 F# 有。在 ZeroToNine ,当前匹配的参数如下所示:

let Parse argv =
match argv |> Seq.toList with
| ["-l"] -> ListVersions
| ["-a"; IsProperVersionString version] -> Assign version
| ["-i"; "major"] -> Increment Rank.Major
| ["-i"; "minor"] -> Increment Rank.Minor
| ["-i"; "build"] -> Increment Rank.Build
| ["-i"; "patch"] -> Increment Rank.Build
| ["-i"; "revision"] -> Increment Rank.Revision
| ["-a"; "major"; IntegerGreaterThanOrEqualToZero rankValue] -> AssignRank(Rank.Major, rankValue)
| ["-a"; "minor"; IntegerGreaterThanOrEqualToZero rankValue] -> AssignRank(Rank.Minor, rankValue)
| ["-a"; "build"; IntegerGreaterThanOrEqualToZero rankValue] -> AssignRank(Rank.Build, rankValue)
| ["-a"; "patch"; IntegerGreaterThanOrEqualToZero rankValue] -> AssignRank(Rank.Build, rankValue)
| ["-a"; "revision"; IntegerGreaterThanOrEqualToZero rankValue] -> AssignRank(Rank.Revision, rankValue)
| ["-?"] -> ShowHelp
| ["-h"] -> ShowHelp
| [] -> ShowHelp
| x -> Unknown(x)
|> Seq.singleton

当然,我们没有 25 个不同的参数,但上面的示例仍然可以让您很好地感受到处理各种情况是多么容易。

即使您有 C# 代码库,您也可以用 F# 编写解析器库。

稍微不同的是:如果您的控制台应用程序采用 25 个不同的参数,那么将其拆分为几个较小的控制台应用程序是否有意义?听起来它做了很多事情。

关于c# - 不同类的大量命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22349563/

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