封装私有常量

时间:2017-04-21 11:46:42

标签: c# oop

我只是想知道我是否有一个常量属性,我可以设置一个公共属性来封装吗?

e.g。

private const int DEFAULT_CHARGE = 200;
public int default_charge
{
     get { return DEFAULT_CHARGE; }
}

我没有得到任何错误,但如果某些事情是不变的,我真的不明白为什么我们封装它的逻辑。我真的很想知道为什么会这样:

  1. 对/错
  2. 为什么这样做?
  3. 好处?

5 个答案:

答案 0 :(得分:1)

即使某些内容不变,您仍然可以控制如何将其返回给调用者。如果你有一个存储到5位小数的Double变量,你可能希望将值返回给2个小数位的调用者。封装可以帮助您控制字段。

所以你可能需要像这样封装一个常量字段

private const double DEFAULT_CHARGE = 200.12345;
   public int default_charge
 {
 get { return Math.round(DEFAULT_CHARGE,2); }
 }

答案 1 :(得分:1)

您可能希望实施interfaceabstract class等:

   public interface IChargable {
     int default_charge {get;}
   }

   public class MySimpleChargable: IChargable {
     private const int DEFAULT_CHARGE = 200;

     public int default_charge {get { return DEFAULT_CHARGE; }} 
   } 

您可以将此类构造实现为存根

初​​始:

   // Version 1.0
   public class MyChargable {
     private const int DEFAULT_CHARGE = 200;

     //TODO: implement (rare) "some condition" case
     public int default_charge {get { return DEFAULT_CHARGE; }} 
   } 

随后:

   // Version 1.1
   public class MyChargable {
     private const int DEFAULT_CHARGE = 200;

     public int default_charge {
       get { 
         if (some condition)
           return SomeComputation();

         return DEFAULT_CHARGE; 
       }
     }  

答案 2 :(得分:1)

了解常量是由编译器内联非常重要。这意味着这两个例子产生了相同的程序:

private const int DEFAULT_CHARGE = 200;
public int default_charge
{
     get { return DEFAULT_CHARGE; }
}

编译后与此相同:

public int default_charge
{
     get { return 200; }
}

如您所见,编译后对DEFAULT_CHARGE的引用将丢失。对于在多个项目中重用相同常量的解决方案,这一点很重要。

我们假设您在LibA和LibB中使用DEFAULT_CHARGE作为public const。您的项目经理告诉您将值从200更改为300.本能地,您转到LibA,其中DEFAULT_CHARGE已定义,您将其更改为300,然后您重新编译并仅部署LibA。

结果是LibA现在使用新值300,但LibB继续使用旧值200,因为常量在编译时被烘焙到DLL中。

您可以封装常量的原因是您可以更轻松地更改值。需求往往会随着时间而变化。今天不变的DEFAULT_CHARGE值可能必须在将来被配置值替换。

通过封装常量,您还可以防止我刚才解释的问题。如果LibA和LibB(以及LibX,LibY,LibZ,...)都依赖于封装,您只需重新编译和部署LibA即可在所有相关程序中设置默认费用。

答案 3 :(得分:0)

这取决于您的要求 通常,属性被设计为封装您想要的任何获取/设置逻辑,甚至是可计算的值或常量 在我看来,返回私有常量值的公共财产在架构方面是好的,在这种情况下,使用你的代码的人根本不知道他是否一直工作,即他是从你的实现中抽象出来的,这很好。如果你决定让它不是一个恒定但可配置的值,那么你就不会将它暴露给你的图书馆消费者,你只需要这样做:

public int DefaultCharge
{
    get
    {
        return CurrentUser.PersonalSettings.DefaultCharge; 
    }
}

甚至

public int DefaultCharge

这使得此代码依赖于用户'个人设置,不向客户说明任何事情。

这是主要的好处。它完全是关于封装和抽象的。

但是请使用适当的属性命名 - 它应该是use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } ,并注意Jeroen Mostert关于常量内联的评论。

答案 4 :(得分:0)

据我所知,你可以创建一个私有常量的公共访问器,没有问题。

您应该在以下时间创建常量的访问者:

  1. 您需要为getter添加额外的逻辑,例如,如果条件适用,则返回以某种方式格式化或其他值。
  2. 您的常量是用作其他命名空间的库的命名空间的一部分,因为如果编译存在常量的命名空间,则依赖命名空间将只记住常量的旧值,因为它是在编译时定义的