重构大泥球;不确定静态在这里是否被正确使用.建议
本文关键字:建议 是否 在这里 静态 不确定 重构 | 更新日期: 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)。净页)。
方法或新类是否是静态的是否有意义是一个单独的问题,它将基于方法中包含的逻辑。