【问题标题】:Should you declare a constant value as a private variable if only using its value once? [closed]如果只使用一次它的值,您是否应该将常量值声明为私有变量? [关闭]
【发布时间】:2017-10-24 13:33:30
【问题描述】:

所以我有一个格式问题。我有一个消费者模型,它有一次将消费者模型数据形成字符串的方法。每个字段都有自己定义的长度:

public class ConsumerModel
{
    public string ConsumerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string GenerateConsumerString()
    {
        var request = FormatRequestField(ConsumerId, 12);
        request += FormatRequestField(FirstName, 15);
        request += FormatRequestField(LastName, 20);
        return request;
    }
}

FormatRequestField(string, int) 方法接受该字段并返回一个字符串,该字符串已被编辑/填充为整数给定的长度。我的问题是,字段的长度是否应该存储为私有变量?我知道这是正常的做法,所以你不会得到“神秘”整数——但每个整数只使用一次。鉴于在我的实际代码中,该模型有大约 50 个属性,这似乎需要大量额外的代码行来将字段长度存储为私有变量。

我只是想知道这种情况下的最佳做法是什么。感谢您的帮助。

【问题讨论】:

  • 我第一次发现自己不得不重复数字时就开始使用常量。或者是否存在多个字段出于相同原因具有相同长度的情况,例如地址行?如果您真的真的只使用一次它们,那么您的代码就是自我记录的。它表示名字是十五个字符。在现实生活中,我可以想象必须复制这些数字。但在需要之前,我仍然不会做额外的工作。
  • 在一般情况下,您应该声明与其位置分开的幻数。当您知道幻数的位置时,维护代码会更容易,并且它允许您立即重用它们而无需检查您的值,以防您不得不多次使用它们。关于在哪里声明这些,不太确定是否有好的做法。我一直在做中等规模的面向电子的项目,我主要用一个完全幻数/定义专用类常量来声明它们,这在某种程度上是我的电子相关文件(数据格式、引脚等)。
  • 取决于您是否认为该数字是该类实例的一个组成部分,或者只是作为您方法中的一个变量。无论如何,这是非常自以为是的,这就是我投票结束这个问题的原因。

标签: c# coding-style private-members


【解决方案1】:

字段的长度是否应该存储为私有变量?

不,它们应该存储为私有常量。变量是可以改变的东西;这就是为什么它们被称为变量,因为它们变化。常量是不变的东西;这就是为什么它们被称为 constants,因为它们是 constant

我知道这是正常做法,因此您不会得到“神秘”整数 - 但每个整数只使用一次。

那又怎样?

命名常量的目的不是对表达式进行重复数据删除;这是为了使代码对阅读它的未来开发人员来说清晰易读。

鉴于在我的实际代码中,该模型大约有 50 个属性,这似乎需要大量额外的代码行来将字段长度存储为私有变量。

您认为 50 行代码“很多”。五十行代码什么都没有。声明常量的 50 行代码只需要几分钟的时间。 50 行永不改变的常量声明实际上是你职业生涯中最便宜的 50 行代码;犹豫什么?

我只是想知道这种情况下的最佳做法是什么。

您已经知道最佳实践是什么:避免使用幻数并让您的代码对未来的开发人员清晰易读。

【讨论】:

    【解决方案2】:

    除了魔法值,可读性也很重要。阅读代码的频率远高于编写代码的频率,因此无论您可以做些什么来提高可读性,都应该这样做。例如,您可以在具有常量的类中隐藏长度:

    public static class FieldWidth
    {
        public const int ConsumerId = 12;
        public const int FirstName = 15;
        public const int LastName = 20;
    }
    

    阅读:

    var request = FormatRequestField(ConsumerId, 12);
    

    然后比较:

    var request = FormatRequestField(ConsumerId, FieldWidth.ConsumerId);
    

    哪一行包含含义而您不必去 FormatRequestField 并检查 12 代表什么?一个月后,当您忘记此代码时,哪一个对您有意义?

    【讨论】:

    • const string = 12 ?
    • 当时我不确定。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多