从这周起,公司技术部每周五组织一次内部的技术分享,日常工作中,发现大家对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. iOS----友盟分享完善版本

    分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...

  2. Oracle操作语言分类

    Oracle数据库语言总的来说分为三类:DDL,DML,DCL 1.DML(Data Manipulation Language,数据操作语言):用于检索或者修改数据. DML包括: SELECT:用 ...

  3. web前端基础——补充

    1  布局和事件 布局效果如下(标题和内容都居中,两边留空白) 布局代码如下 <!DOCTYPE html> <html lang="en"> <he ...

  4. python函数的参数

    代码: # coding=utf8 # 可以传入任何个参数 def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return ...

  5. android开源项目和框架

    特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github.c ...

  6. 初识React,Virutal DOM, State以及生命周期

    这是React分类下的第一篇文章,是在了解了一些基本面后,看Tyler文章,边看边理解边写的. React可以看做是MVC中的V,关注的是视图层.React的组件就像Angular的Directive ...

  7. jinkins在windows上的安装 配置C#编译

    首先jinkins在windows上的安装就不说,安装只需要下载相应安装包就可以了,后有些时候经常需要修改端口号.修改如下: 然后重启jenkins服务 首次运行界面 个人建议插件按需安装. 建立一个 ...

  8. Sencha Toucha 2 —1.环境安装配置、在线打包、离线打包

    环境安装配置        1. 下载 1.1     Sencha Touch 下载 http://cdn.sencha.com/touch/sencha-touch-2.2.1-gpl.zip 1 ...

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

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

  10. php - 执行Linux命令没有报错但也没有输出

    今天我需要在同事访问我的PHP页面的时候执行一段python脚本,于是我的代码是这样写的: 1 <?php 2 function my_workjob(){ 3 $this->makeLo ...