替代if esle 的高级方法
if else 是入门最常遇到的一种结构,这种结构简单易懂,深受初学者喜爱。但是 If-Else通常是一个糟糕的选择。
它的可读性差,如果用的太多,会导致结构重构困难。今天我就介绍替代 If-Else的方法。
一、字典重构,完全不用If-Else 下面是我们最常见的 If-Else实现
string type = "B";
if (type=="A")
{
Console.WriteLine("执行A");
}
else if (type=="B")
{
Console.WriteLine("执行B");
}
else if(type=="C")
{
Console.WriteLine("执行C");
} 可能很多人会喜欢这种方式,可是对于拓展来说,体验并不好。后面如果再增加操作的话,可以考虑重构成字典。
Dictionary<string, Action> ActionDao = new Dictionary<string, Action>();
ActionDao.Add("A", () => { Console.WriteLine("执行A"); });
ActionDao.Add("B", () => { Console.WriteLine("执行B"); });
ActionDao.Add("C", () => { Console.WriteLine("执行C"); }); ActionDao[type].Invoke(); 我们把ifelse 重构成Key-Value的模式,执行Action完成需要处理的事情。这种拓展大大的方便阅读和拓展的需要。
二、策略模式,完全不用If-Else
除了这个,我们还可以使用策略模式去实现。不过,策略模式的代码会比较复杂。
1、首先我们需要抽象一个方法出来
public interface IToDao
{
string Show(string val);
}
2、实现接口
public class AToDao : IToDao
{
public string Show(string val)
{
Console.WriteLine(val);
return val;
}
} public class BToDao : IToDao
{
public string Show(string val)
{
Console.WriteLine(val);
return val;
}
} public class CToDao : IToDao
{
public string Show(string val)
{
Console.WriteLine(val);
return val;
}
}
3、创建一个特性,这个特性的目的是获取标记实现了抽象接口的实例化 public class DisPlayAttribute:System.Attribute
{ public string Name;
public DisPlayAttribute(string name)
{
Name=name;
}
public string DisPlayShow()
{ return Name;
}
}
4、然后我们给实现了接口的类都加上特性
[DisPlayAttribute("AToDao")]
public class AToDao : IToDao
{
public string Show(string val)
{
Console.WriteLine("策略模式执行A:"+val);
return val;
}
}
[DisPlayAttribute("BToDao")]
public class BToDao : IToDao
{
public string Show(string val)
{
Console.WriteLine("策略模式执行B:"+val);
return val;
}
}
[DisPlayAttribute("CToDao")]
public class CToDao : IToDao
{
public string Show(string val)
{
Console.WriteLine("策略模式执行C:"+val);
return val;
}
}
5、接下来我们就可以通过特性获取到对应的类进行实例化,调用接口方法了,代码如下:
private void ShowMsg(string intype)
{
Dictionary<string,Type> keyValuePairs= Assembly.GetEntryAssembly()
.GetExportedTypes()//获取全部的type
.Where(ty=>ty.GetInterfaces().Contains(typeof( IToDao)))//获取 继承了 IToDao 类 .ToDictionary(ty=>ty.GetCustomAttribute<DisPlayAttribute>().DisPlayShow());//获取 继承了 IToDao 类 通过特性获取类名称 Type type= keyValuePairs[intype];//获取 type
//Type type = Type.GetType(assemblyName + "." + intype); // 创建类型的一个实例
IToDao toDao = Activator.CreateInstance(type) as IToDao;//获取 type 实例化接口
if (toDao != null)
{
toDao.Show(intype);
}
} 总结:简单的逻辑使用IFELSE不影响,但是如果后面还需要拓展,可以使用更高级的写法!字典模式相对简单,也比较容易读懂。我自己也比较喜欢。策略模式优势是拓展性好,但是代码阅读起来会比较困难。因为不知道是哪个地方实现的。可以根据需求,选择不同的实现方式。
参考文档:
https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/attributes/accessing-attributes-by-using-reflection
替代if esle 的高级方法的更多相关文章
- R语言实战(十)处理缺失数据的高级方法
本文对应<R语言实战>第15章:处理缺失数据的高级方法 本文仅在书的基础上进行简单阐述,更加详细的缺失数据问题研究将会单独写一篇文章. 处理缺失值的一般步骤: 识别缺失数据: 检查导致数据 ...
- R in action读书笔记(20)第十五章 处理缺失数据的高级方法
处理缺失数据的高级方法 15.1 处理缺失值的步骤 一个完整的处理方法通常包含以下几个步骤: (1) 识别缺失数据: (2) 检查导致数据缺失的原因: (3) 删除包含缺失值的实例或用合理的数值代替( ...
- WIN7下使用sublime text3替代arduino IDE(安装方法和所遇到的问题)
用了一段时间Arduino IDE,感觉比较简陋~~很多功能都没有~虽然不影响使用啦~(主要是启动速度有点慢...我的破笔记本….), 网上搜寻了下,发现sublime text有插件可以替代,这就比 ...
- 3、高级方法(Advanced Recipes)
学习目录:树莓派学习之路-GPIO Zero 官网地址:https://gpiozero.readthedocs.io/en/stable/recipes_advanced.html 环境:Ubunt ...
- C# - 高级方法参数
可选参数 -必须有个默认值,默认值必须是字面值,常量值,新对象实例或者默认值类型值. public List<string> GetWords( string sentence, bool ...
- 05JS高级 方法没有块级作用域
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- jQuery笔记之工具方法—高级方法Ajax
$.ajxa() ——基本使用 前提:先了解js的执行机制 $.Callbacks()——回调 $.Deferred()——异步 $.when() 网络服务器链接由<渡一教育>提供 --- ...
- 尽量用类型化的常量替代预处理器的 #DEFINE 方法
类型化常量 (TYPED CONSTANTS) #define ANIMATION_DURATION 0.3 这是一个预处理器指令,当编译器在代码中发现有 ANIMATION_DURATION 时,就 ...
- (数据科学学习手札58)在R中处理有缺失值数据的高级方法
一.简介 在实际工作中,遇到数据中带有缺失值是非常常见的现象,简单粗暴的做法如直接删除包含缺失值的记录.删除缺失值比例过大的变量.用0填充缺失值等,但这些做法会很大程度上影响原始数据的分布或者浪费来之 ...
- jQuery 第十章 工具方法-高级方法 $.ajax() $.Callbacks() .....
$.ajax() $.Callbacks() $.Deferred() .then() $.when() ---------------------------------------------- ...
随机推荐
- 3.Linux安装docker
Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中. 进入docker官网找到安装文档 https://docs ...
- JS学习-async/await
async/await 它保证函数的返回值为 promise. 用更少的.then()块来封装代码,同时它看起来很像同步代码 注意:可能会因为大量await的promises相继发生而变慢. asyn ...
- aspx页面,Page_Load 无人进入,解决
又一次copy放的错误,今天必须记录一下. 当你不需要走后台时候,ready 就有限制了. ready放的位置有问题.下面是错误示范. <script src="../ToExamin ...
- PIL画图只有黑白色
背景 项目上需要对人工标注的图片上的框进行校对,验证有无漏框.错框等问题.尝试使用opencv把框信息画出来,但是中文无法写到图片上,么得办法,只能转战PIL.但是用PIL之后出现部分图画出来的框写出 ...
- 在linux环境中安装node,npm,express
linux安装node 连接运程命令: 进入usr/local 文件夹 cd /usr/local 1.下载 wget https://nodejs.org/dist/v14.17.6/node-v1 ...
- kubernetes 报错The connection to the server localhost:8080 was refused - did you specify the right host or port?
The connection to the server localhost:8080 was refused - did you specify the right host or port? 环境 ...
- Delphi中var和out
var: 传递的是参数的地址 out: 以返回值的形式返回结果,类似函数的效果:可以实现一个函数返回多个值
- flutter TextField 高度问题(包括使用maxlines自适应高度以及改变textfield组件自定义高度)
先上代码. Container( color: Colors.blue, constraints: BoxConstraints( minHeight: 10, maxHeight: 20 ), ch ...
- LoadRunner——block(块)技术
一般情况下,loadrunner中的事务是统一执行的,多个事务所执行的次数是相同的,对于不同的事务执行不同的次数就要用到block(块)技术 block(块)技术主要应用于在一个脚本中实现不同事务.不 ...
- 浙大版《C语言程序设计(第3版)》题目集 练习3-3 统计学生平均成绩与及格人数 (15 分)
练习3-3 统计学生平均成绩与及格人数 (15 分) 本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数.题目保证输入与输出均在整型范围内. 输入格式: 输入在第一行中给出非 ...