No!No!No! It's not fashion!
还记得搞怪的hold住姐Miss Lin么,对于人们常规的行为,Miss Lin会挑起夸张的眉毛说:"Oh my God, it's not fashion!"。如果程序员圈子里有位Miss Lin,对于一些功能的实现,她会认为哪些编码实现方法是not fashion的,哪些是fashion的呢?
下面示例中,循规蹈矩先生编码但求功能实现,喜好使用常规方法,hold住姐实现功能的同时,不忘fashion一把。
问题一:事件触发库函数支持三种事件类型:IO事件(包括读/写)、信号和超时事件,请编码定义以上事件类型并说明使用方法。
循规蹈矩先生:
1.事件类型定义
#define EV_TIMEOUT 1 #define EV_READ 2#define EV_WRITE 3#define EV_SIGNAL 4
2.使用方法
有效性判断:
if(ev_events >= EV_TIMEOUT && ev_events <= EV_SIGNAL){……}
根据事件类型进行事件处理:
if(ev_events == EV_READ){……}
No! No! No! it's not fashion!
**Miss Lin**:
1.定义事件类型:
#define EV_TIMEOUT 0x01#define EV_READ 0x02 #define EV_WRITE 0x04 #define EV_SIGNAL 0x08
有效性判断:
if (ev->ev_events & (EV_READ|EV_WRITE|EV_SIGNAL)){……}
根据事件类型进行事件处理:
if (ev->ev_events & EV_READ){……}
Miss Lin语:
Well,well,well.循规蹈矩先生的方法 is very sample,让人一看就明白,but it's not fashion!
假如一个事件既包含“读”,又包含“写”,是否还要添加一个EV_READ_WRITE宏?Think about that!
But 使用我的方法就不一样了,EV_READ|EV_WRITE 即可表示一个读写事件。该方法同样适用于其他事件组合,比如一个限时的读事件可以这样定义:EV_READ|EV_TIMEOUT,so easy!
另外,通过位运算,可以很方便地对事件类型进行操作:
//添加超时类型ev_events |= EV_TIMEOUT;//删除超时类型ev_events &= ~EV_TIMEOUT;
使用bit指示状态,通过位运算操作状态值——要知道,fashion也讲求节约!
问题二:定义链表数据结构并编写相关操作函数。
循规蹈矩先生:
//结点结构定义typedef struct _LIST_NODE{ void* pdata; struct _LIST_NODE* next;}LIST_NODE; //链表结构定义typedef struct _LIST_HEAD{ LIST_NODE* first;}LIST_HEAD;//头部插入结点函数void list_insert_head(LIST_HEAD* head, LIST_NODE* node){ node->next = head->first; head->first = node;}
No! No! No! it's not fashion!
**Miss Lin**:
//链表头定义宏#define SLIST_HEAD(name, type) \struct name { \ struct type *slh_first; /* first element */ \}//链表元素定义宏#define SLIST_ENTRY(type) \struct { \ struct type *sle_next; /* next element */ \}//链表初始化#define SLIST_INIT(head) do { \ (head)->slh_first = NULL; \} while (/*CONSTCOND*/0)//头部插入结点宏#define SLIST_INSERT_HEAD(head, elm, field) do { \ (elm)->field.sle_next = (head)->slh_first; \ (head)->slh_first = (elm); \} while (/*CONSTCOND*/0)
Miss Lin语:
Fashion是什么?to be different! 提到宏的使用,很多程序员能列出一堆缺点,比如展开容易出错、不方便调试,但是恰当地使用宏可以带来很多好处,以上方法相比函数的实现,运行效率更高(哪怕只是一点点地提升)。最最关键的一点,it's cool!
以上关于链表的宏定义使用方法如下:
;SLIST_INSERT_HEAD(&slist_head, item, entries); //在头部插入元素
问题三:编写接口函数,分别实现动态数组和队列插入和删除。
循规蹈矩先生:
//list.hstruct _List;typedef struct _List List;//链表接口函数void list_insert(void* thiz, size_t index, void* data);void list_delete(void* thiz, size_t index); //darray.hstruct _DArray;typedef struct _DArray DArray;//动态数组接口函数void darray_insert(void* thiz, size_t index, void* data);void darray_delete(void* thiz, size_t index);
No! No! No! it's not fashion!
**Miss Lin**:
//container.hstruct container{ void (*insert) (void*, size_t index, void* data); void (*delete) (void*, size_t index);};
//list.hstatic void list_insert(void* thiz, size_t index, void* data);static void list_delete(void* thiz, size_t index);struct container list_container = {list_insert, list_delete};
//darray.hstatic void darray_insert(void* thiz, size_t index, void* data);static void darray_delete(void* thiz, size_t index);struct container darray_container = {darray_insert, darray_delete};
Miss Lin语:
Fashion! Can you see that ?! 增加container结构、利用回调函数,实现了统一的接口,static关键字实现了隐藏,使用方法如下:
struct container* containerp = &list_container;containerp->insert(……);containerp->delete(……);
上文模仿Miss Lin的语气介绍了以下内容:
- 使用二进制和位运算定义类型;
- 使用宏定义结构和函数;
- 使用回调函数提供统一接口。
”循规蹈矩先生”们应向"Miss Lin"学习,学习她追求与众不同的精神。对于编程,除了常规的编码实现方法,我们还应多思考能同样达到目的的方法。通过不断思考与总结,逐渐提高编程技能。
No!No!No! It's not fashion!的更多相关文章
- Reporting Service 服务启动时报错The service did not respond to the start or control request in a timely fashion
案例环境: 启动一台数据库服务器(Windows Server 2003)的Reporting Service(SQL Server 2008 R2)服务时,出现如下错误信息: System.Inva ...
- 如何在ExtJS 6中使用Fashion美化应用程序
在Ext JS 6,一个最大的改变就是框架合并,使用一个单一的代码库,就可以为每一种设备开发各具有良好体验的最好应用程序.它还带来了一种美化应用程序的新方式. 在本文,重点是Sencha Fashio ...
- IIS Default Web Site : The service did not response to the start or control request in a timely fashion
IIS Default Web Site无法启动,提示错误:The service did not response to the start or control request in a time ...
- 【翻译】如何在Ext JS 6中使用Fashion美化应用程序
原文:How to Style Apps with Fashion in Ext JS 6 在Ext JS 6,一个最大的改变就是框架合并,使用一个单一的代码库,就可以为每一种设备开发各具有良好体验的 ...
- fashion datasets图像检索实践project
Using Siamese Networks and Pre-Trained Convolutional Neural Networks (CNNs) for Fashion Similarity M ...
- Educational Codeforces Round 14 A. Fashion in Berland 水题
A. Fashion in Berland 题目连接: http://www.codeforces.com/contest/691/problem/A Description According to ...
- 深度学习常用数据集 API(包括 Fashion MNIST)
基准数据集 深度学习中经常会使用一些基准数据集进行一些测试.其中 MNIST, Cifar 10, cifar100, Fashion-MNIST 数据集常常被人们拿来当作练手的数据集.为了方便,诸如 ...
- 时尚与深度学习系列:Fashion forward: Forecasting visual style in fashion
https://arxiv.org/pdf/1705.06394.pdf 将深度学习与时尚预测联系在一起,是一个很有趣但是估计结果会没什么成效的话题.因为,时尚预测这一领 ...
- codeforces 691A A. Fashion in Berland(水题)
题目链接: A. Fashion in Berland 题意: 思路: AC代码: //#include <bits/stdc++.h> #include <iostream> ...
随机推荐
- 解决 Prometheus 不能获取 Kubernetes 集群上 Windows 节点的 Metrics
背景 接上一篇 快速搭建 Windows Kubernetes , 我们发现原来在 Windows Kubernetes 会有一些与在 Linux 上使用不一样的体验,俗称坑,例如 hostAlias ...
- kuangbin专题 专题一 简单搜索 Fliptile POJ - 3279
题目链接:https://vjudge.net/problem/POJ-3279 题意:格子有两面,1表示黑色格子,0表示白色格子,奶牛每次可以踩一个格子,踩到的格子和它周围的上下左右格子都会翻面,也 ...
- TCP传输协议中如何解决丢包问题
TCP在不可靠的网络上实现可靠的传输,必然会有丢包.TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题. 但是许多人有不同的 ...
- 第二章 Session会话管理
采用网址重写的缺点: 在有些Web浏览器中,URL限制为2000个字符. 仅当有链接要插入值时,值才能转换成后面的资源.此外,要把值添加到静态页面的链接中,可不是一件容易的事情. 网址重写必须在服务器 ...
- 掌握简单的Makefile文件编程
Makefile描述整个程序的编译.链接规则 其中还包括了工程中用到的那些源文件及需要产生的目标文件 1)Makefile编程规则 目标(唯一):依赖(可多个) 命令... 伪目标 .PHONY:cl ...
- 吐槽下Excel的十大不规范使用问题
Excel是个老少咸宜的软件工具,这是不争的事实,无论哪个级别的用户,都能在乐在其中.但问题是太多的人群因为不懂得正确的使用姿势,硬生生地把Excel玩得让人啼笑皆非,同样留给接手者一个难堪无比的烂摊 ...
- git的使用之eclipse Hbuilder
工欲善其事,必先利其器 eclipse使用git管理项目 准备 eclipse 码云(github)账号 下载插件 首先电脑已经安装好git了,然后在eclipse中下载git的插件. 打开eclip ...
- 关于python3与python2同时存在情况下导入pyqt失败解决记录
最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加 ...
- 2019牛客多校第二场F-Partition problem(搜索+剪枝)
Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先 ...
- 《VR入门系列教程》之12---转换矩阵
转换矩阵 模型网格的三维空间位置都是由它们的顶点坐标决定的,如果每次想要移动一下模型位置都要依次改变每个网格的顶点坐标,这将一件非常头疼的事,要是遇上需要显示动画效果那就更糟了.为了解决这个问 ...