在我们使用面向对象编写程序的时候,经常会因为不知类应该如何组织而无从下手
我们应该如何来组织各种各样的类呢?下面我拿一个简单的例子来说。
在一个网站程序中通常都需要用到上传文件,有的地方只允许上传文本文件,有的地方则只允许上传图片。这个时候我们需要一个类来处理上传文件,很多人通常的作法是写一个FileUploader类,然后在FileUploader中定义一个成员allow_exts来判断所要上传的文件是否是一个合法的,系统允许的文件。这样做是没错的,但是有的时候,我们需要检测上传的图片文件的某些信息来限制图片文件的上传,又有的时候我们需要检测上传的文本文件的信息(比如不能包含某某字符之类的)来限制上传,遇到这种需求,很多人都选择在FileUploader中新增加方法,然后在类中再去分情况调用这些过滤的方法(比如当遇到只允许上传txt文件的时候,就调用某个方法来检测该上传文件中是否包含某个字符),这样做会允许一些问题,假如我的需求变得更多的时候,我就得在“检查文件扩展名”那块代码中写入N种情况,做N种处理,所有可能出现的情况都挤在FileUploader这个类中了,所有的代码都已包含在FileUploader中,从面向对象编程的角度去看 这种作法,显然,你能看出这个FileUploader类并不是面向对象的类,而是一个高级的函数,一个代码组织得比函数清晰的类,仅此而已,它并不能算做是一个面向对象的类。
最近比较常用类来组织自己的代码,因此,以下是我的一点小小的愚见。
对于以上那种情况,我们可以这样子来看。
不管上传文本文件,还是上传图片文件,它都是一种“文件上传”,因为我们可以抽象出一个类,名字叫做”FileUploader”,在这个类中,我们视它为一个万能的文件上传器,你可以上传任意种文件。当然我们也可以通过限制其中的一个成员allow_exts来限制它允许上传的文件类型,“文本上传”我们将其叫为 “TextUploader”,TextUploader从FileUploader继承,因为TextUploader是一种特殊的FileUploader,因此TextUploader拥有FileUploader的所有功能及成员,这时我们需要对TextUploader进行特殊处理,在上传前检查要上传的文件是否是个有包含不该包含的字符,这时我们只需要重写FileUploader的相关函数,在该相关函数中增加判断是否包含不该包含的字符的代码即可。呵呵,这样子关系是不是清楚了点了呢?图片上传同理。
总而言之,在设计类之前首先要先将其能抽象出来的尽量抽象出来。然后即可在代码层面表示了,那个时候一切都那么理所当然