2014年7月5日星期六

mac TeamTalk开发点点滴滴之二——block和DDLogic的有机结合 - 刀哥的技术随笔

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
mac TeamTalk开发点点滴滴之二――block和DDLogic的有机结合 - 刀哥的技术随笔  阅读原文»

队长、大队长都不在加上今天又比较空,偷偷的继续写mac TT开发点点滴滴的blog,一般人我不告诉他~~^_^

在开始本博文之前先翻出一个老概念——闭包(closure),相信同学们都听过用过并且有自己的理解,在各种开发语言中(JavaScript、c++,oc、lua等 )都能找到对闭包不同程度的支持。oc中的闭包是用block实现的,c++ 11中的闭包可以用lambda表达式来实现。ps:同学们可以膜拜下这篇文章——http://coolshell.cn/articles/8309.html

DDLogic框架(系列博文第一部分讲解内容)有个任务执行池里面装的是一个个等待执行的task,第一个版本是这样push一个任务的:

-(BOOL) pushTask:(id<DDTaskProtocol>)task delegate:(id<DDTaskDelegate>) delegate;

调用方例子:
1.先要创建一个task执行类:

@interface DDTestTask : NSObject<DDTaskProtocol>

-(void) execute;

@end

2.调用的地方需要创建实例,然后pushTask进去

DDTestTask * task = [[DDTestTask alloc] init];
[[DDLogic instance] pushTask:task delegate:nil];

曾近用c++ 98也写过类似的机制和mac端的第一版本是类似的:也贴个示例代码吧(番茄鸡蛋莫要砸过来哦,我不是没营养的贴码一族~~):

/**
* 发起一个Task到任务队列中(放入容器的task对象实例不需要自己释放)
*
* @param ITask * pTask
* @return void
*/
virtual LogicErrorCode pushTask(IN ITask* pTask) = 0;

调用方的例子也是类似的:
1.先创建一个task执行类:

class TestTask : public logic::ITask
{
public:
virtual void execute();
virtual void release();
}

2.调用的地方需要创建实例,然后pushTask进去

TestTask* pTask = new TestTask();
logic::GetLogic()->pushTask(pTask);

回头看看是不是略蛋疼呢?为了执行一段execute()的任务代码,需要额外做肿么多事情:1 定义一个类文件来编写task执行的任务类 2 在pushtask的地方要实例化这个task类 3 c++中执行完任务后还要记得释放任务对象资源。那么有没有更好的方法来简化这些重复的工作量呢,答案是肯定! c++、oc语言都有相应的解决方案。oc用block,c++ 11用lambda都可以完美的解决。
同样我贴段代码吧,DDLogic框架的task v2:

typedef void(^TaskBlock)();
-(BOOL) pushTaskWithBlock:(TaskBlock)taskBlock;

调用方例子:
[[DDLogic instance] pushTaskWithBlock:
^
{
//让task 跑一会儿...
}];
c++ 11 用lambda表达式做法也类似,如下:
void pushTaskWithLambda(std::function<void ()> taskRun)
{
taskRun();
}

调用方的例子:
logic::GetLogic()->pushTaskWithLambda(
[]()
{
//让task 跑一会儿...
}
);

——————————————————————————————————————————————————
以上通过直接把任务执行代码和pushTask调用的地方放在一起,是不是感觉让你的重复代码量、文件数倍减呢?oc block、c++ lambda的用法还可以有很多,比如oc block可以作为callback可以把你的整个程序流程封装在一个块里面,作为delegate也可以把流程封装在一个块里面,举个AFNetworking使用的例子:

-(void)requestWithUri:(NSString *)uri params:(NSDictionary *)params method:(NSString *)method success:(SuccessBlock)success failure:(FailureBlock)failure
{
// success block
void (^responseSuccess)(AFHTTPRequestOperation*, id) = ^(AFHTTPRequestOperation *operation, id responseObject)
{
//http成功的callback block
};

// failure block
void (^failureResponse)(AFHTTPRequestOperation *, NSError *) = ^(AFHTTPRequestOperation *operation, NSError *error)
{
//http失败的 callback block
};

AFHTTPRequestOperation *operation = [_httpClient HTTPRequestOperationWithRequest:request success: responseSuccess failure:failureResponse ];
[_httpClient enqueueHTTPRequestOperation:operation];
}

关于block的用法完整用法,同学们可以看下这个篇博文(http://blog.csdn.net/jy578154186_/article/details/8664129)讲的蛮详细的~~


本文链接:mac TeamTalk开发点点滴滴之二――block和DDLogic的有机结合,转载请注明。

Python数据结构与算法设计总结篇 - 胡家威  阅读原文»

1.Python数据结构篇

数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static/pythonds/index.html)时写下的阅读记录,当然,也结合了部分[算法导论]( http://en.wikipedia.org/wiki/Introduction_to_Algorithms)中的内容,此外还有不少wikipedia上的内容,所以内容比较多,可能有点杂乱。这部分主要是介绍了如何使用Python实现常用的一些数据结构,例如堆栈、队列、二叉树等等,也有Python内置的数据结构性能的分析,同时还包括了搜索和排序(在算法设计篇中会有更加详细的介绍)的简单总结。每篇文章都有实现代码,内容比较多,简单算法一般是大致介绍下思想及算法流程,复杂的算法会给出各种图示和代码实现详细介绍。这一部分是下面算法设计篇的前篇,如果数据结构还不错的可以直接看算法设计篇,遇到问题可以回来看数据结构篇中的某个具体内容充电一下,嘿嘿。

(1)[搜索]( http://hujiaweibujidao.github.io/blog/2014/05/07/python-algorithms-search/) 简述顺序查找和二分查找,详述Hash查找(hash函数的设计以及如何避免冲突)

(2)[排序]( http://hujiaweibujidao.github.io/blog/2014/05/07/python-algorithms-sort/) 简述各种排序算法的思想以及它的图示和实现

(3)[数据结构]( http://hujiaweibujidao.github.io/blog/2014/05/08/python-algorithms-datastructures/) 简述Python内置数据结构的性能分析和实现常用的数据结构:栈、队列和二叉堆

(4)[树总结](http://hujiaweibujidao.github.io/blog/2014/05/08/python-algorithms-Trees/) 简述二叉树,详述二叉搜索树和AVL树的思想和实现

2.Python算法设计篇

算法设计篇主要是阅读[Python Algorithms: Mastering Basic Algorithms in the Python Language](http://link.springer.com/book/10.1007%2F978-1-4302-3238-4)[**点击链接可进入Springer下载原书电子版**]之后写下的读书总结,原书大部分内容结合了经典书籍[算法导论](http://en.wikipedia.org/wiki/Introduction_to_Algorithms),内容更加细致深入,主要是介绍了各种常用的算法设计思想,以及如何使用Python高效巧妙地实现这些算法,这里有别于前面的数据结构篇,部分算法例如排序就不会详细介绍它的实现细节,而是侧重于它内在的算法思想。这部分使用了一些与数据结构有关的第三方模块,因为这篇的重点是算法的思想以及实现,所以并没有去重新实现每个数据结构,但是在介绍算法的同时会分析Python内置数据结构以及第三方数据结构模块的优缺点,也就意味着该篇比前面都要难不少,但是我想我的介绍应该还算简单明了,嘿嘿,除此之外,里面还有很多关于python开发的内容,精彩不容错过!

这里每篇文章都有实现代码,但是代码我一般都不会分析,更多地是分析算法思想,所以内容都比较多,即便如此也没有包括原书对应章节的所有内容,因为内容实在太丰富了,所以我只是选择经典的算法实例来介绍算法核心思想,除此之外,还有不少内容是原书没有的,部分是来自算法导论,部分是来自我自己的感悟,嘻嘻。该篇对于大神们来说是小菜,请一笑而过,对于菜鸟们来说可能有点难啃,所以最适合的是和我水平差不多的,对各个算法都有所了解但是理解还不算深刻的半桶水的程序猿,嘿嘿。

本篇的顺序按照原书[Python Algorithms: Mastering Basic Algorithms in the Python Language](http://link.springer.com/book/10.1007%2F978-1-4302-3238-4)的章节来安排的(章节标题部分相同部分不同哟),为了节省时间以及保持原著的原滋原味,部分内容(一般是比较难以翻译和理解的内容)直接摘自原著英文内容。

**1.你也许觉得很多内容你都知道嘛,没有看的必要,其实如果是我的话我也会这么想,但是如果只是归纳一个算法有哪些步骤,那这个总结也就没有意义了,我觉得这个总结的亮点在于想办法说清楚一个算法是怎么想出来的,有哪些需要注意的,如何进行优化的等等。**

**2.你也许还会说算法导论不是既权威又全面么,基本上每个算法都还有详细的证明呢,读算法导论岂不更好些,当然,你如果想读算法导论我不拦着你,读完了感觉自己整个人都不好了别怪小弟没有提醒你哟,嘻嘻嘻,左一个性质右一个定理实在不适合算法科普的啦,没有几个人能够坚持读完的。**

**3.如果你细读本系列的话我保证你会有不少收获的,需要看算法导论哪个部分的地方我会给出提示的,嘿嘿。温馨提示,精彩内容从第4节开始哟,么么哒 O(∩_∩)O~**

(1)[Python Algorithms - C1 Introduction]( http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-introduction/)

本节主要是对原书中的内容做些简单介绍,说明算法的重要性以及各章节的内容概要。

(2)[Python Algorithms - C2 The basics]( http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-the-basics/)

本节主要介绍了三个内容:算法渐近运行时间的表示方法、六条算法性能评估的经验以及Python中树和图的实现方式。

(3)[Python Algorithms - C3 Counting 101]( http://hujiaweibujidao.github.io//blog/2014/07/01/python-algorithms-counting-101/)

原书主要介绍了一些基础数学,例如排列组合以及递归循环等,但是本节只重点介绍计算算法的运行时间的三种方法

(4)[Python Algorithms - C4 Induction and Recursion and Reduction](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-induction/)

本节主要介绍算法设计的三个核心知识:Induction(推导)、Recursion(递归)和Reduction(规约),这是原书的重点和难点部分

(5)[Python Algorithms - C5 Traversal]( http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-traversal/)

本节主要介绍图的遍历算法BFS和DFS,以及对拓扑排序的另一种解法和寻找图的(强)连通分量的算法

(6)[Python Algorithms - C6 Divide and Combine and Conquer](http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-divide-and-combine-and-conquer/)

本节主要介绍分治法策略,提到了树形问题的平衡性以及基于分治策略的排序算法

(7)[Python Algorithms - C7 Greedy]( http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-greedy/)

本节主要通过几个例子来介绍贪心策略,主要包括背包问题、哈夫曼编码和最小生成树

(8)[Python Algorithms - C8 Dynamic Programming]( http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-dynamic-programming/)

本节主要结合一些经典的动规问题介绍动态规划的备忘录法和迭代法这两种实现方式,并对这两种方式进行对比

(9)[Python Algorithms - C9 Graphs]( http://hujiaweibujidao.github.io/blog/2014/07/01/python-algorithms-graphs/)

本节主要介绍图算法中的各种最短路径算法,从不同的角度揭示它们的内核以及它们的异同


本文链接:Python数据结构与算法设计总结篇,转载请注明。

阅读更多内容

没有评论:

发表评论