编程基本功 (4)
数据结构与对象
数据结构
在OO世界里,数据结构往往意味着没有任何能力的纯实体,这种情况是很少见的(因为意味着纯粹数据结构的集成)。
例子:
public struct Point {
public double X {get; set;}
public double Y {get; set;}
private double x;
private double y;
}
1. 我们可以用它来存一个点,这个点可以是任何形状的一部分
2. 它不具备任何能力,仅仅是对数据的集成而已
3. 优点:修改行为容易,因为这里往往代表了数据,即便多处引用也不会影响到;缺点:修改数据结构困难,多处引用的话会影响到很多地方。
对象
对象往往和接口关系紧密,上例对应的接口示例:
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
1. 数据被封装了
2. 暴露了一些对象的能力可以使用,但基于封装
3. 优点:由于数据结构封装了,因此修改数据结构容易;接口是一张对象能力(行为)清单,修改成本较大(open-close 原则,通常只增加接口)。
结论:
过程式设计使得修改function时无需修改数据结构(纯实体类);OO设计可以通过增加类的方式来扩展功能而无需修改已有的function。
过程式设计修改数据结构很困难,因为所有引用到的地方都要改;OO设计需改接口很麻烦因为所有相关类都要改(因此较早考虑轻量接口,开发过程只增加接口)。
避免冗长的调用
看下面这行代码:
string outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
显然如果重构一下:
string outputDir = GetAbsolutePath();
private string GetAbsolutePath(){
return ctxt.getOptions().getScratchDir().getAbsolutePath();
}
代码的意图清晰很多,调用者也方便很多。
使用抛出Exception而不是Return ErrorCode
1.ErrorCode是一个全局的level,除非确保定义的非常全面,否则一旦修改将会影响全局,而增添一个异常类比较容易
2. 容易出现重复定义
3. 异常可以使用wrapper来接触错误处理和business之间的耦合,可是使用errorcode无法解耦。
Wrapper Exception
看这段code:
try {
port.open();
} catch(DeviceResponseException e) {
reportPortError(e);
logger.log("Deviceresponse exception", e);
} catch(ATM1212UnlockedException e) {
reportPortError(e);
logger.log("Unlockexception", e);
} catch (GMXErrore) {
reportPortError(e);
logger.log("Deviceresponse exception");
}
如果多处需要调用port.open函数,那么到处都是这种catch chain。解决办法是对port进行wrap,把catch chain wrap起来:
public class LocalPort {
private ACMEPort innerPort;
public LocalPort(int portNumber) {
innerPort =new ACMEPort(portNumber);
}
public void open() {
try {
innerPort.open();
} catch(DeviceResponseException e) {
throw new PortDeviceFailure(e);
} catch(ATM1212UnlockedException e) {
throw new PortDeviceFailure(e);
} catch(GMXError e) {
109 Definethe Normal Flow
throw new PortDeviceFailure(e);
}
}
…
}
这样就使得调用的代码意图清晰很多:
try {
port.open();
} catch(PortDeviceFailure e) {
reportError(e);
logger.log(e.getMessage(),e);
}
Wrapper其实就是Adapter模式的应用之一,除了异常,还可以对第三方library以及其他API的调用进行wrap。
分享到:
相关推荐
第四章_编程基本功 第四章_编程基本功 第四章_编程基本功 第四章_编程基本功 第四章_编程基本功
小组内对代码大全学习的资料,包含的是程序撰写的基本概念!
UG 数控编程基本功特训新老手皆适宜PPT学习教案.pptx
UG数控编程基本功特训新老手皆适宜解析PPT学习教案.pptx
为了帮助大家一劳永逸解决这些基本难题,从而迈向自由编程的康庄大道,我们特地开辟了这个版块,要把这些基本功一一传授给大家。如果觉得我们的帖子还不过瘾,你可以回帖继续提问,务必把所有概念搞清搞懂。另外所谓...
教学课件:基础知识,加工模块,CAM环境等
磨砺营_Java_02_Java语法基本功
《软件测试基本功》系列教程_-_第5章__编程与设计基础
在《疯狂Java:突破程序员基本功的16课(修订版)》中,李刚老师专门针对Java初学者可能会遇到的各种学习问题,由点及面,详细讨论了Java内存管理、Java编程过程中常遇陷阱、常用数据结构的Java实现和Java程序开发...
在《疯狂Java:突破程序员基本功的16课(修订版)》中,李刚老师专门针对Java初学者可能会遇到的各种学习问题,由点及面,详细讨论了Java内存管理、Java编程过程中常遇陷阱、常用数据结构的Java实现和Java程序开发...
软件测试基本功 第1章 软件工程基础.pdf .... 第5章 编程与设计基础.....
在《疯狂Java:突破程序员基本功的16课》中,李刚老师一改枯燥的教学方式,专门面向Java初学者可能会遇到的各种学习问题,由点及面,详细讨论了Java内存管理、Java编程过程中常遇陷阱、常用数据结构的Java实现和Java...
Java语言由语法规则和类库两部分组成。学习好语法规则是Java语言,也是所有编程语言的基本功。本文主要向大家简要介绍一下Java的语法规则。
有没有哪一个瞬间,让你想要放弃学习编程? ...难道要苦练5年基本功才能开始拿起吉他弹第1首曲子么? 做任何事情一定有在短期内简单可行的方法。学习不应该是苦差事,而应该是快乐的,重要的是找到
如何适应社会对数控的需求,专业的基本功必不缺少。数控编程的难点-变量编程(宏程序)是学习数控瓶颈之一,笔者通过具体实例说明变量编程的编制方法,使初学者掌握其编程技巧,以达到抛砖引玉的作用。
鸡啄米的 C++编程入门系列给大家讲了 ...功,在使用 VC++编程时不至于丈二和尚摸不着头脑。本套教程也会涉及到 VC++的 原理性的东西,同样更重视实用性,让大家学完本套教程以后,基本的界面程序都能 很容易编写出来
Java 3D交互式三维图形编程 pdf的书,...最新的1.6版本 已经发布到预览11 了,它和gogl项目在一起维护着,jogl更适合游戏(包括android),如果读者刚入门最好建立起一整套概念,然后便可从基本功出发更加渗入的学习。
一个用MFC编写的五子棋游戏,并不网络对战,适合MFC的初学者变形编程基本功和学习消息响应事件