-
个人简介:
PHP开发者,高可用性、分布式集群实践者,伪Python、GAE开发者,伪Linux系统管理员,伪MySQL管理员
2009年8月至今服务于阿里巴巴云计算公司
2008年8月至2009年7月31日服务于博客大巴
-
归档
- 2012 年一月
- 2011 年十一月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年四月
-
杂项
标签归档:PhpWind
类设计
最近几乎天天加班,周末依然加班,好久没有更新博客了,非常累。不过此累非彼类。 在现有的很多面向过程开发的代码中,对我这个涉世不深的玩家来说,简直就是灾难,或许很多代码连面向过程都算不上,连函数都没有包装。一个函数可能会超过500行代码,语义不名,名称更不名。我曾经试图改造这些代码,并非技术上不可行,而是实现需要太多的时间,一个不可能完成的任务。 让一个缺乏面向对象的团队掌握面向对象很困难的,也许是我智商低,当年我花了两个月才能意会什么是对象,什么是面向对象编程,到现在也不会言传。 如果不能转向到面向对象,那么我们先转成类吧,或许技术上更能解决一点。类的最基本功能就是封装,如果我们撇去面向对象的东西,那么类就是把具有相似性的东西做一个集合,外部在使用这些功能的时候不需要知道具体实现,只要给类中的方法确需要的参数值,如果非要理解成一堆具有相似属性函数的集合,那也是可以的,毕竟这个比一个文件中的几千行代码,连个function都没有的代码好得多。 如果我们想得到更好的类,需要遵循一些基本的原则, 其中之一就是类应该短小,短小并不是说不完整,这和很多人学C的时候,老师告诉我们,函数要尽可能短小一样,到底多短小的类算是合适呢?我觉得根本无法用代码行数来描述,这取决于这个类所完成的功能,比如你要封装一个操作文章的类,那么至少需要,增删改查四个函数,也许还有基于这四个函数的别名和封装,以及必要的公共属性。 第二个重要原则就是单一权责(SRP),这个原则要做到非常 不容易,因为比第一条更难衡量,一般认为,衡量单一权责的标准是:类或者模块应该有且只有一条加以修改的理由。SRP实际上能给出控制类长度的指导方针。简单的理解就是一个类只有一个功能,假如你修改博客标题或者设置的时候,都要改动文章类,显然违背了单一权责的原则。 第三个原则–内聚。类应该只有少量实体变量。类中的每个方法都应该操作一个或者多个这种变量。通常而言,方法操作的变量越多,就越内聚到类上,如果一个类中的米一个变量都被每个方法所使用,则该类具有最大的内聚性。通常,创建一个这样极大化的内聚类是非常不容易的,也是不可取的,因为类的内聚性过高也就意味着类中的方法和变量相互依赖,互相结合成一个逻辑的整体,当修改类中的变量或者方法时,可能影响或者需要修改其他的方法或者属性。一般认为,类的内聚应该保持在较高的位置,但不是最高的位置,这样有利于降低维护成本。 前面提到在我目前的项目中,我碰到很多超过500行代码的函数,假如把数字降低到300,那么符合标准的函数将会增加十倍以上,在一个面向对象的团队中,一个单纯函数或者方法超过100行几乎都是不可接受的,因为这意味着这个函数可能包含过多的权责。其实我们如果真的遵循类的内聚和单一权责的原则,就会导致很多短小的类的产生。 一般程序员在拆解过大的函数的时候实际上就是将原来的代码复制出来,放到新建的函数中去,然后把需要的参数传递过去,实际上导致超大函数的产生的动机常常是因为有很多变量在这个函数的中被使用到,看似这个函数似乎是一个整体,因为拆分会导致新建的函数参数很多。为啥他们不想用一下类呢,假如拆解函数导致需要传递很多的参数,那么这个函数其实就是一个类,需要传递的函数需要提升为实体变量,这样就可以将函数拆成很小的小块,这样看起来似乎丧失了内聚性,因为堆积了越来越多的只为允许少量函数共享而存在的实体变量。如果这些函数想要公司向某些变量,为什么不让它拥有自己的类呢?当类丧失了内聚性,就应该拆了它。所以,将大的函数拆分为小函数,旺旺也是将类拆分为多个小类的时机,程序会更加有组织,更为透明的结构。 实际上很多时候,当你完成所有的功能的时候,产品经理会跑过来跟你说,我们不能把这个功能改成这样,这样用户体验更好,很可能你需要改动很多的代码很逻辑,甚至数据结构,所以如果我们能在设计的类的时候,注意一下可能的需求改动,我们可以借助接口或者抽象类来隔离修改细节对原来代码产生的破坏性更改。
找人,招人~~
最近工作一直很忙,好久没更新博客了,大脑有点呆滞,不如给年底想换工作的朋友多一个选择吧 基于公司业务的急速腾飞和对人才储备的需求,最主要的是不差钱的原因,现在正在岁末疯狂招人中,只要你觉得自己合适,不妨投个简历试试,负责招聘的同学还是很热情的,前面说了,不差钱,并不表示我们富得流油,我们会根据您的技能和专长,给予富有竞争力的薪酬,如果您想年薪二十万,我觉得我们可以单独商量,因为公司业务的扩张,劳累在所难免,因此我们需要您有健康的身体和心理,当然偶尔身体不适也是正常的,我们提供完善的医疗和福利保障,刷了您的医保卡之后还能从商业保险那里得到一部分赔偿,这是我们福利的一部分。餐补,为加班同学提供免费的晚餐和加班打车报销之类的自然是必不可少的。更多福利和详细薪酬体系,请见我们HR,呵呵, 公司网站:phpwind 我们对以下职位有需求: 一、高级商务专员(1人) 工作地点: 杭州 职位描述: 1. 负责进行合作洽谈 2.线上线下推广活动策划 职位要求: 1. 大专或以上学历,相关专业毕业;有一定英文听说能力者优先 2. 三年以上互联网企业市场推广经验,熟悉主要线上线下媒体传播渠道 3. 对phpwind有一定的认识,对站长文化有敏锐嗅觉,从而产生独到有效的传播创意 4. 具有较强的执行能力,能独立运作线上线下推广的各个环节 5. 良好的人际关系,出色的沟通技巧 6. 吃苦耐劳,拥有强烈的上进心,热爱phpwind团队文化 二、高级PHP工程师(5人) 工作地点: 杭州 职位描述: 1. 负责产品的研发工作; 2. 负责产品产品架构设计; 3. 负责产品数据库设计; 4. 负责产品前后台功能模块开发。 职位要求: 1. 大专或以上学历,相关专业毕业优先; 2. … 继续阅读
正则表达式匹配中文符号(GBK编码)
事实证明,网上的很多东西都是扯淡,不过原理还是有的,我碰到一个需求,给定一段文字中(GBK编码),去除所有符号,不相干符号,包括标点,日文片假名之类的,于是我在网上搜啊,搜啊,得到的结果要么就是错的,要么就根本好不相干,被抄袭得最厉害的是http://community.mybbchina.net/thread-212-post-507.html,可怜的作者,我也不知道这些人为什么抄这个,我就没测试成功过,连GBK的字符集区间都没弄清楚。 其实指定字符编码匹配中文很简单,GBK编码表中很明确的规定了所有的符号位置,而且刚好是一个区间,在维基百科上有详细的介绍,比如我要把类似 addd中华ds,#¥%…&((212))}}A■g民国ds中-啊国fjsd,【】啊Y 这样的字符串中所有非中文、英文、数字字符全部去除掉,姑且叫去除的字符为火星文,去除火星文的PHP写法为: preg_replace("/([\xA1-\xA9].{1}?)*?/", "", $str); 这样所有在全角状态下输入的非中文,英文和数字将被替换掉,如果还需要进一步处理英文状态下的,那就判断一下ASCII码值吧,或者你怕麻烦也可以把所有的都列出来,然后替换,可以参考下面,在网上找来的,非我写的,忘了出处了 /** * 清除所有常见标点符号 * @param $pointer * @return unknown_type */ function clear_point($pointer) { return str_replace ( array(’ ‘,"~","!","@","#","$","%","^","&","*",",",".","?",";",":","’",’"’," [", "]","{","}","!"," ¥","……","…","、",",","。","?",";",":","‘","“","”", "’"," 【","】","~","!","@","#","$","%","^","&","*",",","."," <", ">",";",":","'",""","[","]","{","}","/","\","《","》","-","_"), array(”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”, ”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”,”, ”,”,”,”,”,”,”,”,”,”,”,”,”,”), $pointer ); } … 继续阅读
论坛程序设计的思考
新入公司,项目被老同志分的七七八八,系统还没有足够的熟悉,暂时清闲了几天,看了几天的代码,有面向对象的,更多的是面向过程的,这篇博文的title值得商榷的,反正我不知道该取什么名字,姑且唬人一下。 1)设计目标,任何软件都需要一个设计目标,比如目标用户,并发数等等,论坛这个东西实时性很强,同时在线人数一般不高,如果很高的话一般会自己做,或者请公司定制开发或优化。撑死了几千人同时在线,很多论坛的设计目标就是没有目标,看到好的功能和界面,拿过来,改改,堆上去,完事 2)模块划分,市面上的几个论坛软件大多还是沿用了N多年前的架构,面向过程,而且过程不清晰,虽然在用户后台看上去好像各个功能挺独立的,看看代码就知道,里面定义了一堆全局变量,更奇怪的是没有注释,还有好几个是没用的,代码重复率非常高,require来include去,绕啊,绕啊,我就晕了~~,功能模块都没能独立,更没法谈耦合和内聚了~ 3)数据库设计,这个挺有意思的,曾经“有幸”阅读过discuz不知道几点几版本的代码,里面的SQL写得令人毛骨悚然,不得不佩服写这个SQL语句程序员的数据库造诣之深,反正我是没写过,也写不出来,我的原则是,能一次查询的不做两次查,能不用jion的就坚决不用,discuz的表有上百个之多,phpwind更是超过150个,且有不断增加之趋势,清一色使用mysql,而且还是用的MYISAM引擎,好吧,1000个并发的时候,discuz 7是挂掉了,phpwind没测试过,暂时不评论。数据表设计时冗余是必要的,不一定非要遵循范式规则,过度随意就成了灾难,我看到数据库中居然有q1,q2,q3一直到q21这样的字段,通通都是int型的,而且绝大部分都是空的,浪费空间之严重令人非常惊讶,且不说这个命名十分之不友好,这个东西能这样做的么,假如真的需要21个同样类型的q这种东西,为啥不再分一张表,然后给个ID连接一下不就好了么,这仅仅是一个例子,N张表都能找到这样的例子。用户表是论坛的核心表之一,论坛有积分啊,签名啊,生日啊,等级啊,权限啊之类之类的,用户属性自然是多之又多,可是再多也不能全放一个表里,一个表里有六七十个属性,这像话么!!绝大部分属性普通用户都是空的,又是一个“占着茅坑不拉屎”的表设计,大部分用户注册时能不填的肯定不会填,就那么昵称啊,email啊,密码啊几个字段需要insert,至于牵动六七十个属性同时更改一遍么,myisam引擎insert是加的是表级锁的啊,郁闷,纵向拆分这张表! 4)错误处理,出错了,前面加个@好了,让别人都看不到就不会有什么问题了,嗯,这个似乎是可以防止因为出错信息而泄漏一些东西,可是总得让自己知道怎么回事啊,不然怎么解决呢,还好都有官方论坛可以去问,大多数时候管理员也不知道用户出了什么问题,只能靠猜,为什么不记录一个log呢?! 5)不想说了~~先把前面的改了再说……