当前位置: 首页 > news >正文

编程基本功(4)

编程基本功 (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。

 

 

相关文章:

  • Agile实践日志一 -- Grooming Session
  • 获取SQL Server服务器的连接信息用脚本(在原邹建写的基础上作一点改进)
  • Agile实践日志(2)-- Daily Stand up 和 Retrospective Session
  • 一短查询SQL Server服务器阻塞和死锁信息用的脚本
  • VB.Net 2005 WinFrom 文件上传程序...
  • 论道谈谈
  • WinDBG 技巧:设断点命令详解(bp, bu, bm, ba 以及bl, bc, bd, be)
  • Auto Complete -- Typeahead 和DateRangePicker
  • 有多少域名被漏掉了?
  • C# Windows Azure Queue的操作
  • 移动设备管理(MDM)与OMA(OTA)DM协议向导(二)——WAP协议(1)
  • Submit disabled Dropdown
  • Validation failed for one or more entities. See 'EntityValidationErrors' property for more details
  • [Windows编程] 如何判断操作系统是64位还是32位
  • 使用Roslyn动态编译和执行
  • php的引用
  • 2019年如何成为全栈工程师?
  • 30秒的PHP代码片段(1)数组 - Array
  • Github访问慢解决办法
  • Laravel5.4 Queues队列学习
  • leetcode388. Longest Absolute File Path
  • Octave 入门
  • 闭包--闭包之tab栏切换(四)
  • 二维平面内的碰撞检测【一】
  • 服务器从安装到部署全过程(二)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 7行Python代码的人脸识别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (16)Reactor的测试——响应式Spring的道法术器
  • (办公)springboot配置aop处理请求.
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (分类)KNN算法- 参数调优
  • (过滤器)Filter和(监听器)listener
  • (区间dp) (经典例题) 石子合并
  • (一)kafka实战——kafka源码编译启动
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 物件導向與老子思想 (OO)
  • (转)创业家杂志:UCWEB天使第一步
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***监测系统的构建(chkrootkit )
  • .NET CF命令行调试器MDbg入门(一)
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 使用配置文件
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET实现之(自动更新)
  • .net中我喜欢的两种验证码
  • .Net组件程序设计之线程、并发管理(一)
  • @Bean, @Component, @Configuration简析
  • @JoinTable会自动删除关联表的数据