【问题标题】:Am I missing something, or is this code nonsensical?我是否遗漏了什么,或者这段代码是荒谬的?
【发布时间】:2013-09-13 23:18:36
【问题描述】:

在探索我们遗留代码的潮湿地下墓穴和尘土飞扬的地牢时,我发现了这个:

FormatString formatString = new FormatString();
if (formatString.containsAlpha(UPCE) != -1) 
{
    UPCLen = 11;
}

我是否遗漏了什么,或者是我对此的反应,即:formatString 怎么能包含任何东西?没有分配任何内容...它将始终-1,假设表示“未找到”正确吗?

更新

为了回答 cmets 中明显的普遍困惑,我认为 FormatString 是一些乱七八糟的石器时代的 .NET 东西(这个项目使用 .NET 1.1),但你是对的 - 这是一个本土类。这是构造函数:

public FormatString()
{
}

...以及 containsAlpha() 方法:

public int containsAlpha(string strToCheck)
{
    const string ALPHA_CHARS = "abcdefghijklmnopqrstuvwxyz";
    try
    {
        char[] tmpCharArry = ALPHA_CHARS.ToCharArray();
        return strToCheck.ToLower().IndexOfAny(tmpCharArry);
    }
    catch(Exception ex)
    {
        Duckbill.ExceptionHandler(ex, "FormatString.containsAlpha");
        return 0; // not -1?
    }
}

现在我问你:“FormatString”是这个类的错误名称,还是什么?我发现它非常具有误导性(显然)。

【问题讨论】:

  • FormatString 到底是什么
  • Tim 说得对,FormatString 不是 CLR 的一部分。也许它里面住着一些讨厌的小动物。
  • 尝试右键单击FormatString 并选择Go To Definition。看看它的去向。
  • 当您有精明的初级顾问不经意间告诉石器时代的自学者在一个单独的类中组织他们的字符串格式化函数时,您会得到这样的结果,同时坚持认为它不应该是静态的,因为他们就是这样学习的在学校,完全忽略了项目不使用任何依赖注入的部分。
  • 我不确定这里的人是谁,但“石器时代的自学者”确实适合我。

标签: c# compact-framework windows-ce .net-1.1 format-string


【解决方案1】:

据我们所知,可能是这样的:

public class FormatString
{
    public int containsAlpha(object foo)
    {
        return 0;
    }
}

这将满足您展示的示例。它甚至不需要构造函数定义。

您应该右键单击并“转到定义”以找出它的真正作用。

更新

根据您更新的详细信息,如果您可以使用更新的 .NET Framework,我会说您可以将整个函数替换为:

using System.Linq;

public static bool ContainsAlpha(string s)
{
    return s != null && s.Any(Char.IsLetter);
}

但是既然你被卡住了,这应该也可以:

public static bool ContainsAlpha(string s)
{
    if (s == null) return false;

    for (int i = 0; i < s.Length; i++)
        if (Char.IsLetter(s, i))
            return true;

    return false;
}

或者:

public static bool ContainsAlpha(string s)
{
    if (s == null) return false;

    for (int i = 0; i < s.Length; i++)
        if (Char.IsLetter(s[i]))
            return true;

    return false;
}

【讨论】:

  • 如果我可以使用 LINQ,也许可以,但我在这个项目中被困在 .NET 1.1 中。
  • 已更新以反映这一点。祝你好运,勇敢的灵魂!
  • 我明白了,“方法 'IsLetter' 没有重载需要 '2' 个参数”
  • 可能是 .NET 1.0,但不是 CE;我会把它添加到标签中。
  • 啊.. 我不知道你在 WinCE 上。这让世界变得与众不同。请参阅我更新的答案中的替代表格。
【解决方案2】:

“FormatString”是这个类的错误名称,还是什么?

在我看来,是的。
它应该命名为 StringUtilsStringHelper 或类似的名称。
而且它应该是static

更新
更重要的是,我更希望它是一种扩展方法。那么它会是这样的:

string UPCE = // whatever
if(UPCE.ContainsAlpha())
{
 // ...
}

【讨论】:

  • @MirroredFate,说实话,不确定validator。因为通常validator does Validation,我的意思是它告诉事情是否正常,这里不是这样。
  • 我同意它并不完美,但作为静态方法的容器,它验证 something,即使那只是通过-in 字符串有字母字符。 StringUtils 太宽泛了,StringHelper 也有同样的问题,除了听起来很幼稚(不是说听起来很幼稚就应该立即取消资格)。
  • 我同意*Utils*Helper 是宽泛的,我也不喜欢这样的名字。
  • 虽然我不同意 to validate 在这里是更好的词。我会说可以使用StringChecker,但是......假设它在很大程度上取决于上下文,没有它,任何名称都或多或少相同(lu | su)cky。而且我们这里没有上下文。
【解决方案3】:

FormatString 可能是从某种形式的配置初始化的。我会检查构造函数。这是唯一有意义的方式(对我来说)。

【讨论】:

    【解决方案4】:

    尽管它显然很奇怪(“包含...”不应该返回布尔值吗?)并且违反直觉(我创建了一个“空”FormatString,即没有任何东西通过它的构造函数,但为什么要这样做有什么吗?),它并没有让我觉得完全荒谬。

    "containsAlpha" 也可能意味着:检查参数 1(在这种情况下为UPCE)是否包含字母(可能是字母数字)字符。所以FormatString 将是一些通用类,用于检查字符串格式的基本特征,即它们是否包含数字、字母、特殊字符等。

    FormatString 也有可能是一些专门的类(检查命名空间?),它检查格式,例如UPCs,最好称为UPCFormatUPCFormatVerifier 等。

    如果我没有完全弄错的话,我不认为这是一个 .NET 框架函数。这是哪个目标框架版本?有FormatString的来源吗?它说什么?

    无论如何,一段漂亮的奇怪代码。 ;-)

    Ziffusion 的回答也有道理,看看构造函数代码。也许它做的比它应该做的更多,一些关于一些默认状态的初始化,或者更糟糕的是,一些涉及静态全局状态的东西,除非你运行整个系统,否则你永远不会发现。

    编辑:现在阅读您的编辑 - 事实证明,FormatString 进行“通用字符串格式检查”是对的。可能StringFormat 会是一个更好的名称,但总而言之,我想说:如果您想检查 UPC 的格式,请使用带有静态工厂/构建器方法的 UPC 类,该方法从字符串构建 UPC 对象,包括格式检查,或者创建一个 UPCFormatCheck 类,它只负责检查特定格式的工作。这样,您就可以避免所有可能意味着任何东西的过于笼统的名称。 (在该课程中,您显然可以按照建议使用一些很酷的 LINQ-oneliner 来进行实际检查。)

    【讨论】:

    • .NET 1.1 - 这就是我认为它只是一些过时/弃用的东西。我应该知道 - 以前的程序员使用的命名约定使 Seuss 博士相比之下显得沉闷和传统。
    • 哦。然后你真的被引入 StringUtils 或带有静态帮助方法的东西所困扰。
    猜你喜欢
    • 2010-09-22
    • 2012-03-23
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2021-12-31
    • 2023-03-17
    相关资源
    最近更新 更多