<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>-Flyぁ梦- &#187; oop</title>
	<atom:link href="http://blog.11034.org/tag/oop/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.11034.org</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jun 2025 08:59:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>ruby on rails</title>
		<link>http://blog.11034.org/2014-07/ruby_on_rails.html</link>
		<comments>http://blog.11034.org/2014-07/ruby_on_rails.html#comments</comments>
		<pubDate>Mon, 07 Jul 2014 13:51:26 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.11034.org/?p=2252</guid>
		<description><![CDATA[工作需求，开始写ruby，因为基于web也就自然用上了rails。就这样开始接触ruby on rails，在 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>工作需求，开始写ruby，因为基于web也就自然用上了rails。就这样开始接触ruby on rails，在已有代码的基础上很快就能上手开发了。刚开始对ruby可能有各种吐槽，不过写习惯了之后真心觉得ruby语言本身挺不错的，比Python的语法舒服多了呢。</p>
<p><span id="more-2252"></span></p>
<h2>刚开始</h2>
<p>安装ruby真的够麻烦！装Java只要双击JDK然后配置环境变量即可；装Python只要双击python.msi然后配置环境变量即可；写这篇文章的时候我已经忘了怎么安装ruby了&#8230;只记得很麻烦，倒腾了很久！ <img src="http://blog.11034.org/wp-includes/images/smilies/icon_evil.gif" alt=":evil:" class="wp-smiley" style="height: 1em; max-height: 1em;" />  而且安装ruby的mysql驱动更是麻烦，win至今没装上，linux的也很麻烦！</p>
<p>ruby语言本身相比于其他脚本语言的确难很多，语法略晦涩难懂。</p>
<p>和Python类似，改了很多关键字，让熟悉静态语言的编程者不太习惯，尤其是elsif；next取代了continue；rescure取代了catch</p>
<p>ruby的对象在外部，没有“属性”这个概念，只有方法！只有在类内部才有属性和本地变量。惊呆了 <img src="http://blog.11034.org/wp-includes/images/smilies/icon_eek.gif" alt="8-O" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>ruby的拟态函数，看着就像一条命令，着实让新手期的我非常困惑，一个不带()的函数名加一个空格后的参数；完全找不到函数的定义，可能在某些module中，可能根本没有函数体是个用rails的has_many或者named_scope动态定义的函数&#8230;模块定义的函数，实例函数和静态函数也傻傻分不清楚。 <img src="http://blog.11034.org/wp-includes/images/smilies/icon_twisted.gif" alt=":twisted:" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>虽说Ruby和Java一样是纯OOP的语言，但是OOP的特性又很不一样，Ruby甚至不怎么推荐OOP的做法。</p>
<h2>渐渐地</h2>
<p>有点喜欢ruby了</p>
<ul>
<li> 函数名不带括号感觉很省事，导致写js的时候老忘了括号</li>
<li>类似 <code class="markdown_inline_code">return nil if params[:id] == nil</code>的一行代码，还可以 <code class="markdown_inline_code">render_error and return [ if xxx ]</code>，感觉太棒</li>
<li>遍历list/hash是那么方便</li>
<li>函数随意带block，自定义化程度非常高</li>
<li>rails是那么的强大，写web是那么的方便</li>
</ul>
<h2>rails和web</h2>
<p>写web，静态语言就Java（.Net不熟），脚本语言比较多：PHP、Python、Ruby，基本以这些为主流。Java不必说，太复杂开发效率低；PHP最灵活方便，但是没有一个好用强大的框架支持，功能复杂就显得力不从心；Python基于web写的不多，10年的时候用过Django，只能说一般般，现在不知道怎么样了，公司里也有同事在用Python写web，但感觉明显没有rails爽。</p>
<ul>
<li>rails的ORM强大到没有朋友</li>
<li>对ruby核心库的加强（ruby可以往原有类中直接加入API，不需要像Java中Apache类库的StringUtils那样用新的类）</li>
<li>view层面太方便的嵌套片段HTML；对ajax支持很好</li>
<li>debug方便，不仅方便地打印出所有SQL和模板加载，甚至有加载时间，优化起来很顺手</li>
</ul>
<p>深深的觉得，没有了rails，ruby真心没有太多闪光的地方&#8230;大概这也就是为什么ruby一直和rails绑定的关系吧</p>
<h2>ruby和rails的不足</h2>
<p>用到现在，受Java的影响，觉得ruby在以下几个方面用的还不是很灵活不习惯。很大程度上应该是自己对ruby和rails的了解还不够深入。</p>
<ul>
<li>继承体系：没有丰富的继承体系，OOP怎么体现优势？但是感觉rails中，写rails的Model时候，很难使用到完全自定义很灵活的继承体系。或者说Ruby的理念就不怎么喜欢用继承体系，更喜欢用Module的扩展甚至打开类技术。</li>
<li>数据结构库不丰富：只有内置的list/hash，对于常用的LinkedList、OrderedHashMap、HashSet等替代实现没有找到</li>
</ul>
<h4  class="related_post_title">看看 oop , PHP , Python</h4><ul class="related_post"><li>2014-09-10 -- <a target="_blank" href="http://blog.11034.org/2014-09/dotnet_csharp_excel.html" title="记C#和Excel开发">记C#和Excel开发</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/ac_automachine.html" title="一个OOP的AC自动机代码">一个OOP的AC自动机代码</a></li><li>2012-03-22 -- <a target="_blank" href="http://blog.11034.org/2012-03/java_util_collections.html" title="java.util中的集合类解析">java.util中的集合类解析</a></li><li>2010-11-17 -- <a target="_blank" href="http://blog.11034.org/2010-11/python2x_first_impression.html" title="Python2.x的第一印象">Python2.x的第一印象</a></li><li>2010-09-29 -- <a target="_blank" href="http://blog.11034.org/2010-09/wp-sns-share_add_tinyurl.html" title="wp-sns-share-1.2，增加tinyurl功能">wp-sns-share-1.2，增加tinyurl功能</a></li></ul><h4 class="related_post_title">看看 ruby on rails </h4><ul class="related_post"><li>2015-08-12 -- <a target="_blank" href="http://blog.11034.org/2015-08/rails_nginx.html" title="Liunx下搭建Rails和Nginx环境">Liunx下搭建Rails和Nginx环境</a></li><li>2015-04-09 -- <a target="_blank" href="http://blog.11034.org/2015-04/json_ascii.html" title="JSON中出现解析错误的原因之一：不可打印字符">JSON中出现解析错误的原因之一：不可打印字符</a></li><li>2014-12-21 -- <a target="_blank" href="http://blog.11034.org/2014-12/ruby_encoding.html" title="Ruby字符串的编码">Ruby字符串的编码</a></li><li>2014-10-25 -- <a target="_blank" href="http://blog.11034.org/2014-10/linux_timeout.html" title="linux的timeout处理wkhtmltopdf进程超时">linux的timeout处理wkhtmltopdf进程超时</a></li><li>2014-10-04 -- <a target="_blank" href="http://blog.11034.org/2014-10/rails-has_many.html" title="Rails中has_many等的原理">Rails中has_many等的原理</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2014-07/ruby_on_rails.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一个OOP的AC自动机代码</title>
		<link>http://blog.11034.org/2012-12/ac_automachine.html</link>
		<comments>http://blog.11034.org/2012-12/ac_automachine.html#comments</comments>
		<pubDate>Thu, 06 Dec 2012 12:56:18 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[数据结构和算法]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[树]]></category>

		<guid isPermaLink="false">http://blog.stariy.org/?p=1416</guid>
		<description><![CDATA[网上代码很多，但是大多ACMer的风格，呃不是我说，代码可读性和封装性是比较欠缺的&#8230;也许Java出 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>网上代码很多，但是大多ACMer的风格，呃不是我说，代码可读性和封装性是比较欠缺的&#8230;也许Java出身的码农也就这点还有些优势了吧&#8230;纯自己手动敲的，build_ac函数（建立fail指针的过程）学习了网上的教程后模仿着写的，而且带clear()释放内存。<span id="more-1416"></span></p>
<p>AC自动机基于Trie树，Trie树基于字符表，宏定义SIZE表明字符集大小，宏定义MINCHAR表明字符集中最小的字符，这里的定义只适合26个英文小写字母。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define SIZE 26</span>
<span style="color: #339900;">#define MINCHAR ('a')</span>
<span style="color: #0000ff;">struct</span> TrieNode<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> tail<span style="color: #008080;">;</span>		<span style="color: #666666;">//表明此节点为某一字符串结尾</span>
	TrieNode<span style="color: #000040;">*</span> fail<span style="color: #008080;">;</span>		<span style="color: #666666;">//失败指针</span>
	TrieNode<span style="color: #000040;">*</span> nodes<span style="color: #008000;">&#91;</span>SIZE<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>	<span style="color: #666666;">//节点指针的数组</span>
	TrieNode<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> SIZE<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
		tail <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span>, fail <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">void</span> clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> SIZE<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
				nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000dd;">delete</span> nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> Trie<span style="color: #008000;">&#123;</span>
	TrieNode<span style="color: #000040;">*</span> root<span style="color: #008080;">;</span>
&nbsp;
	Trie<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> root <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> TrieNode<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">//清空Trie树，释放内存</span>
	<span style="color: #0000ff;">void</span> clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span> root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">//插入一个字符串</span>
	<span style="color: #0000ff;">void</span> insert<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>s, <span style="color: #0000ff;">int</span> len<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		TrieNode<span style="color: #000040;">*</span> N <span style="color: #000080;">=</span> root<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> idx<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> len<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
			idx <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span>s<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> MINCHAR<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>N<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>idx<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
				N<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>idx<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> TrieNode<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			N <span style="color: #000080;">=</span> N<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>idx<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		N<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>tail <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">//插入字符串完毕后，建立fail指针</span>
	<span style="color: #0000ff;">void</span> build_ac<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		queue<span style="color: #000080;">&lt;</span>TrieNode<span style="color: #000040;">*</span><span style="color: #000080;">&gt;</span> q<span style="color: #008080;">;</span>
		TrieNode <span style="color: #000040;">*</span>nd, <span style="color: #000040;">*</span>child, <span style="color: #000040;">*</span>pt<span style="color: #008080;">;</span>
		root<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
		q.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>root<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>q.<span style="color: #007788;">empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
			nd <span style="color: #000080;">=</span> q.<span style="color: #007788;">front</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			q.<span style="color: #007788;">pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			pt <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> SIZE<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
				child <span style="color: #000080;">=</span> nd<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>child <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
					<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>nd <span style="color: #000080;">==</span> root<span style="color: #008000;">&#41;</span> child<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail <span style="color: #000080;">=</span> root<span style="color: #008080;">;</span>
					<span style="color: #0000ff;">else</span><span style="color: #008000;">&#123;</span>
						pt <span style="color: #000080;">=</span> nd<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail<span style="color: #008080;">;</span>
						<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>pt <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
							<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>pt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
								child<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail <span style="color: #000080;">=</span> pt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
								<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
							<span style="color: #008000;">&#125;</span>
							pt <span style="color: #000080;">=</span> pt<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail<span style="color: #008080;">;</span>
						<span style="color: #008000;">&#125;</span>
						<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>pt <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span> child<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail <span style="color: #000080;">=</span> root<span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
					q.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>child<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #666666;">//建立fail指针完毕后，在指定的字符串文本数据中来搜索匹配串</span>
	<span style="color: #0000ff;">void</span> process<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>s, <span style="color: #0000ff;">int</span> len<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		TrieNode <span style="color: #000040;">*</span>nd <span style="color: #000080;">=</span> root, <span style="color: #000040;">*</span>nd2<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">int</span> idx<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i <span style="color: #000080;">&lt;</span> len<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
			idx <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span>s<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">-</span> MINCHAR<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>nd <span style="color: #000040;">!</span><span style="color: #000080;">=</span> root <span style="color: #000040;">&amp;&amp;</span> nd<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>idx<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span> nd <span style="color: #000080;">=</span> nd<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>nd<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>idx<span style="color: #008000;">&#93;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
				nd <span style="color: #000080;">=</span> nd<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>nodes<span style="color: #008000;">&#91;</span>idx<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				nd2 <span style="color: #000080;">=</span> nd<span style="color: #008080;">;</span>
				<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>nd2 <span style="color: #000040;">!</span><span style="color: #000080;">=</span> root<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
					<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>nd2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>tail <span style="color: #000080;">==</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
						<span style="color: #666666;">//找到一个匹配</span>
					<span style="color: #008000;">&#125;</span>
					nd2 <span style="color: #000080;">=</span> nd2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>fail<span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<h4  class="related_post_title">看看 oop , 字符串 , 树</h4><ul class="related_post"><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/string.html" title="整理下字符串的一些数据结构和算法">整理下字符串的一些数据结构和算法</a></li><li>2014-07-07 -- <a target="_blank" href="http://blog.11034.org/2014-07/ruby_on_rails.html" title="ruby on rails">ruby on rails</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/suffix_array.html" title="一套可用的后缀数组代码">一套可用的后缀数组代码</a></li><li>2012-07-03 -- <a target="_blank" href="http://blog.11034.org/2012-07/trie_in_php.html" title="敏感词过滤，PHP实现的Trie树">敏感词过滤，PHP实现的Trie树</a></li><li>2012-03-22 -- <a target="_blank" href="http://blog.11034.org/2012-03/java_util_collections.html" title="java.util中的集合类解析">java.util中的集合类解析</a></li></ul><h4 class="related_post_title">看看 数据结构和算法 </h4><ul class="related_post"><li>2013-05-27 -- <a target="_blank" href="http://blog.11034.org/2013-05/java_map.html" title="java.util中几个Map的性能测试">java.util中几个Map的性能测试</a></li><li>2013-05-07 -- <a target="_blank" href="http://blog.11034.org/2013-05/rectangle_overlap.html" title="判断矩形是否重叠">判断矩形是否重叠</a></li><li>2013-01-15 -- <a target="_blank" href="http://blog.11034.org/2013-01/pack_in_zoj.html" title="背包练习小集合">背包练习小集合</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/string.html" title="整理下字符串的一些数据结构和算法">整理下字符串的一些数据结构和算法</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/suffix_array.html" title="一套可用的后缀数组代码">一套可用的后缀数组代码</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2012-12/ac_automachine.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>java.util中的集合类解析</title>
		<link>http://blog.11034.org/2012-03/java_util_collections.html</link>
		<comments>http://blog.11034.org/2012-03/java_util_collections.html#comments</comments>
		<pubDate>Wed, 21 Mar 2012 16:15:37 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://blog.stariy.org/?p=1101</guid>
		<description><![CDATA[Java源码学习的第二个重点块，也是jdk中最有意义最有价值的一块，这里的集合类都是数据结构和算法，上手快学到 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Java源码学习的第二个重点块，也是jdk中最有意义最有价值的一块，这里的集合类都是数据结构和算法，上手快学到的东西也多，而且在日常Java代码中出现率仅次于java.lang包。java.util中集合类必须是最重要的一块了，当然其他还有日期日历时区、货币、线程等工具类，不过这些类并没有太大的价值去精读。<br />
<span id="more-1101"></span></p>
<p>java.util中的集合类整体，在javadoc中被称为Java Collections Framework，详细可wiki。</p>
<p>主要有以下线路：(I)表示接口，(A)表示抽象类</p>
<ul>
<li>(I)<span style="color: #993366;">Iterable</span>-&gt;(I)<span style="color: #993366;">Collection</span>-&gt;(I)<span style="color: #993366;"><strong>List </strong></span>[ArrayList、LinkedList、Vector、Stack]</li>
<li>(I)<span style="color: #993366;">Iterable</span>-&gt;(I)<span style="color: #993366;">Collection</span>-&gt;(I)<span style="color: #993366;"><strong>Set </strong></span>[HashSet、LinkedHashSet、TreeSet]</li>
<li>(I)<span style="color: #993366;">Iterable</span>-&gt;(I)<span style="color: #993366;">Collection</span>-&gt;(I)<span style="color: #993366;"><strong>Queue </strong></span>[ArrayDeque、PriorityQueue]</li>
<li>(I)<strong><span style="color: #993366;">Map</span> </strong>[HashMap、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap]</li>
<li>(A)<span style="color: #008000;">Dictionary</span>-&gt;Hashtable</li>
<li>BitSet、<span style="color: #ff9900;">Arrays<span style="color: #000000;">、</span>Collections</span></li>
</ul>
<h2><span style="color: #993366;">List</span></h2>
<h4><span style="color: #0000ff;">ArrayList&lt;E&gt;</span></h4>
<p>由数组实现的链表，每次调用add(E e)时调用ensureCapacity(size + 1)，可能导致元素数组扩容1.5倍。因为它是随机访问的（即实现RandomAccess接口），javadoc中表示使用for(int i = 0)的循环遍历会比Iterator遍历和foreach()循环快（foreach循环即Iterator遍历），这也在很多源码中体现出来若实例为RandomAccess的，会采取for循环来遍历。</p>
<h4><span style="color: #0000ff;">LinkedList&lt;E&gt;</span></h4>
<p>由结点链接而成的链表，API较多用来当做栈、队列、双向队列都可以。</p>
<h4><span style="color: #0000ff;">Vector&lt;E&gt;</span> 和 <span style="color: #0000ff;">Stack&lt;E&gt;</span> extands Vector&lt;E&gt;</h4>
<p>Vector类似ArrayList，但是此为线程安全版本。小有区别的，每次需要扩容时元素数组扩容2倍。</p>
<p>Stack就是个线程安全的栈，没啥好说。</p>
<h2><span style="color: #993366;">Queue</span></h2>
<h4><span style="color: #0000ff;">ArrayDeque&lt;E&gt;</span> implements Deque&lt;E&gt;</h4>
<p>由数组实现的双向队列（Deque接口）。这个类的代码实现有点意思的，元素数组大小一定是power-of-2，然后可以方便地使用位运算来判断长度溢出等。因为要保持数组容量的这个特性，数组扩容代码也挺有意思，有个简单的算法将某个数二进制中最高位1右边所有的位全部置为1，然后再+1，即得到了一个更大的power-of-2。</p>
<h4><span style="color: #0000ff;">PriorityQueue&lt;E&gt;</span></h4>
<p>由数组实现的优先队列，元素E必须实现Comparable接口或选择带有Comparator的PriorityQueue构造，因为在比较元素E时会强制转化类型为Comparable。看这个类的源代码可以好好复习下优先队列及满二叉树的实现。数组扩容的代码有点意思，当原容量&lt;64时，扩容2倍，否则扩容1.5倍，综合ArrayList和Vector的扩容方案。</p>
<h2><span style="color: #993366;">Set</span></h2>
<p>set是Java Collections Framework最坑爹的实现了，因为它根本没有任何实现，所有的set都在内部保存有一个对应的map类型实例&#8230;</p>
<h2><span style="color: #993366;">Map</span></h2>
<p>map是Java Collections Framework最复杂的一块。</p>
<h4><span style="color: #0000ff;">HashMap&lt;K, V&gt;</span></h4>
<p>一般的Hash表实现，冲突机制使用在原位置接链表的方式。与教科书推荐的不太一样的是，桶的个数并不是推荐的质数个（据说这样可以减小冲突率）而是power-of-2，为的是通过位操作的代码高效实现。</p>
<ul>
<li>默认加载因子是0.75，即75%的桶被沾满了就会扩容重新hash，每次double容量</li>
<li>冲突机制：接链表</li>
<li>hash函数，static int hash(int h)，对元素E.hashCode()再进行一次hash，hash算法很复杂各种移位抑或操作，表示看不懂&#8230;</li>
<li>允许null键，而且null键必定位于0号位桶</li>
<li>键的比较采用Object.equals()方法（null键带有特判）</li>
<li>foreach循环或Iterator遍历，按照桶的顺序（当一个桶有多个键时，按照插入顺序遍历）</li>
</ul>
<h4><span style="color: #0000ff;">Hashtable&lt;K, V&gt;</span></h4>
<p>姑且算放在Map这里吧，主要可以和HashMap来个对比。算是线程安全的HashMap，但是相比来说代码没有HashMap优化的好。</p>
<p>Hashtable与HashMap的不同之处：</p>
<ul>
<li>Hashtable继承自Dictionary抽象类；HashMap继承自AbstractMap抽象类</li>
<li>Hashtable的hash函数直接使用的E.hashCode()，使用取余操作；HashMap使用位操作并进一步hash</li>
<li>Hashtable不允许null键，也不允许null值；HashMap都允许</li>
<li>Hashtable中是contains()方法；HashMap是containsKey()或containsValue()</li>
<li>Hashtable中由Enumerator来实现Enumeration和Iterator；HashMap则单由Iterator实现</li>
</ul>
<h4><span style="color: #0000ff;">LinkedHashMap&lt;K, V&gt;</span> extends HashMap&lt;K, V&gt;</h4>
<p>数据存储和读取和HashMap无异，但是多了一个链表来保存插入键的顺序。当foreach循环或Iterator遍历时，会按照这个链表来遍历。比较有意思的是，LinkedHashMap为后续提供了一个LRU容器的选择，可以自建个类继承自LinkedHashMap，重写protected boolean removeEldestEntry()然后return true。</p>
<h4><span style="color: #0000ff;">IdentityHashMap&lt;K, V&gt;</span></h4>
<p>对外而言这个Map与HashMap最大的不同在于比较Key用==操作符，其实内部实现有很大的区别。同样使用power-of-2大小的元素数组，但是没有用一个内部静态类去封装Key和Value，用偶数桶存放Key奇数桶存放Value，即每一项占用2个桶，然后冲突策略使用的index + 2策略，即冲突就往下一个最近的桶放。</p>
<ul>
<li>冲突机制：开放定址法，并为线性探测；效率低、删除元素非常麻烦</li>
<li>hash函数：对System.identityHashCode(E)继续一些位操作来得到hash值</li>
<li>允许null键</li>
<li>键比较采用==操作符</li>
<li>foreach循环或Iterator遍历，按照桶的顺序</li>
<li>OO封装不好，key、value连着放除了性能上很小的提升外没有啥优点</li>
</ul>
<h4><span style="color: #0000ff;">TreeMap&lt;K, V&gt;</span></h4>
<p>由红黑树实现的Map，Key必须实现Comparable接口或选择带有Comparator的TreeMap构造。也是非常值得精读的一个类，不仅仅在于了解一下红黑树这个效率比较优秀的平衡二叉树的实现更在于对一般的二叉树这个数据结构和算法的掌握。为了看懂源码学习了一会儿红黑树，真心表示复杂，所以觉得大致了解红黑树就可以了无需看懂插入元素和删除元素的每一步操作这么具体。因为TreeMap是唯一实现SortedMap接口的Map，很多API的代码实现对二叉树的操作十分的美，特别是static successor()、static predecessor()、getCeilingEntry()、getFloorEntry()的实现很关键。</p>
<ul>
<li>拒绝null键，因为键需要比较，但允许null值</li>
<li>树的重建，用最平衡的方法重建红黑树，递归则重建左子树、中间节点、右子树。而且红色节点计算很方便，最后一层（若没有满）则所有节点都是红色的（即保证所有的黑色节点为一棵满树）</li>
</ul>
<h4><span style="color: #0000ff;">WeekHashMap&lt;K, V&gt;</span></h4>
<p>基本和HashMap一样，就是Entry的实现继承自WeakReference，key是弱引用，value是强引用。适用于元素量巨大，内存可能不足够用的时候，自动GC某些key并在下次访问Map时删除这些映射。适合作缓存，某些项突然消失也无关紧要的那种。</p>
<ul>
<li>Entry&lt;K,V&gt; extends WeakReference&lt;K&gt;，当GC工作时某些Key会被GC并放入WeekHashMap的ReferenceQueue中。每次对WeekHashMap的调用，会检查ReferenceQueue中已被GC的Key，然后找到那项Entry将里面的强引用Value给设置为null便于GC，并删除Map中对此Entry的引用，更新计数。</li>
<li>键冲突机制、hash函数、null键、键比较、遍历全部与HashMap相同</li>
</ul>
<h2><span style="color: #0000ff;">BitSet</span></h2>
<p>使用long数组来实现的位向量，使用了大量位运算，值得一读。</p>
<h2><span style="color: #0000ff;">Arrays</span></h2>
<p>全静态方法的针对数组的工具类。主要提供了排序、二分搜索、复制、填充等功能。</p>
<p>排序方法中：</p>
<ul>
<li>所有Java基础类型的数组排序使用QuickSort，在元素量&lt;7时使用InsertSort。选取pivot有一定改进。</li>
<li>对double和float数组的排序有预处理，将NaN放到数组最后不参与排序，将-0.0d设为0.0d参与排序</li>
<li>对Java类型的数组排序使用MergeSort，在元素量&lt;7时使用InsertSort。改进：当2个子序列a和b，max(a)&lt;=min(b)则直接copy a和b至目标数组</li>
</ul>
<h2><span style="color: #0000ff;">Collections</span></h2>
<p>全静态方法的针对集合类的工具类。主要提供排序、元素移位、封装集合为不可变集合、封装集合为线程安全集合、封装集合为类型检查集合等功能。</p>
<p>所有的集合封装方法，都是将传入的集合封装一层类，然后在外层提供的API中拒绝修改方法（抛出UnsupportedOperationException）、提供线程安全（synchronized关键字）、检查插入类与泛型类来实现。</p>
<h2>综合</h2>
<ul>
<li>所有的集合类都有modCount这个field，它的作用是记录集合实例被改变的次数，特别是调用Iterator时这个modCount会被保存副本，在遍历过程中若发现集合实例被修改（即副本modCount与集合类实例的modCount不相等），立即停止遍历并抛出异常，即javadoc中提到的<tt>iterator</tt> 和 <tt>listIterator</tt> 方法返回的迭代器是快速失败的。</li>
<li>Map和Set中支持KeySet、ValueSet、EntrySet这些方法，返回的Set并不是一个独立的Set，内部无任何元素只有一个指向原来集合实例的指针（内部类），所以一般只用来作遍历用，如果修改这些Set会同步地修改原来集合实例。</li>
<li>所有的集合类实现了java.lang.Cloneable接口，从而支持clone()方法，然后又全部重写clone()方法，集合实例的确被clone了，但是内部包含的所有集合元素只是copy了引用，而没有完整copy一份（当然因为元素本身不一定实现了Cloneable不能被clone），因为本质只是调用了System.arraycopy()而已。</li>
</ul>
<h2>感想</h2>
<ul>
<li>大多数集合类的实现其实一点都不难，慢慢改进调试我们也写得出来</li>
<li>有很好的OO思想直接体现在整个Java Collections Framework的层次结构设计，是值得学习的</li>
<li>Iterator思想也是很值得学习的，因为这一点也许接触地更少</li>
<li>也许算Java语言的一个无奈之处，因为基础类型没有共同可替代的方式，所以针对基础类型的方法全部要重载一遍，而不像针对类类型只要写一个Object版本就可以。这导致基础类型的方法中，比如System.out.println()，比如Arrays的所有方法，代码大量冗余重复，这是非常不美的地方啊，不知道以后的Java会不会改进</li>
</ul>
<h4  class="related_post_title">看看 oop , 数据结构</h4><ul class="related_post"><li>2014-07-07 -- <a target="_blank" href="http://blog.11034.org/2014-07/ruby_on_rails.html" title="ruby on rails">ruby on rails</a></li><li>2013-10-31 -- <a target="_blank" href="http://blog.11034.org/2013-10/hulu.html" title="hulu校招">hulu校招</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/ac_automachine.html" title="一个OOP的AC自动机代码">一个OOP的AC自动机代码</a></li><li>2012-07-03 -- <a target="_blank" href="http://blog.11034.org/2012-07/trie_in_php.html" title="敏感词过滤，PHP实现的Trie树">敏感词过滤，PHP实现的Trie树</a></li><li>2010-11-17 -- <a target="_blank" href="http://blog.11034.org/2010-11/python2x_first_impression.html" title="Python2.x的第一印象">Python2.x的第一印象</a></li></ul><h4 class="related_post_title">看看 Java </h4><ul class="related_post"><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><li>2016-08-18 -- <a target="_blank" href="http://blog.11034.org/2016-08/java_concurrency_in_practice.html" title="读java concurrency in practice">读java concurrency in practice</a></li><li>2016-08-05 -- <a target="_blank" href="http://blog.11034.org/2016-08/thread_stop.html" title="线程清理">线程清理</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/futuretask.html" title="FutureTask简单分析和用法">FutureTask简单分析和用法</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/semaphore.html" title="Semaphore简单分析">Semaphore简单分析</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2012-03/java_util_collections.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Python2.x的第一印象</title>
		<link>http://blog.11034.org/2010-11/python2x_first_impression.html</link>
		<comments>http://blog.11034.org/2010-11/python2x_first_impression.html#comments</comments>
		<pubDate>Wed, 17 Nov 2010 14:48:24 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://blog.stariy.info/?p=575</guid>
		<description><![CDATA[来百度实习整3周了，很幸运，没有从事C++的工作而是写Python，一来是因为自从对Java抛出橄榄枝后就对C [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>来百度实习整3周了，很幸运，没有从事C++的工作而是写Python，一来是因为自从对Java抛出橄榄枝后就对C++的语法和OO方面各种BS，当然做算法除外，二来有幸能在实习阶段学习自己一直很想学的Python，的确是一件好事。Python也接触几周了，爽和不爽都有那么一点，也谈不上哪方面更占上风，毕竟骨子里已经被Java各种渗透了，熟悉新语言总会带着一点比较，有点偏见了。<span id="more-575"></span></p>
<p>因为本来比较熟的是Java和PHP，可以说基本都是以做Web为擅长的语言。Java丰富多彩，但基于JVM这个复杂的东西让它很不适合开发一个方便快捷的程序，尤其是偏桌面的，PHP就不用说了，完全的Web语言，没有浏览器就无用武之地了。相对于这个组合，C++其实是一个很好的补充，作为桌面开发，但因为以上说的原因就算了，还有C#，上过课用过一段时间，功能很强大但是很微软，.NET神马的还是算了。于是Python似乎是一个很好的补充，它简单方便，双击就能运行，Web也很强，而且像百度、Google这样的公司都大量使用Python，对以后找工作也很有帮助。</p>
<ul>
<li>语法</li>
</ul>
<p>Python最有名的莫过于强制缩进的语法风格了，这点我很欣赏，在Eclipse我手写Java就和format后的代码几乎无异，就是长句换行麻烦了点。稍微比较不习惯的就是经典的大括号被去掉了，据说是为了去除括号的N种风格，现在看到函数的结尾，尤其是一个类的结尾就没有一点标志（不然会有个‘}’嘛），太不爽了，当一个类长了的时候，而且当一个文件中有2个类的时候，很难找到类到底在哪儿结束。</p>
<ul>
<li>关键字</li>
</ul>
<p>Python的关键字有点别出心裁的感觉，try catch它来个try except，else if变成elif（貌似有的语言也这样），this改为self（PHP倒也是这样），def（喜欢其他脚本语言的function）。我有个想法，最好ISO出个编程语言关键字统一版本，关键字取名一样，怎么编译和解释是每个语言的各自的事，这样多好啊，切换一门语言的时候都不会太累。</p>
<ul>
<li>命名规范</li>
</ul>
<p>不知道是不是Python接触的还不够多，总感觉Python没有一套很明确的命名规范，既不是Java的驼峰式，也不是C的下划线隔开式，也不是微软的大写开头式，import导入的很多也是小写打头的，很容易混乱，然后变量取名不能随便取，像list、dict这些type类型，导入time包后的time，都会发生程序异常。这一点也因为Python的变量很随意，不像强语言，也不像PHP那样带$符号。</p>
<ul>
<li>OOP</li>
</ul>
<p>其实OOP接触的还不多，毕竟还没怎么实践，但是从书上看来，的确令我不爽。Python的OO是不符合OO标准的，它有C++的多重继承，对private的修饰如此纠结（函数名前加下划线），还有没有new关键字&#8230;。还有是对field没有明确申明，你可以实例化任何一个类，然后给它添加任何你自己的field属性，比较无语&#8230;还有貌似类内部引用自己类的静态变量居然要用类名来索引，如果改类名的话，代码要大动。</p>
<ul>
<li>pythonic</li>
</ul>
<p>感觉Python主义者都会很强调这个，Python说不定还真是因为有这个信仰一样的精神指导才能发展如此迅猛，基本大多数条目我都赞同，并且都是放之四海皆准的编程真理，也推荐ITer能好好参悟之，但惟独一条弃用tab键缩进而改用4个空格，理由很强势，不同os或文本编辑器对tab解释不同导致代码眼观起来差别很大，的确如此，不过敲一个键变成敲四个键，还是每行代码都要打的语法规定，对于Python这样极力于精简的语言来说，算是个什么事呢？</p>
<p style="padding-left: 30px;">pythonic的条目见：<a title="/2010-08/first_day_overtime.html" href="/2010-08/first_day_overtime.html" target="_blank">http://blog.11034.org/2010-08/first_day_overtime.html</a></p>
<p>好像都在说我对Python的不好的感觉，呵呵，Python的好处自然不言而喻啦，开头也有说过一点，各种方便各种库的支持，无所不能，Java代码十几行Python往往一个API就搞定，当然脚本语言一般都这样。不过听串叔一席话：Java怎么也是有一个大公司在支撑的15年+的语言，Python的核心毕竟只是少数人虽然年份也久了但总感觉是新语言，这点不知道会不会影响Python的良好发展。</p>
<h4  class="related_post_title">看看 oop</h4><ul class="related_post"><li>2014-07-07 -- <a target="_blank" href="http://blog.11034.org/2014-07/ruby_on_rails.html" title="ruby on rails">ruby on rails</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/ac_automachine.html" title="一个OOP的AC自动机代码">一个OOP的AC自动机代码</a></li><li>2012-03-22 -- <a target="_blank" href="http://blog.11034.org/2012-03/java_util_collections.html" title="java.util中的集合类解析">java.util中的集合类解析</a></li><li>2010-09-29 -- <a target="_blank" href="http://blog.11034.org/2010-09/wp-sns-share_add_tinyurl.html" title="wp-sns-share-1.2，增加tinyurl功能">wp-sns-share-1.2，增加tinyurl功能</a></li></ul><h4 class="related_post_title">看看 Python , 百度 </h4><ul class="related_post"><li>2010-11-27 -- <a target="_blank" href="http://blog.11034.org/2010-11/image_resize_in_java_and_python.html" title="Python和Java处理图片缩放，C#友情支持">Python和Java处理图片缩放，C#友情支持</a></li><li>2011-07-29 -- <a target="_blank" href="http://blog.11034.org/2011-07/baidu_mobads_online.html" title="第一个线上产品，百度移动应用联盟">第一个线上产品，百度移动应用联盟</a></li><li>2011-05-21 -- <a target="_blank" href="http://blog.11034.org/2011-05/baidu_back_to_zju.html" title="百度归，于浙大华诞114年">百度归，于浙大华诞114年</a></li><li>2011-03-10 -- <a target="_blank" href="http://blog.11034.org/2011-03/algo_p8880t.html" title="百度年会三等奖：爱国者P8880T">百度年会三等奖：爱国者P8880T</a></li><li>2011-03-01 -- <a target="_blank" href="http://blog.11034.org/2011-03/hello_shanghai_twice.html" title="再一次来到了上海">再一次来到了上海</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2010-11/python2x_first_impression.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>wp-sns-share-1.2，增加tinyurl功能</title>
		<link>http://blog.11034.org/2010-09/wp-sns-share_add_tinyurl.html</link>
		<comments>http://blog.11034.org/2010-09/wp-sns-share_add_tinyurl.html#comments</comments>
		<pubDate>Wed, 29 Sep 2010 14:58:41 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[wp-sns-share]]></category>

		<guid isPermaLink="false">http://blog.stariy.info/?p=441</guid>
		<description><![CDATA[最近断断续续看了一些常用的插件的源码，对wordpress插件开发掌握又多了一些，很早就琢磨着更新一下wp-s [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>最近断断续续看了一些常用的插件的源码，对wordpress插件开发掌握又多了一些，很早就琢磨着更新一下wp-sns-share了。今天公司一点事也没有，无聊逛twitter的时候，看到好多人分享的链接都是http://tinyurl.com/<br />
<h3></h3>
<p>这样的，研究了一下，原来是tinyurl.com推出的一项服务，将本来很长的url转化为短url，有点意思。其实很早就发现了，貌似delicious也有类似功能，不过一直没怎么注意。心血来潮，今天直接就把插件更新了，添加了tinyurl的功能。<span id="more-441"></span></p>
<p>tinyurl.com也支持用代码调API来生成url，网上只搜到PHP的，那最好不过了，代码很简单，就一行</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tiny</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://tinyurl.com/api-create.php?url='</span><span style="color: #339933;">.</span><span style="color: #000088;">$postURL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>使用tinyurl服务，要调它的API，很显然访问速度会慢一点，在localhost就特别明显，放在服务器上好像感觉不太出来，可能是因为本来就是美国的服务器，互相调速度比较快吧。同时，这次插件用户体验做的更好一些，允许用户选择是否启用tinyurl服务，默认不开启，毕竟会玩这个东西的人是少数吧~</p>
<p>不过比较郁闷的一点，人人网、QQ空间、百度空间的分享都不支持tinyurl，人人说分享带非法内容，QQ空间说URL不合法，百度说标题不合法，一个比一个乱来，可恶。豆瓣、新浪博客、twitter都是可以的，facebook待明天上班去公司翻墙测试。</p>
<p>此次插件更新，还多了是否自动输出分享栏的功能，默认选上auto就和原来一样，用 add_filter(&#8216;the_content&#8217;,function)来把内容添加进去，如果选manual，就需要自己将新加入的 wp_sns_share()函数放入主题文件中，这样可控性比较强，也可以自己调整css。</p>
<p>经过此次插件开发经历，发现wordpress插件开发用OO思想建立一个class并不是一个好的选择，命名空间独立这个问题完全可以用函数前缀来实现。</p>
<p>插件下载地址：<a title="http://wordpress.org/extend/plugins/wp-sns-share/" href="http://wordpress.org/extend/plugins/wp-sns-share/" target="_blank">http://wordpress.org/extend/plugins/wp-sns-share/</a> 明天把代码更新上去</p>
<h4  class="related_post_title">看看 oop , wp-sns-share</h4><ul class="related_post"><li>2014-07-07 -- <a target="_blank" href="http://blog.11034.org/2014-07/ruby_on_rails.html" title="ruby on rails">ruby on rails</a></li><li>2013-12-05 -- <a target="_blank" href="http://blog.11034.org/2013-12/wp-sns-share_2-8.html" title="wp_sns_share更新至2.8，添加小功能">wp_sns_share更新至2.8，添加小功能</a></li><li>2012-12-06 -- <a target="_blank" href="http://blog.11034.org/2012-12/ac_automachine.html" title="一个OOP的AC自动机代码">一个OOP的AC自动机代码</a></li><li>2012-08-29 -- <a target="_blank" href="http://blog.11034.org/2012-08/wp-sns-share_2-6.html" title="wp_sns_share更新至2.6，增加图片同步">wp_sns_share更新至2.6，增加图片同步</a></li><li>2012-07-19 -- <a target="_blank" href="http://blog.11034.org/2012-07/sina_api_oauth_2.html" title="wp_sns_share更新至新浪API2.0，实现图片同步">wp_sns_share更新至新浪API2.0，实现图片同步</a></li></ul><h4 class="related_post_title">看看 Wordpress </h4><ul class="related_post"><li>2014-03-12 -- <a target="_blank" href="http://blog.11034.org/2014-03/new_url_to_template.html" title="wordpress改源码实现自定义URL到自定义页面">wordpress改源码实现自定义URL到自定义页面</a></li><li>2013-12-05 -- <a target="_blank" href="http://blog.11034.org/2013-12/wp-sns-share_2-8.html" title="wp_sns_share更新至2.8，添加小功能">wp_sns_share更新至2.8，添加小功能</a></li><li>2013-02-14 -- <a target="_blank" href="http://blog.11034.org/2013-02/wp_zjuem_in_wordpress.html" title="wp-zjuem，zju cc98表情系统 in wordpress">wp-zjuem，zju cc98表情系统 in wordpress</a></li><li>2012-09-26 -- <a target="_blank" href="http://blog.11034.org/2012-09/wordpress_post_actions.html" title="wordpress发布文章时的Action事件">wordpress发布文章时的Action事件</a></li><li>2012-08-29 -- <a target="_blank" href="http://blog.11034.org/2012-08/wp-sns-share_2-6.html" title="wp_sns_share更新至2.6，增加图片同步">wp_sns_share更新至2.6，增加图片同步</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2010-09/wp-sns-share_add_tinyurl.html/feed</wfw:commentRss>
		<slash:comments>54</slash:comments>
		</item>
	</channel>
</rss>
