从这周起,公司技术部每周五组织一次内部的技术分享,日常工作中,发现大家对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. Git基本命令(一)

    (一)有关配置信息的Git命令 1.查看本地设置的属性  git config user.name/user.email 2.显示本地配置信息  git config -l(小写的L) 3.修改当前全 ...

  2. DRAM 内存介绍(三)

    参考资料:http://www.anandtech.com/show/3851/everything-you-always-wanted-to-know-about-sdram-memory-but- ...

  3. Java SimpleDateFormat[转]

    [补充] [转] http://stackoverflow.com/questions/2603638/why-cant-this-simpledateformat-parse-this-date-s ...

  4. ubuntu11.10搭建eclipse C++开发环境[zhuan]

    1.最重要的东西,C++必要工具,安装的是GCC工具链,Make等一系列开发工具: sudo apt-get install build-essential 2. 安装Eclipse sudo apt ...

  5. 【C++沉思录】代理类

    1.考虑下面的场景:设计一个容器,包含一组类型不同但相互关联的对象(比如:Animal,Dog,Cat),对象具备多态行为.2.容器一般只能包含一种类型的对象,使用vector<Animal&g ...

  6. JIRA 6.3.6版本部署

    JIRA 6.3.6版本部署 部署环境:Ubuntu Server .JDK1.7 JIRA文件:atlassian-jira-6.3.6.tar.gz 下载地址:百度云网盘地址http://pan. ...

  7. 获取枚举类型的描述description

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...

  8. memcached命令

    memcached相对于redis来说,简直简单太多,命令也少很多,一般应用都是使用redis,但了解一下也还是不错的. 具体命令和用法很参见:http://www.runoob.com/memcac ...

  9. Ecshop文章列表页显示内容摘要

    本教程中讲到的“内容摘要”指的是文章内容的前 60个字符(当然也可以是前40个,前50个等等) 下面以 2.7.2版 + 官方默认模板 为例进行讲解: 1).修改 includes/lib_artic ...

  10. hdu1251在词典里统计前缀出现的个数

    banana band bee absolute acm    ba b band abc #include<iostream> using namespace std; //数据结构 s ...