从这周起,公司技术部每周五组织一次内部的技术分享,日常工作中,发现大家对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 那些事的更多相关文章

  1. (转)聊聊Greenplum的那些事

    开卷有益——作者的话 有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨. 笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Gree ...

  2. 聊聊动态语言那些事(Python)

    动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...

  3. 转:聊聊Greenplum的那些事

    笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Greenplum 早期员工加入Greenplum团队(当时的工牌是“005”,哈哈),记得当时看了一眼Greenplum的架构(嗯,就是 ...

  4. 聊聊Go代码覆盖率技术与最佳实践

    "聊点干货" 覆盖率技术基础 截止到Go1.15.2以前,关于覆盖率技术底层实现,以下知识点您应该知道: go语言采用的是插桩源码的形式,而不是待二进制执行时再去设置breakpo ...

  5. 《深入理解Java虚拟机》调优案例分析与实战

    上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本 ...

  6. Greenplum 源码安装教程 —— 以 CentOS 平台为例

    Greenplum 源码安装教程 作者:Arthur_Qin 禾众 Greenplum 主体以及orca ( 新一代优化器 ) 的代码以可以从 Github 上下载.如果不打算查看代码,想下载编译好的 ...

  7. js闭包-在你身边却不知

    今天组里小伙很纳闷的问了我js绑事件带出的一个小问题,随便聊聊闭包那点事,背景如下: 当点击Button的时候给li绑定事件,事件的大概内容是获取li位置的index再做点事,据他描述代码看上去也没错 ...

  8. 【Android测试】UI自动化代码优化之路(临时发布, 随时删除)

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5993622.html 关于UI自动化的抱怨 听过不少人这样 ...

  9. swift基础:第三部分:对第一部分的补充说明

    今天是我学习swift的第二天,虽然我和swift的距离有点远,但我相信,我会慢慢的接近这门语言的.好了,我们聊聊昨天晚上的事吧,昨天晚上下班早,回到家时,真是惊喜哈,宿舍那两做好了饭,等我吃饭,想对 ...

随机推荐

  1. Javascript中DOM技术的的简单学习

    第十四课DOM技术概述1:DOM概述 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节 ...

  2. javascript基础知识复习一

    JavaScript 一.数据类型 A.String B.Number C.boolean  1.undefined.false.null.0.“”这五个返回的都是false: 2.NAN==NAN返 ...

  3. Linux Netcat 命令——网络工具中的瑞士军刀

    原文:http://www.oschina.net/translate/linux-netcat-command netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他 ...

  4. Linux 查看端口被占用情况

    今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. 使用命令: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat ...

  5. redis的基本使用

    Redis的应用 http://www.redis.cn/commands.html http://www.cnblogs.com/ikodota/archive/2012/03/05/php_red ...

  6. .NET 4.6中的性能改进

    .NET 4.6中带来了一些与性能改进相关的CLR特性,这些特性中有一部分将会自动生效,而另外一些特性,例如SIMD与异步本地存储(Async Local Storage)则需要对编写应用的方式进行某 ...

  7. PropertyPlaceholderConfigurer的用法:

    用法1: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...

  8. NVelocity-0.4.2.8580 的修改记录[发个vs2008能用的版本] -- "It appears that no class was specified as the ResourceManager..." bug 修正等

    因为另有开发记录工具最新没怎么在 cnblog 写开发备忘.不过我觉得这个是个比较严重的问题,觉得有必要让更多的人知道处理方法,所以在 cnblog 也放上一篇希望广为传播. 因为现在网络上vs200 ...

  9. XSHELL配色方案及导入配色方案的方法

    [ubuntu] text(bold)=ffffff magenta(bold)=ad7fa8 text=ffffff white(bold)=eeeeec green=4e9a06 red(bold ...

  10. Android多国语言文件夹命名方式

    多國語言: 在res目錄下建立不同名稱的values文件來調用不同的語言包Values文件匯總如下:中文(中國):values-zh-rCN中文(台灣):values-zh-rTW中文(香港):val ...