重构大泥球;不确定静态是否在这里正确使用。建议吗?

时间:2011-12-01 22:50:21

标签: c# static refactoring

我有时会承认关键字static的深层细微差别让我感到厌烦。

这就是我所看到的:

public partial class Default : CSSDEIStatusBase
{
    private static Default _csWitWeb;

    protected void Page_Load(object sender, EventArgs e)
    {
        //DoStuff
        _csWitWeb = this;
        //OtherStuff
    }

    public static void ForceLoadSyncOperation(int? index)
    {
        Default._csWitWeb.LoadSelectedSyncOperation(index);
    }
}

对ForceLoadSyncOperation的唯一引用是:

Default.ForceLoadSyncOperation(index);

Default.ForceLoadSyncOperation(null);

这两个电话都来自:

    public partial class DataOriginUserControl : System.Web.UI.UserControl

并且不在静态方法内。

E.G:

protected void btnCancelSyncOperation_Click(object sender, EventArgs e)
{
    this.lblErrorMessage.Text = string.Empty;
    this.lblErrorMessage.Visible = false;

    int index = _syncOperation.Sequence - 1;
    Default.ForceLoadSyncOperation(index);
}

这一切对我来说都很古怪。这闻到了其他人的味道吗?但是,不确定如何解开它,因为我无法在用户控件内部完全创建Default页面的实例。

思考?谢谢你的阅读。

protected void LoadSelectedSyncOperation(int? index)
{
    SyncOperationConfiguration[] syncOperations = CSServiceClient.GetInterfaceConfiguration().SyncOperationConfigurations.ToArray();

    PopulateSyncOperationsListView(syncOperations);
    SyncOperationConfiguration syncOperation = null;

    try
    {
        syncOperation = syncOperations[index.HasValue ? index.Value : 0];
    }
    catch
    {
        syncOperation = syncOperations[0];
    }

    ucDataOrigin.LoadSyncOperationData(syncOperation);
    Session["ConfigMenuActiveIndex"] = 1;
    menuConfiguration.Items[(int)Session["ConfigMenuActiveIndex"]].Selected = true;
    mvwConfiguration.ActiveViewIndex = (int)Session["ConfigMenuActiveIndex"];
}

3 个答案:

答案 0 :(得分:2)

据推测,用户控件包含在Default页面中,静态成员用作获取Default当前实例的快捷方式。我会这样做的:

Default defaultPage = this.Page as Default;
if (defaultPage != null)
{
    defaultPage.LoadSelectedSyncOperation(index);
}

以这种方式使用静态成员是不安全的。它为竞争条件打开了大门。存在潜在的风险,即用户控件被加载到另一个页面中,并在单独的请求的LoadSelectedSyncOperation()实例上调用Default,从而造成各种潜在的破坏。

答案 1 :(得分:1)

我不知道LoadSelectedSyncOperation做了什么,但这段代码看起来很奇怪。每当您单击btnCancelSyncOperation时,您最终会在某个页面上调用此方法,但您永远不知道它们中的哪一个。这对我来说没什么意义。

答案 2 :(得分:1)

我肯定会说你的担忧是有效的。我无法想到这个设计有意义的任何理由。这也会给我一个旗帜。

根据您对我的评论的回复,如果Default.LoadSelectedSyncOperation不依赖于默认页面,那么我建议将其重构为一个单独的类(不是ASP.NET页面)。

方法或新类是否有意义是静态的是一个单独的问题,并且将基于方法中包含的逻辑。