设计模式原则

程序猿始终不够 2012-05-16 新浪微博:http://weibo.com/ybchrist   1、“开放-关闭“原则:对修改关闭,对扩展开放 对修改关闭,即原则上我们禁止对已经写好并经过测试,或者已经使用的类进行修改。对于需                  求的变化,我们采用扩展的方式对代码进行扩充,而非修改其中的类。 对扩展开放:即允许对已经写好的类进行继承,或者作为部分对象组合成整体对象(组合关系)。 意义:“开放-关闭“原则是面向对象思想的核心,遵守该原则,代码将具有较高的可扩展性和较低耦合。   2、依赖倒转原则:抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对实现编程。传递参数,或者在组合聚合关系中,尽量引用层次高的类。 简单的说,就是针对接口编程,而非针对实现的细节问题编程。我们开发软件时,会首先对软件的结构进行分析,之后抽象出高层接口,再层层细化,制定接口规则,再考虑细节实现。   3、里氏代换原则:任何基类可以出现的地方,子类一定可以出现 初看这个原则,似乎很好理解。而实际上,这个原则我们要探究下。 以下引自百度百科: 为了说明,我们先用第一种方法来看一个例子,第二种办法在另外一个原则中说明。我们就看那个著名的长方形和正方形的例子。对于长方形的类,如果它的长宽相等,那么它就是一个正方形,因此,长方形类的对象中有一些正方形的对象。对于一个正方形的类,它的方法有个setSide和getSide,它不是长方形的子类,和长方形也不会符合LSP。   eg:   长方形类:   public class Rectangle{   …   setWidth(int width){   this.width=width;   }   setHeight(int height){   this.height=height   }   }   正方形类:   public class Square{   …   setWidth(int width){   this.width=width;   this. height=width;   }   setHeight(int height){   this.setWidth(height);   }   }   例子中改变边长的函数:   public void resize(Rectangle r){   while(r.getHeight()<=r.getWidth){   r.setHeight(r.getWidth+1);
Continue reading 设计模式原则

使用Include函数的返回值

記得以前在thinkphp中看到一種寫法,一個文件中只有一條return語句,而return的內容是一個數組例如下面代碼: [php] view plaincopy included.php return array(1,2,3,4,5); 當時我猜想其應該是把這個數組當做include函數的返回值。經過測試果然如此,看如下調用代碼: [php] view plaincopy include.php 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 用途: 1、我們可以將配置文件寫成這樣,當我們需要其中配置數據時,只需調用include函數即可獲得其配置參數。 2、我們可以同過Php對其本身進行修改,達到修改配置文件的作用。 本文允许转载,转载请保源地址:http://huyanping.sinaapp.com/?p=64 原创文章,转载请注明: 转载自始终不够 本文链接地址: 使用Include函数的返回值

android SDK4.0源代码下载

android SDK4.0源代码下载

下面是方法哈~ 1. 下载安装 msysgit    http://code.google.com/p/msysgit/downloads/list    下载后, 安装, 一路next下去, 用默认配置 2. 安装完成后, 双击GitBash图标    mkdir android_4.0    cd android_4.0 3. 克隆sdk 远程仓库    git clone http://android.googlesource.com/platform/frameworks/base.git 这样就开始下载源代码了。。。需要等上一阵子。 这样就完成了源代码的下载。 打开eclipse,按住ctrl单击一个属于SDK的类名(随便一个都可以),在弹出的窗口中单击那个唯一的按钮,在弹出对话框中选择源代码的压缩包。导入即可。 本文允许转载,转载请保留源地址:http://huyanping.sinaapp.com/?p=73 原创文章,转载请注明: 转载自始终不够 本文链接地址: android SDK4.0源代码下载

单件模式详解:懒汉式与饿汉式

废话少说,先列出代码(java) class Instance{} //懒汉式 class LSingle{ private static Instance _instance = null; private LSingle(){} public static Instance getInstance(){ if(_instance==null){ synchronized(LSingle.class){ _instance = new Instance(); } } return _instance; } } //饿汉式 class ESingle{ private static Instance _instance = new Instance(); private ESingle(){} public static Instance getInstance(){ return _instance; } } 单件模式用途: 单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用。 单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例。它的用途十分广泛,打个比方,我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的链接。这是个简单的方法,在不考虑并发的时候这也是个不错的选择。但实际上,一个网站是并发的,并且有可能是存在大量并发操作的。如果我们对每次写入都创建一个数据库连接,那么很容易的系统会出现瓶颈,系统的精力将会很多的放在维护链接上而非直接查询操作上。这显然是不可取的。 如果我们能够保证系统中自始至终只有唯一一个数据库连接对象,显然我们会节省很多内存开销和cpu利用率。这就是单件模式的用途。当然单件模式不仅仅只用于这样的情况。在《设计模式:可复用面向对象软件的基础》一书中对单件模式的适用性有如下描述: 1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
Continue reading 单件模式详解:懒汉式与饿汉式

Android开发平台搭建完全指南

Android开发平台搭建完全指南

2012-2-17     新浪微博:http://weibo.com/ybchrist 程序猿始终不够 如有转载,请注明原作者 文档编写目的:使读者了解安卓开发平台,并系统的掌握其搭建技巧。 我采用的操作系统是windows 2003、xp,并做了测试,根据本文档可以正确地配置Android开发平台。 搭建该平台所需要准备的文件: SDK(Software Development Kit, 即软件开发工具包)一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。 下载地址:http://developer.android.com/sdk/index.html 如图: JAVA 虚拟机(JDK) 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 如图: Eclipse android官方网站建议使用Eclipse classic版本 下载地址:http://www.eclipse.org/downloads/ 如图: 准备好了这些文件,我们开始搭建自己的第一个android开发平台 第一步,安装JAVA虚拟机JDK,该软件的安装简单,在这里不再累赘,只需按提示进行安装即可。有些让人会问为什么要安装JDK,在这里做简要回答。由于android开发是使用JAVA,所以必须有JDK支持,另外我们下面将要用到的Eclipse也需要有JDK虚拟机才可以运行。 第二步,安装SDK,该软件的安装步骤也不在此多做说明,各位读者请根据提示自行安装。安装过后会弹出一个窗口,在这个窗口中我们可以选择我们会用到的开发包(android虚拟操作系统及类库)这时建议大家先关掉它,在后面的部分会进一步说明.如图所示: 第三步,安装Eclipseclassic,该软件下载下来后可以直接使用,建议发送一个快捷方式到桌面,这样方便点。 第四步,安装Eclipse的ADT插件,在这里解释下ADT的概念:目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升级或者变更,简单理解为在Eclipse下开发工具的升级下载工具。简单的说,安装了这个插件之后,我们在新建项目的时候会有一个android项目可以选择,其他的为Eclipse默认选项。首先我们打开Eclipse,关掉提示页,然后选择file>new>project如图所示: 安装方法十分简单,Eclipse已经为我们提供了自动化的安装方法,我们只需提供给它一个ADT的安装地址即可,安装地址为:https://dl-ssl.google.com/android/eclipse/ 具体安装方法如下: 1.  点击help->install new software… 如图所示: 2.  单击弹出窗口的work with文本框后的Add按钮,在弹出的对话框中的Location文本框中输入上述ADT地址,然后等待程序需找该地值。由于我已经搭建好了该平台,所以程序会提示我这是个重复的地址,即图中红色标志的提示,读者可以不必理会。如图所示: 3.  待程序寻址完毕后,点击next直至安装完成。 经过以上步骤,我们已经搭建好了基本的开发工具,但仍然不能进行android的开发,在此之前我们必须SDK。 4.  单击 Window > Android SDK Manager,在弹出的对话框中选择你要使用的android操作系统版本,以及其基本工具,然后单击右下角的install packages…在此说一点,由于谷歌更新android系统很快,所以市面上以及网络上的资料大多是android2.*版本的,建议安装一个2.3以及最新版本即可。这里有一点要说明下,SDK Manager就是刚才我们安装SDK后弹出的窗口,这里我们看到已经嵌入到Eclipse里面一个按钮。如下图所示: 5.  等待程序下载安装包,如果你下载了很多版本的话,可能会花上一点时间。待程序下载安装完毕后,即可开始我们的第一个helloAndroid程序,当然,我们要有一些JAVA基础才可以。 下面开始我们的第一个程序,helloAndroid…这里我们选择的android操作系统是手机操作系统,并非平板电脑操作系统,这点请大家注意。 以上安装完成后,大家会有一个疑问,我们在哪里写代码呢?android操做系统的界面在哪里呢?请不要着急,且听我一一道来。 第一步,我们要配置一个android虚拟操作系统,这样我们的PC才可以真正模仿android操作系统运行。操作步骤如下: 1.  单击window>AVD Manager,在弹出窗口中单击new,并对android虚拟操作系统进行配置,如下图所示:   Name:虚拟系统名称
Continue reading Android开发平台搭建完全指南

开发一个类的流程

本人近日根据自己的开发经验总结了一个类的开发流程。这个流程适用于单独开发的构件,并不适用于对一个项目中的系统对象开发。开发出的类可以存入私人类库,供以后复用。   以下是开发流程: 1. 明确类的功能,抽象出类的大概结构 2. 初步设想类的接口 3. 类名设计(驼峰式命名) 4. 属性设置(权限设置) 判断某些变量是否有必要作为成员属性,应注意,属性越多,其构造函数也回相应地更加复杂,但变量作为属性同样可以简化类的接口。 5. 设计接口成员函数 6. 设计辅助成员函数,简化接口成员函数,可以考虑设置为私有成员函数 7. 创建类模型,添加成员属性,添加成员函数,添加注释 8. 实现成员方法,如果遇到问题重复4-8 9. 反复测试,保证该类的严格的正确性 10.组织该类的UML图,规约等文档资料及代码文件到私人类库统一管理 本文允许转载,转载请保留源地址:http://huyanping.sinaapp.com/?p=79 原创文章,转载请注明: 转载自始终不够 本文链接地址: 开发一个类的流程

CSV是什么文件格式

CSV即Comma Separate Values,这种文件格式经常用来作为不同程序之间的数据交互的格式。 具体文件格式 每条记录占一行 以逗号为分隔符 逗号前后的空格会被忽略 字段中包含有逗号,该字段必须用双引号括起来 字段中包含有换行符,该字段必须用双引号括起来 字段前后包含有空格,该字段必须用双引号括起来 字段中的双引号用两个双引号表示 字段中如果有双引号,该字段必须用双引号括起来 第一条记录,可以是字段名     CSV其实就是COMMA SEPARATED VALUE的缩写,出现在档案总管中的档案类型是「逗号分格」,依计算机原来的设定,如果直接点选该档案,计算机将以EXCEL的模式开启该档案。但建议您千万不要这么做,因为CSV档如果以EXCEL开启,由于计算机档案数据转换的原因,会将其CRC之数值改做科学记号方式储存,而造成档案中的 CRC值发生错误。这也是笔者初出茅庐时所得到的惨痛经验,但如果想一窥CSV档的真实面貌,笔者建议您使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。开启后的CSV档包含了四或五个字段(部分),由左至右分别记载着:文件名称(XXXX.JPG)、档案大小(以BYTE为单位)、CRC32值(八个英文字母或数字组成)、档案路径(档案储存的子目录名称)和档案内容描述(一般来说都是明星的英文姓名甚或是专辑名称,也可能空白)。而其中第四栏「档案路径」因为每个人储存整理图档的方式不同,所以本栏通常不存在,而一般有含有「档案路径」这栏的CSV档,又称为ECSV档案     CSV” 是逗号分隔文件 (Comma Separated Values) 的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件。在 CSV 文件中,数据“栏”以逗号分隔,可允许程序通过读取文件为数据重新创建正确的栏结构,并在每次遇到逗号时开始新的一栏。 创建 CSV 文件有许多方法。最常用的方法是用电子表格程序,如 Microsoft Excel。在 Microsoft Excel 中,选择“文件”>“另存为”,然后在“文件类型”下拉选择框中选择 ”CSV (逗号分隔) (*.csv)”。 csv格式(即文件后缀为.csv,属于用excel软件可编辑的逗号分隔的一种文件格式)。   xls 文件就是Microsoft excel电子表格的文件格式。我想就不用多介绍了吧,学校里多少都学过的。 CSV是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中。此文件,一行即为数据表的一行。生成数据表字段用半角逗号隔开。 CSV是文本文件,用记事本就能打开,XLS是二进制的文件只有用EXCEL才能打 CSV(以逗号分隔) CSV (*.csv) 文件格式只能保存活动工作表中的单元格所显示的文本和数值。工作表中所有的数据行和字符都将保存。数据列以逗号分隔,每一行数据都以回车符结束。如果单元格中包含逗号,则该单元格中的内容以双引号引起。 如果单元格显示的是公式而不是数值,该公式将转换为文本方式。所有格式、图形、对象和工作表的其他内容将全部丢失。欧元符号将转换为问号。 文本文件的内容有ASCII字符集中的字符组成 首先:文本文件和二进制文件是有区别的,对于文本文件来说,每个字节(或每几个字节)的意义相同,你只要一个一个字节的读出来就OK了;而对于二进制文件来说,可能有4个字节保存了一个整形,接下去有4个字节保存了一个浮点型等等……所以要想打开二进制文件需要了解它的文件格式。 要想知道文件格式,你可以用16进制编辑器打开一个二进制文件,然后猜测它的格式。 本文允许转载,转载请保留源地址: http://huyanping.sinaapp.com/?p=83 原创文章,转载请注明: 转载自始终不够 本文链接地址: CSV是什么文件格式

使用PHP进行HTTP认证

我们在登录某些安全性较高的网站时,有时候可能会遇到这种情况:直接在网页上 弹出一个windows窗口,要求输入认证的用户名和密码,只有认证登录成功才能看到内 容,否则的话则连该页面都无法打开,这是一种HTTP认证的的方式,它大大加强了系统 的保密性和安全性,那这是如何实现的呢,下面我就简要向大家介绍一下. 利用PHP来实现HTTP的强制认证是十分简单的,只需简单的几行代码就可以实现,下面 我们来看一个例子,然后结合这里例子我向大家详细介绍一下PHP实现HTTP认证. <?php if(!isset($_SERVER[‘PHP_AUTH_USER’])) { header(‘WWW-Authenticate: Basic realm=”系统名称”‘); header(‘HTTP/1.0 401 Unauthorized’); echo ‘未通过HTTP认证.’; exit; } else { echo ‘认证通过.’; echo ‘用户名: ‘.$_SERVER[‘PHP_AUTH_USER’].”/n”; echo ‘密码: ‘.$_SERVER[‘PHP_AUTH_PW’].”/n”; } ?> 1.实现说明 怎么样,看到上面的代码了吧,就这么几行添加到你的程序页面上就可以实现了. 它是通过利用header()函数向客户端浏览器发送”Authentication Required”信息,强制其弹出一个用户名/密码输入窗口,当用户输入用户名和密码后,包含有URL的PHP脚本将会加上预定义变量PHP_AUTH_USER, PHP_AUTH_PW和AUTH_TYPE然后再次调用,这三个变量分别表示用户名,密码和认证类型(从PHP5.0.1起开始支持”Basic”和”Digest”两种认证方式),它们被保存在$_SERVER(从HP>>4.1.0起有效)或$HTTP_SERVER_VARS(从PHP3起有效)数组中具体应用时,我们可以把验证的几行代码写成函数,只要判断到用户变量不存在或验证不正确就一直执行该函数并弹出窗口,而且还可以设置错误登录几次就不允许该用户访问,具体的使用大家使劲的发散思考吧. 2.注意事项: 我们在使用PHP实现HTTP认证机制时还有几点问题我们是需要注意的: 1.这段代码必须放到程序的开始,且在其开始执行之前不能有任何输出(若有输出则 需要使用输出缓冲函数才行). 2.PHP的HTTP认证机制仅在PHP以Apache模块方式运行时才有效,这个容易理解,它本身是HTTP强制认证,肯定是不适合于CGI版本,不能在命令行下执行的. 3.header发送标头代码时请小心.为了对所有的客户端保证兼容性,关键字”Basic”的第一个字母必须大写为”B”,分界字符串必须用双引号引用(不能是单引号);在HTTP/1.0和401之间必须有且仅有一个空格. 4.在上面列子中,仅输出了用户名和密码,而在实际系统中则可按照登录验证流程进行与数据库或其他方式进行判断和验证. 5.从PHP4.3.0起,为防止有人通过编写脚本来从页面上获取密码,当外部认证对特定页面有效,并且安全模式被开启时,PHP_AUTH变量将不会被设置.可以用REMOTE_USER来辨别外部认证的用户,用AuthType指令来判断外部认证机制是否有效. 6.要想让HTTP认证能够在IIS下工作,PHP配置选项cgi.rfc2616_headers必须设置为0(默认值). 本文允许转载,转载请保留源地址: http://huyanping.sinaapp.com/?p=85 原创文章,转载请注明: 转载自始终不够 本文链接地址: 使用PHP进行HTTP认证

MYSQL ERRNO:#1005 – Can’t create table ‘./my_news_release_system/user.frm’ (errno: 150)原因总结

#1005 – Can’t create table ‘./my_news_release_system/user.frm’ (errno: 150)   MySQL Error Number 1005 Can’t create table ‘XX.frm’ (errno: 150) 默认分类 2010-04-28 16:04:41 阅读364 评论0   字号:大中小 订阅 烦了我一下午  终于解决了  在这里分享下  一篇彻底解析这个错误的文章。 当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的。像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经被报告是一个mysql本身的bug并出现在mysql 开发者列表当中很多年了,然而这似乎又是一种误导。   在很多实例中,这种错误的发生都是因为mysql一直以来都不能很好的支持的关系的问题, 更不幸的是它也并没有指明到底是哪一个问题会导致上面那种错误,下面我把导致这个可怕 的150错误的常见原因列出来了,并且我以可能性的大小作了排序   已知的原因:   1, 两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是 TINYINT. 你得使用 SHOW 命令来查看字段的大小,因为一些查询浏览器有时候把 int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为 SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配,更多关于signed 和 unsigned 的信息,请参阅:http://www.verysimple.com/blog/?p=57   2, 你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中一个不是primary key 的放,你必须为它创建一个索引。   3, 外键的名字是一个已经存在的一个键值了,这个时候,你应该检查你的数据库以确保外健名字是唯一的,或者你在键名后面加上几个随机的字符以测试是否是这个原因。   4, 其中一个或者两个表是MyISAM引擎的表,若想要使用外键约束,必须是InnoDB引擎,(实际上,如果两个表都是MyISAM 引擎的,这个错误根本不会发生,但也不会产生外键),你可以通过查询浏览器来设置表的引擎类型   5, 你可能设置了ON DELETE SET NULL, 但是相关的键的字段又设置成了NOTS NULL 值。你可能通过修改cascade 的属性值或者把字段属性设置成 allow null 来搞定这个bug.   6, 请确定你的Charset 和 Collate 选项在表级和字段级上的一致   7, 你可能设置为外键设置了一个默认值,如 default=0   8, 在这个关系里面,其中的一个字段是一个混合键值中的一个,它没有自己独立的索引,这时,你必须为它创建一个独立的索引。   9, ALTER 声明中有语法错误 我的错误,SQL和MYSQL语法差别 SQL:
Continue reading MYSQL ERRNO:#1005 – Can’t create table ‘./my_news_release_system/user.frm’ (errno: 150)原因总结

C++经验(个人见解)

1.  定义变量的小习惯: 定义变量时要养成初始化的好习惯,尤其是对指针变量。初始化时尽量用变量后加括号的形式进行初始化。这与用“=”进行初始化有细微的区别。用“=”进行初始化时,系统默认调用的是拷贝构造函数,而在变量后面加上括号的形式进行初始化时,系统默认调用的构造函数。对于C++基本数据类型来说,这并无大的区别,然而对于对象来说却有可能达不到我们想要的效果。 例: int  x = 0;   拷贝式初始化 int  x(0);    构造式初始化 虽然这个细节对于编程来说无伤大雅,但对于一个优秀的程序员来说,养成一个良好的编程习惯是必须的。参考文献(C++primer)。 2.  多返回值情况: 个人总结出两种让函数有多返回值的方法。第一种即为函数返回值为数组或向量,或其他类似结构,都可实现多返回值。第二种则为设置引用参数,这点位本人个人观点,可能表达上有些错误,敬请见谅;详细的说就是利用引用参数而代替函数的返回值,当我们需要一个函数返回一个布尔类型的值并且需要函数对某些数据进行修改时,这种方法很有用处;或许这不能说是函数多返回值,只是个人觉得这样理解比较好懂。 3.  利用多个布尔类型以及整形的乘积的和判断事件发生情况: 打个比方,求一个数被3,5,7整除的情况,要求一次性输出结果。则可以判断是否能被3,5,7整除并将返回的布尔数与1,2,3相乘,再相加,每种不同的情况将有不同的结果,这时我们则可以采用SWITCH语句进行简单的判断即可达到一次性输出的目的。 4.  养成使用内联函数的习惯: 内联函数是C++对于C的宏定义的替代品,对于用inline生命的函数,编译器将尝试将函数编译到函数被调用的地方,从而省去了函数调用的麻烦。Inline函数要求不可以有复杂的控制结构,循环等都是不允许出现在内联函数中的。换一种说法就是,如果函数中有过于复杂的控制结构,编译器将放弃对其内联的尝试。关键字inline对于编译器来说只是一种建议,而编译器是可以不去执行的。在类中我们可以把一些常用到的数量不多的代码分离出来定义成内联函数,从而减轻我们编程的复杂度。 5.  指针的威胁: 有人说指针是安全隐患的罪魁或有,也有人说妙就秒在指针。对于这两种说法,我个人更偏向于后一种。指针是有着强大功能的数据类型,虽然因为它而产生了好多安全隐患,但作为程序员我们应该学会如何去避免这些问题的产生。 当我们定义一个指针变量时,我们应尽可能的将其进行初始化。这一点在第一点中已经强调。对于为初始化的指针我们成为野指针,野指针对于程序来说是相当危险的,如果我们尝试去使用一个野指针,或删除野指针所指向的内存空间时,都会发生严重的错误而导致程序停止运行或者其他严重的后果。 当我们释放掉一个动态申请的指针时,也应将指针值置为NULL(或为0),这样我们就无法对其进行操作了。 当我们用两个或多个指针指向同一块动态申请的内存空间时,应小心多次对同一片内存空间进行删除。从程序的用户的角度来讲,发生这种情况时计算机会产生蓝屏的现象并将出现错误的地址显示在屏幕上。避免这种情况有两种方法:第一,删除动态存储空间后将其他指针置空;第二,删除动态存储空间后将其他指针指向其他内存空间。 总之我们应该让指针的指向在我们的把握之中才是解决指针威胁的最终方法。 例: int *x=new int(); Int *y=new int(); Int *p=x; Delete x; P=NULL;        //或p=y;   有一些是个人总结出来的,可能有一些理解上的问题,敬请见谅。 本文允许转载,转载请保留源地址:http://huyanping.sinaapp.com/?p=89 原创文章,转载请注明: 转载自始终不够 本文链接地址: C++经验(个人见解)