函数设计应该像模块设计一样,讲究接口和封装。函数的命名应该让使用函数的程序员见名知意,函数应该封装成简单易用的形式,而且当函数内部实现算法变化时,函数还能够保持接口的稳定性。

下面的例子来源于浙江大学翁恺老师的《C语言程序设计进阶》中的线性搜索算法。

首先看这样一个搜索算法,实现的功能是在一个数组中找出需要的数字,并且返回该数字在数组中的位置;找不到,则返回-1。

int search(int key,int a[],int len)
{
int ret=-1;    //这个是函数的输出接口,返回-1则表示没有找到;返回非-1的数组则表示对应元素的下标
for(int i=0;i<len;i++){    //int i写在for语句中是C99的写法,编译器如果不支持C99,则需要写在for外面if(key==a[i]){ret=i;break;}
}
return ret;
}

这里,ret就是程序的输出接口,无论内部函数算法如何变化,始终保证接口的易用性,对使用该函数的程序员封装其内部复杂性。这个函数是比较好的。

然后有人提出这样一种函数的写法:

int search(int key,int a[],int len)
{
int ret=-1;    //这个是函数的输出接口,返回-1则表示没有找到;返回非-1的数组则表示对应元素的下标
for(int i=0;i<len;i++){if(key==a[i]){return i;}
}
return -1;
}

当找到对应元素时,直接返回位置i;找不到,返回-1.

这里违反了函数或者模块设计的原则:单一出口原则。单一出口原则可以使得函数或者模块时非常清晰的,以后如果需要调整,只需要在函数内部调整即可,对于已经使用该函数的程序员来说会有极大的便利。

还有一种写法如下:

int search(int key,int a[],int len)
{
int ret=-1;    //这个是函数的输出接口,返回-1则表示没有找到;返回非-1的数组则表示对应元素的下标
for(int i=0;i<len;i++){if(key==a[i]){break;}
} if(i==len){return -1;}else{return i;}
}

思路是首先看能否找到搜索的元素,找不到,则i=len,返回-1;找到的话,则会直接在第一个if语句进行break,然后转入下面的else语句,返回找到的位置。这个函数看起来好像也没有问题,但是违反了函数设计的另一个原则:不要一专多能。变量i承担了两个功能,不仅用来遍历,还用来表示到底有没有找到搜索元素。所以,一专多能是不好的代码。

这样回头来看,往往在函数里面可以单独设置函数的输出接口。

函数设计的两个原则(单一出口、一专多能)和实例相关推荐

  1. 六大设计原则-单一职责原则

    1.开闭原则        2.接口隔离原则 3.依赖倒置原则 4.迪米特原则             5.里氏替换原则     6.单一职责原则 单一职责原则 针对的问题 类T负责两个不同职责:职责 ...

  2. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  3. PTA 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和。

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

  4. 数据结构与算法五:哈希表-哈希函数设计原则-哈希冲突解决方案

    一.哈希表的定义: 二.哈希表举例: 哈希函数就是映射关系 三.哈希表应用举例: Leetcode上第387题: 思路:通过s.charAt(i)-'a'将字符串中的字符映射成hash表,出现一次,在 ...

  5. C语言设计函数求最大公约数,C语言程序设计课程设计--编写函数求取两个整数m,n的最大公约数和最小公倍数.doc_在线文库www.lddoc.cn...

    C语言程序设计课程设计--编写函数,求取两个整数m,n的最大公约数和最小公倍数.doc C语言程序设计课程设计C语言程序设计课程设计评语考勤(10)纪律(10)过程(40)设计报告(30)答辩(10) ...

  6. 软件设计中的一些原则

    本文为大家介绍软件设计中的一些原则,都是经过长期经验总结出来的知识,每一个程序员都应该了解,相信对大家在进行软件设计的过程中会有很大帮助. Don't Repeat Yourself (DRY) DR ...

  7. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做" ...

  8. 设计模式原则(单一、开放封闭、里氏代换、依赖倒转、迪米特法则五大原则)...

    原文:设计模式原则(单一.开放封闭.里氏代换.依赖倒转.迪米特法则五大原则) 单一职责原则 单一职责原则,就一个类而言,应该仅有一个引起它变化的原因.   如果一个类承担的职责过多,就等于把这些职责耦 ...

  9. 【软件架构】软件架构设计常用概念、原则与思想

    导读 本文一文总结软件架构设计常用概念.原则与思想,包括面向对象六大原则,DID原则,ACID.CAP.BASE理论,中间层思想,缓存思想等. 软件架构设计常用概念.原则与思想 面向对象设计六大原则 ...

最新文章

  1. Scrum Meeting 博客汇总
  2. HDU 2222 Keywords Search
  3. wps居中对齐不在中间_WPS文字快捷键总结(Windows版本)--值得收藏
  4. 米斯特白帽培训讲义(v2)漏洞篇 文件上传
  5. 教育|我在美国读博士才发现,美国高等教育如此残酷,以前的感觉完全是扯淡...
  6. 20191025:(leetcode)摆动序列
  7. 在线时序流程图制作工具
  8. C++ 入门5 ---- 类和动态内存分配(一)
  9. 天线分类特征学习笔记(1)偶极子天线
  10. MySQL理解索引、添加索引的原则
  11. android 美妆相机,Android类似美妆相机高级美妆列表
  12. 小米root以及面具的使用
  13. SpringCloud Alibaba 实战之《配置中心:基于 Nacos 集中管理应用配置》
  14. 见一博客搬家公司 把老紫竹火龙果和我的blog全搬他家去了
  15. 收集整理的ARM嵌入式linux开发入门视频教程
  16. 2022秋招计算机视觉算法工程师面经(旷视、字节、科大讯飞、大华、海康、网易、华为、小米、腾讯、百度、阿里、完美世界、美团、陌陌)
  17. 疫情之下,企业和员工到底该何去何从?
  18. HTTP状态码常见的状态码!
  19. BACKUP DATABASE
  20. js的垃圾回收和内存泄露

热门文章

  1. C语言中的关键字“ volatile”的用法(摘)
  2. c语言ln函数复数怎么使用,如何使用C中的复数?
  3. 网络协议分析小程序exe制作 python
  4. Python中加密数据类型见的相互转化
  5. java joda datetime_Java如何在Joda-Time中格式化DateTime对象?
  6. Android 12 - 跟踪利器 WinScope
  7. 关于with open() as f读取文件时编码报错问题
  8. 人工智能期末模拟沙场秋点兵(部分题,有些太模糊就不做了)
  9. 姚班智班齐上阵,竞赛高手聚一堂,这是什么神仙编程大赛?
  10. 太强了!终于有人整理出了仿京东电商项目,再次开源了