还记得搞怪的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的语气介绍了以下内容:

  1. 使用二进制和位运算定义类型;
  2. 使用宏定义结构和函数;
  3. 使用回调函数提供统一接口。

”循规蹈矩先生”们应向"Miss Lin"学习,学习她追求与众不同的精神。对于编程,除了常规的编码实现方法,我们还应多思考能同样达到目的的方法。通过不断思考与总结,逐渐提高编程技能。

No!No!No! It's not fashion!的更多相关文章

  1. 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 ...

  2. 如何在ExtJS 6中使用Fashion美化应用程序

    在Ext JS 6,一个最大的改变就是框架合并,使用一个单一的代码库,就可以为每一种设备开发各具有良好体验的最好应用程序.它还带来了一种美化应用程序的新方式. 在本文,重点是Sencha Fashio ...

  3. 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 ...

  4. 【翻译】如何在Ext JS 6中使用Fashion美化应用程序

    原文:How to Style Apps with Fashion in Ext JS 6 在Ext JS 6,一个最大的改变就是框架合并,使用一个单一的代码库,就可以为每一种设备开发各具有良好体验的 ...

  5. fashion datasets图像检索实践project

    Using Siamese Networks and Pre-Trained Convolutional Neural Networks (CNNs) for Fashion Similarity M ...

  6. Educational Codeforces Round 14 A. Fashion in Berland 水题

    A. Fashion in Berland 题目连接: http://www.codeforces.com/contest/691/problem/A Description According to ...

  7. 深度学习常用数据集 API(包括 Fashion MNIST)

    基准数据集 深度学习中经常会使用一些基准数据集进行一些测试.其中 MNIST, Cifar 10, cifar100, Fashion-MNIST 数据集常常被人们拿来当作练手的数据集.为了方便,诸如 ...

  8. 时尚与深度学习系列:Fashion forward: Forecasting visual style in fashion

           https://arxiv.org/pdf/1705.06394.pdf         将深度学习与时尚预测联系在一起,是一个很有趣但是估计结果会没什么成效的话题.因为,时尚预测这一领 ...

  9. codeforces 691A A. Fashion in Berland(水题)

    题目链接: A. Fashion in Berland 题意: 思路: AC代码: //#include <bits/stdc++.h> #include <iostream> ...

随机推荐

  1. 对于Spring中AOP,DI,IoC概念的理解

    IOC IoC(inversion of Control),控制反转.就好像敏捷开发和SCRUM一样,不是什么技术,而是一种方法论,一种工程化的思想.使用IoC的思想意味着你将设计好的对象交给容器控制 ...

  2. S7-1200 的运动控制

    S7-1200 CPU本体集成点硬件输出点最高频率为100kHz,信号板上硬件集成点输出的最高频率为20kHz,CPU在使用PTO功能时将把集成点Qa.o,Qa.2或信号板的Q4.0作为脉冲输出点,Q ...

  3. .net core2学习笔记

    在Linux上安装完netcore的sdk后,发现每次重新登录dotnet命令都会失效,咨询完同事后才知道之前的设置只是临时变量,需要vim /etc/profile   编辑这个文件,把环境变量写入 ...

  4. ng-bootstrap 组件集中 tabset 组件的实现分析

    ng-bootstrap: tabset 本文介绍了 ng-bootstrap 项目中,tabset 的实现分析. 使用方式 <ngb-tabset> 作为容器元素,其中的每个页签以一个 ...

  5. mac 部署安装接口自动化持续集成 jmeter+ant+jenkins

    由于前段时间刚换的工作,公司用的是mac电脑办公,之前办公都是windows系统.刚开始使用时连基本的操作都要去找度娘,很不习惯,新电脑开始就是安装相关的工作工具 下面就说说遇到的哪些坑. 1.  m ...

  6. 实验吧--web--你真的会php吗

    ---恢复内容开始--- 实验吧的一道题php审计题.拉下来写一写. http://ctf5.shiyanbar.com/web/PHP/index.php 打开之后说have fun 那就抓包来看看 ...

  7. 个人永久性免费-Excel催化剂功能第92波-地理地址与经纬度互转功能

    GPS设备和手机LBS的兴起,在地理信息存储过程中,在程序.应用级别是需要用经纬度去定位,而在数据分析的级别,特别是省市区镇街的分析,用到的是人可识别的文本类型存储,从设备中采集下来的数据和人工维护的 ...

  8. PTA 打印沙漏

    https://pintia.cn/problem-sets/17/problems/260 #include <bits/stdc++.h> using namespace std; i ...

  9. sql注入篇1

    一.前言 学习了感觉很久的渗透,总结一下sql注入,系统整理一下sql注入思路. 二.关于sql注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到 ...

  10. cesium 学习(四) Hello World

    一.前言 之前的文章都是基础,搭建环境.部署Cesium.学习资料等等.现在简单入手,一个Hello World页面开发. 二.Hello World 感觉Hello World没有什么特别需要讲的, ...