繁体   English   中英

多次调用外部 static 方法或调用一个内部方法,即调用外部 static

[英]Multiple calls to external static method OR call one internal method, that calls the external static

所以我的问题是:

我得到了一个 static class 和一个 static 方法,称为:

static class A() {
     public static MethodA() { }
}

我得到了另一个 class ,它将多次调用 static class 的 MethodA() :

static class B() {
     public static MethodB1() {
         MethodA()
     }
     public static MethodB2() {
         MethodA()
     }
     public static MethodB3() {
         MethodA()
     }
     public static MethodB4() {
         MethodA()
     }
}

这是正确的方法还是我应该这样做(调用内部 function,这是对 static 方法的唯一引用):

static class C() {
     public static MethodC1() {
         StaticCaller()
     }
     public static MethodC2() {
         StaticCaller()
     }
     public static MethodC3() {
         StaticCaller()
     }
     public static StaticCaller() {
         MethodA()
     }
}

我提出这是一个设计或哲学问题,但是否有任何技术优势,例如可维护或可扩展的代码?

编辑:甚至性能改进?

这被认为是基于意见的,因为这两种方法都有自己的优势。 SO 上的许多开发人员都有自己的偏好,因此在不放弃意见的情况下回答这个问题很有挑战性。
In class B each call goes directly to method A while in class C the call first has to go through a local method before it can go to method A. This extra step can be considered redundant and thus class B would be preferred.
但是,无论出于何种原因,您可能必须将调用从方法 A 更改为方法 D,从您尚未进行的 class 更改。 在这种情况下,您将不得不更改 class B 中的四种方法,而仅更改 class C 中的一种方法。 因此 class C 更易于维护和调整。
因此,两者各有利弊,class B 的性能提升非常小。 (字面意思是时钟滴答声!)
所以总的来说,这真的无关紧要,所以我的建议是选择最适合开发人员阅读的解决方案。 这意味着添加注释、使用正确的格式、使用清晰的方法名称并尽量避免重复!
后一条评论意味着 class B 和 class C 都是不好的做法,因为每个 ZA2F2ED4F8EBC2CBB1C21A29DC都在重复调用某个方法0 CBB1C21A29DC。 您应该重新考虑将这些方法重塑为单个方法。 这可能很棘手,因为这些方法可能存在很多差异。

Wim 10 Brink 写了我会得到的答案,所以我充其量可以补充他所说的话:

我讨厌使用静力学。 用对另一个 static 的调用替换对另一个的调用是一种痛苦。 出于这个原因,我更喜欢 C。 它使更换变得容易。

但我确实有另外两个可能值得考虑的选择:

第一

因为我讨厌静态,所以我尽量避免写它们。 而且您所有的课程仍然是静态的,将问题传递下去。 如果我需要这样的东西并且它有任何非常量字段,我不会将其设为 static。 相反,我会将其设为需要正常实例的 class。 然后创建一个 static 字段,该字段采用此 class 的实例。 听起来可能不是那种区别,而是替换:

static staticsProvider SP = new ImplementationA();

static staticsProvider SP = new ImpelentationB();

允许快速交换。 此外,如果您需要两个或更多不同的实例用于不同的代码(SP1 和 SP2),现在这只是一个额外的 static 字段和实例化。 这是解决静电问题的两大问题。 您仍然可以使用 class 或 function scope 中的实例。

现在 WPF 的方式是“如果你不能改变它,把它包装成你可以改变的东西。”:那么选项 D 怎么样:

//I am not a static
public class D{
    //I am not either
    public void MethodA(){
      //But I do call one for you
      A.MethodA();
    }
}

然后,您可以创建一个 static 字段:

static public D SP = new D();

如果您需要不止一个 static 供应商? 做另一个领域。 如果您需要不同的实现? 提取一个接口(实际上是一个 VS IDE 选项)或从D创建一个抽象基类。 将变量更改为所述基类/接口。 然后制作一个 class D2,它继承/实现了您刚刚创建的内容。

不希望它在运行时改变? const 或 readonly 修饰符。 但实际上在运行时交换实例的能力可能是一个特性。

第二

与其尝试减少对 static 的调用,不如减少 MethodBX 和 MethodCX 的版本?

通过使用委托,您可以将“beforeStatic”和“afterStatic”部分的代码作为函数提交。

然而,这仅适用于非常小的差异。 如果您有很大的差异,那么为每个调用编写两个大型委托会使其更难管理,然后只编写您现在获得的多个函数。

Function 调用开销

调用函数是有代价的。 实际上,CPU 必须进行跳转。 跳跃仍然是可以衡量成本的事情。 从大局来看,它可能并不重要——我们已经超过了压缩 CPU 周期的时间。 此外,它可能会自动避免:

本机 C++ 具有内联编译器提示。

Afaik .NET 不允许此控制。 但它确实有 JiT 和编译器优化。 这些完全可以自动为您 go 和内联。 对于像这样的 function:

public static StaticCaller() {
  MethodA();
}

我只想说,如果有任何function 需要内联,那么看起来像这样的那些必须在列表的顶部。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM