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

本文关键字:建议 是否 在这里 静态 不确定 重构 | 更新日期: 2023-09-27 18:16:18

我承认有时候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);
}

这一切对我来说似乎真的很奇怪。还有人闻到这个味道吗?不过,我不太确定如何解开它,因为我无法在用户控件中创建默认页面的实例。

想法吗?谢谢你的阅读。

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"];
}

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

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

Default defaultPage = this.Page as Default;
if (defaultPage != null)
{
    defaultPage.LoadSelectedSyncOperation(index);
}
以这种方式使用静态成员是不安全的。它为比赛条件打开了大门。存在这样的潜在风险:用户控件被加载到另一个页面中,并在Default的单独请求实例上调用LoadSelectedSyncOperation(),从而造成各种潜在的破坏。

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

我肯定地说你的担心是有道理的。我想不出任何理由让这个设计有意义,从来没有。这也会给我一个警示。

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

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