全局变量还不好吗?

BIB*_*IBD 3 c# vb.net visual-studio

我今天跑过这样的代码; 具有对整个类可见的流控制标志.我的直觉说这是处理流量控制需求的错误方法(它几乎就像C中的旧时全局标志).

(示例在VB.Net中,但类似的事情可以在C#中完成.)

Public Class myClass

    Private bMyFlag As Boolean ''// <------

    private sub New
        bMyFlag = false
    end sub

    private sub mySub1
        bMyFlag = true
        mySub3()
        mySub4()
        mySubN()
    end sub

    private sub mySub2
        bMyFlag = false
        mySub3()
        mySub4()
        mySubN()
    end sub

    private sub mySub3
        if bMyFlag then
            DoSomething()
        else
            DoSomethingElse()
        end if
    end sub

    private sub mySub4
        if not bMyFlag then
            DoSomethingDifferent()
        else
            DoSomethingReallyDifferent()
        end if
    end sub

    private sub mySubN
        if not bMyFlag then
            DoNotPassGo()
        else
            DoNotCollect200Dollars()
        end if
    end sub
end class
Run Code Online (Sandbox Code Playgroud)

对我来说很明显,它是在事后嫁接的.我正计划重新编写代码,以便bMyFlag是传递给mySub3,mySub4和mySuvN的参数.但是,在我这样做之前:

是否有一个有效的理由让流控制标志对于类是全局的?

或者如果没有,为什么这被认为是不好的做法?

Mat*_*ggs 12

这不是一个全局(即应用程序范围)变量,它是实例级别(即作用于该类)这没有任何问题,所以这就是预期的.

因此,当该标志为真时,如果整个实例都为真,那就应该是它.如果它是每次以完全不同的方式使用的一些通用的东西,那么它不应该在那里声明.

  • 我认为你忽略了甜甜圈提到的事实 - 根据旗帜的价值,2种方法做了不同的事情.那,恕我直言是这里最大的气味. (4认同)

Sti*_*ack 9

我不认为这真的是"全球性的".它只是一个成员级别的领域.在大多数情况下,这是完全可以接受的(但不是真正的流量控制 - 看起来你真正需要的是一些类重新设计).


Don*_*nut 7

在这种情况下,bMyFlag似乎引入了不必要的状态,这可能使开发复杂化(调试等).某些子例程会修改其值,而其他子例程则根据其当前值执行不同的操作.这似乎带来了不必要的复杂性,可以通过一些重构来减少.为什么不直接将一个布尔值传递给mySub1mySub2,然后让这些子程序用该值作为参数调用其他函数?

  • 是的,明确地将布尔值传递给mySub1和mySub2是我的计划 (2认同)