聊聊 if else 那些事
从这周起,公司技术部每周五组织一次内部的技术分享,日常工作中,发现大家对if掌握的不是很好,今天先来聊聊if。
一、场景
简历的价格是根据专业的父Id设定的,下面根据简历Id获取简历的价格。
/// <summary>
/// 专业
/// </summary>
public class Subject
{
public int Id { get; set; }
public int Pid { get; set; }
}
/// <summary>
/// 简历
/// </summary>
public class Resume
{
public int Id { get; set; }
public int SubjectId { get; set; }
}
二、if、三元运算符、Null合并运算符
下面的方法用来获取专业实体,如果出现专业数据异常,给一个默认的专业,这里主要为了说明三元运算符和Null合并运算符的用法
public interface ISubjectService
{
Subject GetSubjectById(int id);
}
public interface ISubjectDao
{
Subject GetSubjectById(int id);
}
public class SubjectService : ISubjectService
{
private readonly ISubjectDao _subjectDao; /// <summary>
/// 1、if判断
/// </summary>
/// <param name="subjectId"></param>
/// <returns></returns>
public Subject GetSubjectById(int subjectId)
{ var subject = _subjectDao.GetSubjectById(subjectId);
if (subject == null)
subject = new Subject() {Id = , Pid = }; return subject;
} /// <summary>
/// 2、三元运算符
/// </summary>
/// <param name="subjectId"></param>
/// <returns></returns>
public Subject GetSubjectById(int subjectId)
{ var subject = _subjectDao.GetSubjectById(subjectId) != null
? _subjectDao.GetSubjectById(subjectId)
: new Subject() { Id = , Pid = }; return subject;
} /// <summary>
/// 3、null 合并运算符
/// </summary>
/// <param name="subjectId"></param>
/// <returns></returns>
public Subject GetSubjectById(int subjectId)
{
return _subjectDao.GetSubjectById(subjectId) ?? new Subject() { Id = , Pid = };
}
}
三、if else和switch
根据简历Id计算简历价格
public interface IResumeService
{
Resume GetResumeById(int id);
int GetResumePrice(int id);
}
public interface IResumeDao
{
Resume GetResumeById(int id);
}
public class ResumeService
{
private readonly IResumeDao _resumeDao;
private readonly ISubjectService _SubjectService;
/// <summary>
/// 1、if else
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int GetResumePrice(int id)
{
var resume = _resumeDao.GetResumeById(id);
var subject = _SubjectService.GetSubjectById(resume.SubjectId);
if (subject.Pid == )
{
return ;
}
else if (subject.Pid == )
{
return ;
}
else if (subject.Pid == )
{
return ;
} return ;
}
/// <summary>
/// 2、switch
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int GetResumePrice(int id)
{
var resume = _resumeDao.GetResumeById(id);
var subject = _SubjectService.GetSubjectById(resume.SubjectId);
switch (subject.Pid)
{
case :
return ;
case :
return ;
case :
return ;
default:
return ;
}
}
}
四、if else和卫语句
什么是卫语句?
许多程序员觉得函数应该只有一个出口 (return), 结果导致函数中的条件逻辑 (Conditional Logic) 本来完全可以终止下面的代码继续执行 (因为没有必要), 结果却只在函数最后 return, 使人难以看清程序的执行路径.“使用卫语句取代嵌套条件”用来解决这个问题, 它能带给代码可读性的提高, 还有性能上一点点的优化。
public int GetResumePrice(int id)
{
var resume = _resumeDao.GetResumeById(id);
var subject = _SubjectService.GetSubjectById(resume.SubjectId);
if (subject.Pid == ) return ;
if (subject.Pid == ) return ;
if (subject.Pid == ) return ; return ;
}
五、if else和策略模式
/// <summary>
/// 抽象一个计算简历价格的接口
/// </summary>
public interface IResumePrice
{
int GetResumePrice();
}
/// <summary>
/// 专业One的简历价格
/// </summary>
public class OneSubjectPrice : IResumePrice
{
public int GetResumePrice()
{
return ;
}
}
/// <summary>
/// 专业Two的简历价格
/// </summary>
public class TwoSubjectPrice : IResumePrice
{
public int GetResumePrice()
{
return ;
}
}
/// <summary>
/// 专业Three的简历价格
/// </summary>
public class ThreeSubjectPrice : IResumePrice
{
public int GetResumePrice()
{
return ;
}
}
public class ResumeService
{
private readonly IResumePrice _resumePrice;
/// <summary>
/// 实例化IResumePrice
/// </summary>
/// <param name="resumePrice"></param>
public ResumeService(IResumePrice resumePrice)
{
_resumePrice = resumePrice;
}
/// <summary>
/// 技术简历价格
/// </summary>
/// <param name="subjectPrice"></param>
/// <returns></returns>
public int GetResumePrice(string subjectPrice)
{
return _resumePrice.GetResumePrice();
}
}
六、if else和状态模式
使用上面定义的ResumePrice的接口和实现,状态模式需要用到反射
public class ResumeService
{
/// <summary>
/// 专业1价格计算类
/// </summary>
public static String OneSubjectPrice = "OneSubjectPrice";
/// <summary>
/// 专业2价格计算类
/// </summary>
public static String TwoSubjectPrice = "TwoSubjectPrice";
/// <summary>
/// 专业3价格计算类
/// </summary>
public static String ThreeSubjectPrice = "ThreeSubjectPrice"; /// <summary>
/// 技术简历价格
/// 利用了反射的伪代码
/// </summary>
/// <param name="subjectPriceType"></param>
/// <returns></returns>
public int GetResumePrice(string subjectPriceType)
{
var dll = Assembly.LoadFrom("assemblyName");
var type = (IResumePrice)dll.GetType(subjectPriceType, true);
return type.GetResumePrice();
}
} public class Main
{
public void CalPrice()
{
var resumeService = new ResumeService();
var price1 = resumeService.GetResumePrice(ResumeService.OneSubjectPrice);
var price2 = resumeService.GetResumePrice(ResumeService.TwoSubjectPrice);
var price3 = resumeService.GetResumePrice(ResumeService.ThreeSubjectPrice); }
}
聊聊 if else 那些事的更多相关文章
- (转)聊聊Greenplum的那些事
开卷有益——作者的话 有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨. 笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Gree ...
- 聊聊动态语言那些事(Python)
动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...
- 转:聊聊Greenplum的那些事
笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Greenplum 早期员工加入Greenplum团队(当时的工牌是“005”,哈哈),记得当时看了一眼Greenplum的架构(嗯,就是 ...
- 聊聊Go代码覆盖率技术与最佳实践
"聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...
- 《深入理解Java虚拟机》调优案例分析与实战
上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本 ...
- Greenplum 源码安装教程 —— 以 CentOS 平台为例
Greenplum 源码安装教程 作者:Arthur_Qin 禾众 Greenplum 主体以及orca ( 新一代优化器 ) 的代码以可以从 Github 上下载.如果不打算查看代码,想下载编译好的 ...
- js闭包-在你身边却不知
今天组里小伙很纳闷的问了我js绑事件带出的一个小问题,随便聊聊闭包那点事,背景如下: 当点击Button的时候给li绑定事件,事件的大概内容是获取li位置的index再做点事,据他描述代码看上去也没错 ...
- 【Android测试】UI自动化代码优化之路(临时发布, 随时删除)
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5993622.html 关于UI自动化的抱怨 听过不少人这样 ...
- swift基础:第三部分:对第一部分的补充说明
今天是我学习swift的第二天,虽然我和swift的距离有点远,但我相信,我会慢慢的接近这门语言的.好了,我们聊聊昨天晚上的事吧,昨天晚上下班早,回到家时,真是惊喜哈,宿舍那两做好了饭,等我吃饭,想对 ...
随机推荐
- Spring之事件发布系统
springboot应用,启动spring容器大致有如下几个过程: 容器开始启动 初始化环境变量 初始化上下文 加载上下文 完成 对应的Spring应用的启动器的监听器可以监听以上的过程,接口如下: ...
- JavaScript 2016年的概况
国外的网站stateofjs.com根据超过九千位开发人员的问卷调查,发布了2016年JavaScript的年度概况报名. 注:本文翻译的部分可能存在不准确的情况,请以原文为准. 调查结果的报告目录结 ...
- win10蓝屏问题,关于驱动kisSaasUrlRedirectKnl64.sys 的
上周末刚从win7升级到win10:今天出现了两次蓝屏了,都是显示: xxxxxxx 百度知道链接---http://zhidao.baidu.com/question/164141456570387 ...
- 【转】iOS 10 UserNotifications 使用说明
注意:XCode8的需要手动开启主target Capabilities中的Push Notification. 关于创建多个target后真机测试的证书问题,除了主target手动创建开发和发布证书 ...
- Android composite adb interface
我的平板连上电脑后,在eclipse的DDMS中查看不到.很奇怪以前不会,我以为在进程中有其他的adb.exe冲突.查看任务管理器没有看到其他adb.exe进程.然后重启eclipse也不用,重启电脑 ...
- 基于JQuery.timer插件实现一个计时器
基于JQuery.timer插件实现一个计时器,需要的朋友可以参考下. 先去官网下载jQuery Timers插件 ,然后引用到html中.这里是1.2 version 复制代码代码如下: < ...
- Intellij IDEA 配置Subversion插件
在使用Intellij的过程中,突然发现svn不起效了,在VCS–>Checkout from Version Control中也未发现Subversion这一项.如下图: 一.原因查找 经过分 ...
- 表单验证Jquery扩展方法类
/** 表单数据验证 **/ $.fn.Validform = function () { var Validatemsg = ""; var Validateflag = tru ...
- C# 个人常用代码积累
/// <summary> /// TextBox限制只能输入十六进制,且只能输入6个 /// </summary> /// <param name="send ...
- leveldb - sstable格式
整体上,sstable文件分为数据区与索引区,尾部的footer指出了meta index block与data index block的偏移与大小,data index block指出了各data ...