如何将这四个函数转换成一个
本文关键字:转换 一个 函数 四个 | 更新日期: 2023-09-27 18:01:36
可以使用enum: enum StatusRouter { Stop = 0, Start, Resume, Suspect };
public bool StartSelectedRouter()
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
m_listPlatforms[i].Start();
}
return false;
}
public bool ResumeSelectedRouter()
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
m_listPlatforms[i].Resume();
}
return false;
}
public bool SuspendSelectedRouter()
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
m_listPlatforms[i].Suspend();
}
return false;
}
public bool StopSelectedRouter()
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
m_listPlatforms[i].Stop();
}
return false;
}
你可以传入一个lambda来定义你想在每个元素上执行的操作。
类似:
public bool ChangeSelectedRouterState(Action<Router> action)
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
action(m_listPlatforms[i]);
}
return false;
}
像这样调用:
ChangeSelectedRouterState(r => r.Stop());
您需要将类型Router
(我为我的答案发明的类型)替换为您正在处理的特定类型。
您可以通过将Action传递给执行所需操作的方法来使用策略模式(假设您的类名为Platform)—就像这样:
public bool ActionSelectedRouter(Action<Platform> action)
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
action(m_listPlatforms[i]);
}
return false;
}
提取重复部分,即循环,并传递您想要执行的操作:
public bool DoSelectedRouter(StatusRouter statusRouter)
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
{
switch(statusRouter)
{
case StatusRouter.Stop:
m_listPlatforms[i].Stop();
break;
case StatusRouter.Resume:
m_listPlatforms[i].Resume();
break;
.......
}
}
}
return false;
}
当然,你总是可以放弃枚举,并传递一个你想要做的动作的函数委托。
首先,我将单个路由器的状态设置分解为一个单独的函数。我将使这个函数成为Router
类的成员。
然后我写一个辅助函数获取所有检查过的路由器。最后是一个函数,该函数对每个函数调用SetRouterStatus
函数。
这样,每个函数都有一个单独的职责,并且可以被重用。
你的代码的一些其他问题:Cheked
应为Checked
, Suspect
应为Suspend
。
为什么你的函数返回一个总是假的bool
?
public void SetSelectedRoutersStatus(StatusRouter status)
{
foreach(var router in GetCheckedRouters())
{
SetRouterStatus(router);
}
}
IEnumerable<Router> GetCheckedRouters()
{
return m_listPlatforms.Where(router=>router.Checked);
}
void SetRouterStatus(Router router,StatusRouter status)
{
switch(status)
{
case(StatusRouter.Stop):
{
router.Stop();
break;
}
case(StatusRouter.Start):
{
router.Start();
break;
}
case(StatusRouter.Suspend):
{
router.Suspend();
break;
}
case(StatusRouter.Resume):
{
router.Resume();
break;
}
default:
throw new NotSupportedException("Invalid StatusRouter");
}
}
(基于@peer的答案)
您可以将DoAction复制到函数中,但这样更易于阅读
public bool DoActionSelectedRouter(StatusRouter action)
{
for (int i = 0; i < m_listPlatforms.Count; i++)
{
if (m_listPlatforms[i].IsCheked)
{
DoAction(m_listPlatforms[i], action);
}
}
return false;
}
private void DoAction(Platform platform,StatusRouter action)
{
switch(action){
case(StatusRouter.Stop):
{
platform.Stop();
break;
}
case(StatusRouter.Start):
{
platform.Start();
break;
}
case(StatusRouter.Suspend):
{
platform.Suspend();
break;
}
case(StatusRouter.Resume):
{
platform.Resume();
break;
}
}
}
Public bool StartRouterAction(StatusRouter Action)
{
switch(Action)
{
case StatusRouter.Start:
// your start action
break;
case StatusRouter.Resume:
// your Resume action
break;
case StatusRouter.Suspend:
// your suspend action
break;
case StatusRouter.Stop:
// your stop action
break;
}
}