也不知道是不是该放到这个区。
大家先看看吧。
今天,年轻的同事又来问我一个日志分析程序的设计。
帮他把程序由原来的每种格式需要写一段代码,改成了根据配置,调用不同的Parser实例进行处理的程序。
使我想起了一直困扰我的一个问题,什么是对象?
刚接触到面向对象,是看c++的书,第一句话,对象是对实际事物的抽象,从此陷入万劫不复之境地。
反而无法正确的面向对象设计。
直至工作一段时间,看别人的程序,自己写,使用设计模式。
到今天,可以用OO的设计简化代码,并给程序带来简单扩展性时,再回头来看,这个定义是一个极大陷阱。
(下面才开始我的想法,呵呵,写点铺垫)
OO里,从语言上来讲一个Object是一堆成员变量和方法的结合体。
从我的程序设计经验来讲,对象并不仅仅是对事物的抽象。
中学在电脑班学习数据结构的时候,对一句话印象深刻:
数据结构+算法 才是完整的算法
借鉴这个说法,对象是同时对事物和行为的抽象。
对事物的抽象
简单事物(pojo)
有关联的多个事物
事物之间的关联
对行为的抽象
独立行为,简单行为,比如string的trim操作。
上下文相关行为,根据环境不同,输入的参数会导致不同的结果。
条件行为,输入的参数包含数据和条件,根据条件不同导致会导致行为不同。
以我同事的那个项目为例,原有的设计是:
读入一行日志
分解成多个日志项,每一个项有一个格式名称
对于incoming log进行进行日志的解析
对于page_visit_log进行日志的解析
生成incoming log的sql,插入数据库,
生成page_visit_log的sql,插入数据库
每种日志项的格式有所不同,所以需要以名称标识,总共有13种日志。
所以类似的代码要写13次。
即使使用过程方式,也要在过程内部写13种case,而且由于代码不在一起,维护更麻烦。
如果用对象抽象:
数据抽象
--日志格式 (日志格式主要是列的名称定义)
行为抽象
--根据日志格式进行解析(条件行为)
--根据日志格式生成sql,为了性能,需要同种的日志能够叠加后批量插入
按照这样的描述,我们可以以日志格式作为构造的参数设计Parser类。
class Parser {
构造函数:日志格式名称 {
根据名称读入相关的格式
}
日志解析:日志项 {
}
生成sql: 解析后结果 {
}
}
嗯,早上来了,继续编辑。
不过我的意见是,对初学者不要考虑太多理论上的东西,实际多尝试用设计模式解决问题后再来
自己体会比较好。
分享到:
相关推荐
本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言...
在真正可复用的面向对象编程中,GoF 的《设计模式》为我们提供了一套可复用的面向对象技术,再配合 Refactoring(重构方法), 所以很少存在简单重复的工作,加上Java 代码的精炼性和面向对象纯洁性(设计模式是 java 的...
抽象的面向对象式SQL操作语言,保持各种数据库书写语法一致,方便开发和项目迁移 支持schema定义数据结构,支持严格的类型检查;支持数据结构迁移到数据库,通过migrate方法调用 支持hasone,hasmany,manytomany...
附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列表,全功能的、面向对象的CGI程序,一些有用的脚本,以及很有帮助的HTM教程。 本书非常适合于Perl语言初学者阅读,对于Perl程序员,也有...
高性能的二进制协议支持多种编程语言和平台易于使用且类型安全的API,具有以编程语言中立的IDL Slice定义的自己的接口和类型通过利用平台的本机SSL / TLS堆栈来支持安全的加密通信熟悉的面向对象的编程模型,能够将...
远程服务器运行matlab代码 Ice-全面的RPC框架 Ice可以帮助您轻松地将软件联网。 通过处理与低级网络编程接口的所有交互,Ice使您可以将...熟悉的面向对象的编程模型,能够将代理(对远程对象的引用)传输到远程应用程
用功能Qt是完全面向对象很容易扩展并且允许真正地组件编程自从1996年早些时候Qt进入商业领域它已经成 为全世界范围内数千种成功应用基础Qt也是流行Linux桌面环境KDE 基础同时它还支持Windows、Macosh、 Unix/X11等...
这是一种针对纸张中所提供代码的面向对象的方法,因为所有内容都被细分为各个部分。 提供以下模块: 1.数据转换 我定义了一个EDFConverter类,它将读取EDF文件(如果格式错误,请尝试在edfbrowser中转换EDF + D-> ...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date ...
面向对象的思想方法已经非常流行了,在编程语言(例如java,js)中,都运用面向对象的编程思想。在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统...
本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统...
*2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明externf(structx*p);给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明结构的代码:structname{intnamelen;charnamestr[1];}...