design-patterns - 当所有方法都以相同的条件开始时该怎么办
问题描述
在一个类中,我所有的方法都以相同的if开头
if (locked)
return;
在这些情况下是否可以使用设计模式?必须有比用 8 种方法编写相同的 2 行更好的方法。
解决方案
我想到了一种方法,它是使用函数式编程
它背后的想法之一是减少代码重复并以函数式编程风格重用通用结构。
在您的情况下,我提出了以下扩展方法:
private static void ExecuteOnFalse(this bool condition, Action actionToInvokeOnFalse)
{
if (condition) return !condition;
actionToInvokeOnFalse.Invoke();
return !condition;
}
假设您要在检查后执行的主要代码是这样的:
public void DoSomething()
{
// Doing something here
}
然后,您可以用以下代码替换您的代码:
locked.ExecuteOnFalse(DoSomething);
函数式编程的美妙之处在于链接您的方法。您可以对“ExecuteOnFalse”方法进行不同的修改,一个返回 bool 并接受 Func 作为主要操作。然后您可以链接该方法并以这种方式使用它:
locked.ExecuteOnFalse(DoSomething).ExecuteOnFalse(DoSomethingElse);
我建议阅读使用 C# 进行函数式编程。它很好地理解了函数式编程并带来了很好的例子。在本书的开头,他们用函数式方法替换了常规的 using() {} 结构。
希望这个答案能给你一些想法。
推荐阅读
- node.js - 为什么下面的 docker-compose 执行不等待用户输入就退出了?
- javascript - 如何使这个旋转木马滑块自动滑动?
- javascript - React - 如何通过传递状态作为道具从另一个下拉列表中的选择填充一个下拉列表
- angular - 在方法中正常工作的自定义管道失败条件
- linux - 从不在 docker 容器和另一台机器中的其他应用程序调用或与一台机器上的 docker 容器通信
- reactjs - React 中的单例工具提示设计
- c# - 如何修复“[警告]:连接到 Chrome 时超时,正在重试...”
- php - 一次查询获取3张表的数据
- ios - 使用 axios 进行的 API 调用被“取消”,但完全相同的代码适用于所有平台
- android - 有没有办法配置 android studio 在按下按钮时运行所有 AVD 虚拟设备?