软件重用

2024-08-01

软件重用(通用7篇)

软件重用 篇1

摘要:代码重用可加快软件开发的过程,且降低了开发和维护的费用,同时可在一定程度上提高软件产品的质量。为了尽可能地提高面向对象软件开发中代码的可重用能力,文中结合实例分析了在该方法中代码重用的3种实现策略,并提出了在重用过程中需要注意的几个方面。

关键词:面向对象,软件开发,代码重用,代码分离

为提高软件的开发效率,软件工程师们越来越追求开发更多、更有通用性的可重用构件。传统的结构化方法是将系统功能分解编写模块,每个模块实现特定的功能,可重用的单位只能是模块,且用户需求的变化需花费较大代价去实现。为了适应软件开发的更高要求,提高软件产品的稳定性和可修改性,从而产生了面向对象[1]。

1 面向对象的软件开发

面向对象(Object Oriented,OO)是一种软件开发的方法。起初,其专指在程序设计中采用封装、继承和多态等设计方法。但如今,面向对象开发方法的研究已日趋成熟,面向对象的思想已涉及到软件开发的各个方面。

面向对象的软件开发包括3个阶段:面向对象的分析(Object Oriented Analysis,OOA),面向对象的设计(Object Oriented Design,OOD)、以及面向对象的实现(Object Oriented Programming,OOP)。面向对象分析的目的是对客观世界的系统进行建模,用分析模型来明确问题需求,为用户和开发人员提供一个协商的基础,同时为面向对象设计和实现提供了一个基本框架。面向对象的设计以面向对象的分析为基础,通过系统设计和对象设计将分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案。面向对象的实现即选用能最完善、准确地表达问题域语义的面向对象语言开发软件,其基本目的和主要优点是通过重用提高软件的生产率[1]。

2 代码重用的实现策略

在面向对象的软件开发过程中,一般通过对接口编程、改写类的实例方法和代码分离的方式来实现代码重用。

2.1 对接口编程

面向接口编程是实际开发过程中实现代码重用的一个重要方法,其根本思想是将一个接口或抽象类从一组功能相同的组件中进行抽象形成。通过面向接口编程,当任务中需要其他组件时,无需对程序代码进行更改,而只需更改该接口的实现即可。现存的组件不能满足设计需求时,通常有两种方法来完成:一是创建一组新的组件;二是对现存的相关组件进行扩展,通过新的子类来完成所需的扩展功能[2]。

继承是代码重用的一个基本方法,但在面向对象编程中,类继承不是代码重用的真正要点,可通过对接口编程来达到代码重用的目的[3]。在实际应用过程中,当某块代码能编写成独立的全局过程时,只要将其所有类形式的参数改为接口的形式,就可进一步提高的可重用能力。经此改动后,过程的参数就不仅是原来类所创建的对象,而是实现了该接口所有类的对象。

例如,假设有这样一个全局静态方法contains():

该方法用于检查指定的点是否包含在矩形内,若将rect的参数类型Rectangle改成接口:

其中,Rectangular接口的定义如下

经此改动后,contains方法的参数变成所有实现了Rectangular接口类的对象。通过将参数类型改为接口的形式,可放宽对参数类型的限制,扩大过程所使用参数的范围,从而大幅提高方法的可重用能力。

通过上述分析可知,将参数类型改为接口可提高代码的可重用能力,但在实际应用过程中,将参数类型改成接口可能有多种方式,不同的更改方式其实现所需的代码、数据和容易程度均不相同。因此,首先需确保方法对参数的要求,然后尽量将参数类型改为简单的接口。接口越简单,类实现接口时就越容易,能将其作为参数进行使用的类也就越多,代码的可重用能力则越大[4]。

2.2 改写类的实例方法

在实际编程过程中,对于那些能执行某个单一任务的方法,可进行重用来节省编程的成本。为此,可通过将相关的实例方法组织成为独立的类,使其成为一个公用的全局性静态过程。为了提高这种过程的可重用性,过程代码应同静态工具方法编写一致:即只能使用自身的输入参数,仅可调用其他全局性的过程,不能使用任何非局部的变量[5]。这种对外部依赖关系的限制简化了过程的应用,使得过程能方便地用于任何地方。这种组织方式的使用使得代码结构更加清晰。因此,即使不考虑重用性的代码也能从中获益。

众所周知,Java中的方法不能脱离类而单独存在。所以为实现代码重用,可将相关过程定义为公用的静态方法,并组织为独立的类。例如,对于Polygon有:

可将其改写为:

其中,p Polygon类定义如下:

在上述例子中,p Polygon类中封装的公用静态方法参数均与Polygon类型的对象有关,通过改写pPolygon类的实例方法,Polygon类的功能转由p Polygon类以过程为单位进行提供,不继承Polygon类也可使用Polygon类的功能。由此,客户代码只使用自身需要的代码,而无需关心其他不需要的功能。

2.3 代码分离

由于继承会带来一些多余的方法和数据成员,且更改父类时会影响子类功能,子类对父类的依赖关系会使代码变得复杂,子类中的覆盖方法是否要调用父类中的对应方法有时也并不明显。因此,仅通过继承来实现代码重用会存在一定的不足,其并不是最为理想的代码重用机制,所以通常是将继承与代码分离技术相结合来实现代码的重用。所谓代码分离就是将可变部分和不可变部分分离开,其是面向对象设计的一个重要原则。在通过继承进行代码重用时,可在抽象基类中定义好不可变的部分,然后由其子类去实现可变的部分[6]。

3 代码重用的注意事项

尽管代码重用的优势明显,但并非所有的代码均能进行代码重用。代码重用需注意以下几点:(1)只有高通用性的代码才可重用。一般来说,通用性较低的代码不适合进行代码重用。因在多个项目间重用不为通用性设计的代码,反而会使整个开发过程变得复杂,同时会增加开发的时间和成本。(2)依赖度高的代码不适合重用。有些代码与开发人员有较大的依赖性,且无相应的文档来描述程序设计细节。新进项目的人需花费大量的时间和精力才可理清楚代码间的相互关系。类似依赖度高的代码越多,工作难度越大,进行代码重用就越困难。(3)高成本、低使用率的代码不适合重用。代码重用虽有众多优势,但在使用过程中仍需考虑其成本和使用率。若需付出过高的成本,且重用代码的使用率较低,则不适合进行代码重用。

4 结束语

介绍了面向对象的软件开发方法及其3个阶段:面向对象的分析、面向对象的设计和面向对象的实现。并结合实例分析了在该开发方法中代码重用的3种实现策略,即对接口编程、改写类的实例方法和代码分离。通过这3种策略与面向对象编程技术的结合,能简化方法的复杂性和依赖关系,同时可提高方法的可重用性和内聚力。但并非所有的代码均能进行代码重用。因此,在重用过程中要注意代码的通用性和依赖度,同时还需考虑重用的成本和重用代码的使用率,使代码重用在面向对象软件开发中真正发挥其的重要作用。

软件重用 篇2

1 软件重用技术

软件重用技术最早是在1968年的NATO软件工程会议上由Mcllroy提出的, 他提出可以利用COTS构件工业化生产软件, 并以可重用源代码软件构件为发展软件工程的基础。软件重用自起源以来到至今, 经历了结构化程序设计、面向对象技术、软件构件技术3个发展历程, 其中面向对象技术在软件的开发应用中深受人们的厚爱, 其通过构建软件模型将软件构件问题进行空间设计的抽象化, 使不同功能的软件工程进行合理的组装, 进而使重组的软件功能更加齐全, 通常在软件开发的过程中可重用的软件元素越多, 重用的粒度越大, 也有助于改善软件质量。软件重用主要有3种表现形式, 直接重用、淘汰型重用和进化型重用。

1.1 直接重用

直接重用是重用率最高的一种形式, 在软件开发的过程中可以在软件类库中找出原有功能已存在的类, 则可以根据需要直接应用于系统重用, 如果已存在类的功能无法直接被引用, 也可以通过其功能示例来完成所要求的功能设计, 从而作为其他类的部分功能实现, 直接重用就减少了对代码程序的修改过程, 从而提高重用效率, 但这种实现方式的抽象性极高。

1.2 淘汰型重用

这种重用形式是建立在淘汰原有类的基础上实现的, 在某一种类和其他类没有任何联系时, 可进行软件淘汰, 创新新类, 或者在软件类库中找到软件设计需要的模板, 组合一些简单的类, 进而可以开发出多功能、创新型的新类。

1.3 进化型重用

从字面上可以理解, 进化型重用是以原有类为基本依据, 通过继承原有类的所有特征, 从而派生出具有全新功能的类。原有的类不需要是实际存在的, 也可以将若干类的现有功能抽象化, 开发出适应市场需求的新功能软件。

2 应用

通用办公管理系统主要是为了适应信息社会化的需求, 建立在软科学理论、计算技术以及通信技术的普遍应用的基础上发展起来的, 是集中开发、通讯以及文档信息的收集、整理、储存等综合管理于一体的管理办公系统, 从而实现部门与部门之间、员工与员工之间的有效沟通、协调和控制, 因此通用办公管理系统的综合性非常强, 在系统开发过程中, 常常会出现系统分布异构、跨平台以及原有应用系统的整合等问题, 严重影响通用办公管理系统的开发效率, 在系统开发的需求分析阶段、软件设计阶段以及代码编程阶段合理的应用软件重用技术可有效的减少重复性工作, 提高软件开发效率。

2.1 软件需求分析的重用

对于软件产品而言, 在产品风格上保持一致性非常重要, 产品推出前期, 可以减少系列产品的广告宣传费用;产品推出市场后期, 可降低系列产品的维护以及培训的费用。因此在软件开发时统一界定风格重用, 可大大降低成本。根据产品领域定位的深入研究, 任何的事务型系统都会有一个标准化、规范化的工作流程, 常规的应用软件产品为了支持系统的正常运行, 在完成业务运行所需要的功能外还需要一些支持模块, 包括Web服务器支持系统模块以及数据库组织管理模块, 其中组织管理模块是企业处理领域内的应用系统得以正常运作的基本环节, 而Web服务器的支持模块是支持应用软件系统继续正常运作中必不可少的基础功能。因此在应用系统分析的过程中, 首先应该把这些工作流程抽离出来, 比如说可以将公文管理中的收文、发文、归档以及档案管理、会议室管理以及请假加班管理流程进行整合, 建立一个工作流平台, 使这些工作流程的定义可以在这个工作流平台上得以表达即可, 从而达到不需要修改任何的软件编程代码, 直接可以被应用系统重用, 这也是构建抽象化软件模型在面向对象重用技术中的应用体现。

2.2 软件设计的重用

在产品开发的软件需求分析阶段, 所有的办公文件管理以及非办公文件管理中的业务流程均建立在统一的工作流平台上, 在产品设计阶段, 设计者首先应充分了解所有的业务流程的功能表达, 以该工作流平台为设计核心设计领域软件产品的框架, 整个工作流平台包括事务管理、公文管理、档案管理、报表管理、信息管理、决策支持以及系统管理等内容。在设计人员设计好基本的系统领域框架以及统一的开发方案后, 可以对现有的系统构件采取进行型的类重用, 继承、利用原有系统构件的所有服务以及工具, 根据系统应用的需求设计开发全新功能的系统构件;同时也可以对原有系统构件进行淘汰型重用, 将整体的系统构件中频繁变动的业务逻辑层淘汰、抽离, 实现全新的系统构件重用, 同时在各个层次的模块层之间设置统一的数据接口, 实现数据模块的相互独立, 减少业务逻辑模块之间的相互影响, 有助于各模块的功能适应升级。这种统一的工作流平台的基本层次软件体系结构包括表现层、业务构件层、通用等构件层以及系统构件层4个层次, 层次式软件体系系统最大的优点是最终用户无需编程, 可进行自定义工作业务流程, 并对业务流程进行实时监控, 各模块的独立接口方便开发人员完成复杂的业务流程程序。

2.3 软件编程代码重用

在软件编码阶段, 主要采用的是JSP技术以及Java Bean技术完成业务的实体逻辑, 实现用户系统的操作接口, 其中在编写Java Bean技术代码时, 主要利用Java良好的面向对象机制, 对实体类的逻辑处理业务实现了代码程序编写的重用, 达到只需一次编写, 即可全系统运行的效果。在编写JSP技术代码时, 充分利用了Java Bean的业务逻辑层, 用户在使用的过程中只知道唯一的统一入口———自己的界面访问数据, 实现了软件的重用, 保护操作和数据的封装性, 提高JSP程序代码的安全使用性能。这些技术的程序代码在软件需求分析以及软件方案设计的软件构件重用的基础上, 后期系统各代码的实现就相对而言比较容易, 工作人员只需要了解各个系统模块的数据接口, 即可实现数据的处理功能, 同时在代码的重用中算法的重用也非常重要, 代码的算法中新增、修改、删除以及查询这些操作的算法除了结构化查询语言 (SQL) 有所差异, 其他算法是基本一致的, 这些类可以提供相似的功能, 因此在设计编码时可实现进行型重用形式来重载这些算法, 从而降低算法的复杂度。

传统的软件开发直接按照软件设计需求编写代码, 很容易产生数据冗余, 导致软件开发的效率低下, 软件重用技术把每个系统构件的功能抽象为相对独立的构件模块, 且每个构件模块都有相对应的标准接口, 最终用户端无需修改代码编程进行自定义运作, 在业务流程运作过程中进行实时监控, 软件开发人员只需整合这些构件调试运行即可开发出新的软件, 大大提高了软件开发的效率, 同时也提高了软件产品的可重用性, 为后续的产品开发提供可重用的基础条件。

摘要:从软件重用技术在通用办公管理系统开发过程中的系统分析、系统设计, 以及编码等环节需要注意的问题进行分析、探讨, 总结了软件的重用与层次重用的方法。

关键词:软件重用技术,通用办公管理系统,软件重用

参考文献

[1]杨芙清, 梅宏, 李克勤.软件重用与软件构件技术[J].电子学报, 2011, (2) .

[2]夏榆滨.软件构件技术[M].北京:清华大学出版社, 2011.

[3]林振荣, 李洪, 伍军云.软件重用过程中构件技术的研究[J].科技广场, 2010, (5) .

[4]尹锋.软件工程的若干热点技术发展现状与展望[J].长沙大学学报, 2012, (5) .

[5]向阳.浅谈软件重用技术的发展[J].中国科技信息, 2011, (4) .

软件重用 篇3

软件重用意指重复使用以重用为目的进行设计软件或软件要素的过程, 具体包括领域知识、领域模型、软件需求说明书、软件设计说明书、软件功能模块分析、软件测试方法、软件测试用例、软件测试结果、面向对象程序设计中所有的可重用部件。软件重用过程其一是基于源代码级的软件重用技术, 其二是基于函数库的软件重用技术, 第三是基于面向对象的软件重用技术, 最后是基于组件对象模型的面向对象组件重用技术。

面向对象组件重用技术作为更高级、更有效的技术, 其基本思想是在客观事物中构建软件系统, 并尽量运用人类自然的思维方式。采用面向对象编程, 对象和类是积木块, 方法、信息、继承体现着积木块之间的信息传递关系;对象封装了数据成员与对数据进行操作的方法;继承关系组织起来的类的层次关系, 使子类可以便捷地重用父类信息, 从而实现良好的重用。

二、开放式数控系统的组件对象模型

数控系统软件模型体现软件模块的基本拓扑结构与模块间的信息流。数控系统最基本的需求关系是接受本地或者远程控制者的指令、程序, 控制过程型设备或运动型设备, 而且反馈给控制者其控制结果、控制过程状态。数控系统有很多子系统, 包括运动控制子系统、逻辑控制子系统、显示子系统、管理控制子系统。这些子系统利用构成它们的各个组件协同工作来实现其功能, 组件是标准的、已被编译的、链接的、可独立存在的、可执行应用程序的组成部分。应用程序被组件技术所支持, 并被其分成很多独立的组件, 其划分依据是独立完成一个数据处理过程, 可以被同样功能的组件进行便捷替换。

现以运动控制子系统为例, 分析其基本功能, 即接受数控程序文件形式的运动指令或手动操作指令以及逻辑控制子系统触发的运动指令, 通过数据密化计算, 生成运动型设备进而接受的微运动指令。运动控制子系统组件对象模型及其各组件功能分析如下,

1.运动任务接口接收文件形式的运动指令或手动方式的运动指令。

2.信息窗接口搜集子系统内部信息, 接收子系统外部信息的查询请求、或其它子系统的同步请求。

3.代码解释组件相关数据变换, 把输入的加工代码处理为系统内的数据结构。

4.刀具半径补偿组件把原运动指令处理成刀具中心的运动指令。

5.插补计算组件对运动指令进行数据密化, 成为运动型设备可接受的微指令。

6.输出控制和补偿组件实现输出逻辑设备与物理设备的绑定, 依据运动型设备指令, 把插补计算结果进行时序输出, 或完成某些系统的精度补偿计算。

三、数控软件组件的描述方法

一个软件组件分成两部分描述, 组件功能的说明部分与实现部分。可重用的软件组件都要有特征说明与规则说明, 分别描述可重用组件的静态特征、动态语义。为更好地描述并大量开发数控软件组件, 须要有效制定数控软件组件的开发规范, 建立可重用的数控软件组件库。数控软件组件可描述为:

<数控组件>:= ( (组件标识号) , (组件名称) , (组件类别) , (组件功能描述) , <组件注册文件和源文件存放路径>) ;

<组件类别>:= ( (可见控件) , (不可见控件) ) ;

<组件功能描述>:= ( (组件输入接口) , (组件输出接口) , (源文件存放事件) ) ;

<组件源文件和注册文件存放路径>:= ( (注册文件存放路径) , (源文件存放路径) ) 。

GuID是组件的唯一标识, 其采用特殊的算法生成128位值, 在理论上重复概率极小, 进而保障组件一旦发布, 其对外接口便不会再更变, 无需担心不同组件的GuID会发生重复。命名组件要按规则实行, 可以减少检索组件的耗时, 使用科学适宜的命名规则, 检索时能够依据组件的名称分析其所处类别, 缩小范围进行检索加快了检索组件的速度。组件的功能描述包含组件输入/输出接口、属性、方法、事件的集合。组件的输入接口是组件完成其功能时需要的前提条件, 比如插补计算组件仅可对数控代码实行编译处理获得有关的插补参数信息后才能够开始插补计算, 其计算结果经过输出接口传给位置控制组件, 驱动进给轴运动。

参考文献

[1]朱志红, 阳道善, 朱志红, 等.开放式数控系统软件体系结构研究[J].机械工艺师, 2008 (4) .

[2]王文, 戴晓华, 陈子辰.基于COM标准的可重构数控系统研究[J].计算机辅助设计与图形学学报, 2009 (8) .

[3]戴晓华.基于软件重用技术的开放式数控系统研究与开发[J].浙江大学, 2009 (2) .

软件重用 篇4

关键词:重用度,匹配度,满足度,知识重用系统模型

0前言

目前企业间竞争日益激烈, 产品越来越复杂, 交货期越来越短, 质量要求越来越高, 使得企业必须尽可能快速的开发新产品以响应市场的需求。通常一个新的设计问题的解是通过对已有设计问题的推理、修改而获得。有数据表明, 75%的设计是基于实例的设计[1], 一个新产品的开发。约40%是把过去已有的知识借鉴使用, 约45%是对过去已有的设计知识修改后再应用于新设计开发当中, 只有约15%是完全创新的设计[2,3]。所以, 如何有效的使用已有的设计知识进行新产品的开发, 成为制约产品快速开发及提高企业竞争力的关键。

1重用度

在对设计知识重用时, 从设计知识库中检索到有用的实例并从中提取有用信息, 是关键因素之一。对于一个产品中所包含的设计知识能否被设计人员提取并重复利用, 取决于这个产品的重用度, 即设计时对设计知识的重用程度。

1.1重用度 (Degree of Reuse, Do R) 指知识在一个设计过程中的重用程度

以设计实例的重用为例, 重用度是由相似度 (Do S) 和满足度 (Do F) 的加权和来计算。如下式所示:

其中, wm和wn称为权值, Do S和Do F可由产品设计人员或者设计根据对重用的影响来确定。

1.2匹配度 (Degree of Similarity, Dos) 指设计实体之间的匹配程度

匹配度在[0, 1]之间变化, 当匹配度为“0”时, 两个实体完全不匹配;当匹配度为“1”时, 两个实体完全匹配。匹配度一般用匹配性距离来计算。

1.2.1计算匹配性距离的方法

源设计实例与目标设计例之间的匹配性可以通过以下几种计算方法:欧氏离、曼哈顿距离、无模距离。

欧氏距离

当设计知识中每个属性值规范化以后, 欧式距离可通过下式计算:

曼哈顿距离

无限模距离

1.2.2特殊匹配度的衡量标准

莱恩史铁距离

一些非数值型数据的处理计算时, 测量集合的匹配性需考虑两个集合A和B, 其中常用的测量如下:

字符串的匹配度的测量, 由于字符串的顺序不同字符不同, 当给定两个字符串m, n匹配性可根据包含、重叠合变化匹配度判断。

1.2.3满足度

(1) 满足度 (Degree of Fulfillment, Do F) 。用来描述距离要求值的偏离值和要求满足的程度。匹配只是从结构的方面对两个设计例进行比较判断, 这并不能完全满足设计时所要求的功能、行为等方面的匹配性。

(2) 满足度的计算。设计要求可分为领域中的属性定义、常量表达式、关系算子和逻辑算子四个部分。满足度先经过属性匹配然后通过数学逻辑表达式将属性值及可能的范围进行合理的结合产生新的可能值, 依次为每一个关系表达式计算它的满足度, 最后与关系算子的满足度结合为逻辑表达式从而得出满足度。

关系算子的Do F计算

其中, p——属性, x——任一属性, r——要求, y——任一要求逻辑算子的Do F计算

2设计知识重用的系统模型

工业产品的创新开发通常都会涉及多个知识领域, 因此对于不同领域知识的设计模型都会有所不同, 设计人员在开发新的产品时就应该从中择取最高效、优势的模型从而提高开发有效利用率。Inns和Neville[4]提出了以公司层面为基础的设计过程模型, 以此模型来支持设计知识的重用。

Shahin等[5]人认为, 设计重用系统是一个有机的设计系统, 数据库是支撑设计的重要环节, 是由许多个设计过程集成的一个整体。他们提出的设计重用系统构造方法中系统功能包括数据库结构化和信息结构化。这些信息包括产品概念、具体设计及详细设计、方案概念、优先权要求等。

本文提出了一种设计重用系统如图1所示。

该系统的功能主要有:记录整个设计过程;查询有效设计;根据相关特征, 查询已有实例;具有设计经验记录存储功能;支持对已有实例及正在进行设计过程知识重用。

3小结

在设计过程中有许多复杂知识交叉作用, 这些设计知识也发挥着各自不同的作用在整个创新设计过程当中。发绝大多数新产品的开是已有设计知识或者设计产品要求的修改及延伸。因此, 新产品的开发中各学科知识交叉在所难免, 这就要求开发人员了解各个领域知识才能保证快速的进行产品设计。若能够使用以前的设计知识, 就可以减少重复劳动, 从而提高效率。设计知识能否重用取决于该设计知识的重用度。本文提出了重用度的概念并深入研究了相似度, 满足度两个关键评价标准, 进而提出了几种匹配度、满足度合重用度的计算公式。最后根据Inns、Neville和Shahin等人的理念提出了一种设计知识重用系统模型。

参考文献

[1]林春.基于MATLAB的点云数据处理[J].科技资讯, 2006 (08) :85-86.

[2]单晨伟.叶片类零件螺旋铣削切触点轨迹规划问题研究[D].西安:西北工业大学, 2004.

[3]施法中.计算机辅助几何设计与非均匀有理B样条[M].北京:高等教育出版社, 2001.

[4]Inns, T.G.and Neville, P.Establishing a Company Level Design process to Facilitate Design Reuse.In Porceedings of Engineering Design Conefernee’98 on Design Reuse.London:Proefssional Engineering Publishing Limited, June1998

三代皇帝重用张安世 篇5

汉武帝去世后, 年仅8岁的汉昭帝即位。因张安世一贯勤勉敬业, 大将军霍光奏请皇帝, 封张安世为右将军兼光禄勋, 做自己的副手。此时, 张安世的职位在大臣中已居第二位, 可谓地位显赫, 但他仍然兢兢业业。汉昭帝特意下诏, 赞扬张安世有尧舜之时的古大臣之风, 加封他为富平侯。

汉昭帝在位十三年后去世, 张安世又同霍光一起辅佐汉宣帝即位。霍光去世后, 御史大夫魏相上奏皇帝提出:“张安世侍奉两代皇帝三十余年, 一直忠诚信实, 谨慎厚道, 夙夜不懈, 应当封为大将军。”宣帝也想重用他。张安世听到这个消息, 急忙请求单独面见皇帝, 说:“我自认才力不足以承担大将军之职, 请皇帝哀怜, 以成全老臣的性命。”宣帝笑着说:“你过于谦虚了, 你若不行, 还有谁能行呢?”张安世百般推辞无效, 最后, 皇帝仍封他为大司马卫将军, 领尚书事, 并将都城以内的全部兵权交给他。

综观历史上许多权臣大将, 处于这样的地位, 往往踌躇满志, 骄狂自得。张安世则不然, 他深知月盈则亏、水满则溢的道理, 更加小心畏忌, 谨慎供职。他每次同皇帝一起参与大事决策后, 往往请病假不上朝, 等皇帝就此发出诏令后, 再派吏员到丞相府探问是怎么回事, 以致连朝廷大臣都不知道他曾参与密议。他待下属也特别宽厚。任光禄勋时, 曾有一个郎中因喝醉了在殿中小便, 负责官员禀报张安世, 欲按规惩治, 张安世说:“你怎么知道他不是倒汤水呢, 怎么能以小过成人罪责?”用这种方式保护了这位下属。他又因父子尊显, 心不自安, 多次奏请皇帝将自己的儿子外派到地方任吏职。

张安世为官历武帝、昭帝、宣帝三朝, 朝中屡经大变, 宦海之中风急浪诡。张安世不管风云如何变幻, 从不结党营私, 一直正道行世。这是他能得到三代皇帝始终如一信任的重要原因。

应当说, 他同大将军霍光关系不错, 彼此绝对信任。霍光推荐张安世做自己的副手, 也可以说他对张安世有知遇之恩。但是, 张安世同霍光的交往, 完全是公谊, 是为国效力, 为君尽忠, 没有丝毫个人谋算的私心。正因如此, 当霍光死后数年, 他的儿子霍禹、霍云、霍山等阴谋作乱的图谋败露, 在霍氏因此被灭族的一场大动乱中, 张安世没有受到丝毫牵连。

张安世的哥哥张贺任掖庭令, 在武帝曾孙 (后来的汉宣帝) 年少寒微时曾尽力扶持与资助, 并认为武帝曾孙刚毅、有才气, 多次向弟弟张安世称道。张安世就劝止他哥哥说:“年轻皇帝 (指汉昭帝) 在上, 不宜称赞皇曾孙。”这些话皇曾孙当时都知道, 他即位当皇帝后对张安世说:“当年掖庭令称赞我, 你制止他, 做得很对。”后来, 宣帝为表彰张贺当年扶持之功, 封过继给张贺的张安世的小儿子张彭祖为阳都侯。

张安世当时贵为勋臣中的第一人, 父子封侯, 食邑超万户。但是, 张安世自奉俭约, 平素在家只穿黑色粗丝做的衣服, 夫人亲自纺线织布, 家中奴仆皆劳作治产, 没有游手好闲者, 由此也导致家境殷厚。他因此上书皇帝, 要求辞去官家俸禄, 当时官方的账本上, 张家拒领的金钱累计达百万之数。

重用真想干事情的人 篇6

到了公司, 由于他提前到达, 前面还有人在谈话, 他就坐在休息室等着。他自己到饮水机边用纸杯接了一杯水, 正要返回座位, 看见一位中年人手里拿着材料急匆匆地走过来, 他便侧身让这位中年人先走。轮到人事经理和他谈话了, 人事经理问了他一些问题, 他一一作答。完了以后, 人事经理问他还有什么问题, 他也不客气地提了一系列问题, 从公司产品的性质, 在市场上的地位, 发展的前途, 问到如果录用后自己会从事什么工作, 有哪些特殊要求, 工作中遇到困难会得到什么帮助, 以及自己的发展前途等等。谈完之后, 人事经理告诉他, 回去等消息, 有什么决定会马上通知他。

很快他就得到通知, 说是决定录用, 要他去报到。报到时, 人事经理告诉他, 本来不可能这么快做决定, 但是那天谈话时你提的问题给我的印象太深了, 很少有人这样提问, 可见你是一个真想干事情的人。我把你的情况给总经理汇报了, 总经理问是不是那天在饮水机边侧身让路的小伙子, 我说是的。总经理说, 能够主动照顾别人的人, 素质错不了。所以就提前决定录用了。

我在这里不是介绍这位年轻人求职面试的技巧, 而是想着重肯定这位人事经理的慧眼, 肯定这家公司善于发现和重视想干事情的人。这也是企业文化, 而且是企业文化的一项重要内容。

有一位香港的企业家曾经问我:“内地的人怎么那么看重钱?”我问他怎么讲。他说, 我这里办一个企业, 有许多人来求职, 几乎每一个人都是只问给多少工资。我说, 人家到你这里工作自然希望工资高点。他说, 问题是他们除了工资之外, 对于我的厂房、设备水平, 用什么原料, 做什么样的产品, 销路怎样一概不问, 我怎么能相信他们是真想来做事情的。

企业是干出来的, 不是说出来的, 也不是只靠钱堆出来的。干才有出路。干得好, 企业才能生存, 才能发展, 才能有利润, 才能有工资、有福利。企业不是提款机, 不干就什么也没有。

企业发展要靠人, 靠人才。人各有长短, 要因材施用。最基本的是要用想干事的人、肯干事的人, 不肯干, 什么才能都没有用。

IOS重用机制研究与实践 篇7

IOS开发中, 如何更好地控制CPU开销和做好内存管理是每个开发者都必须考虑的问题, 为了使开发出来的应用占用更少的CPU和内存, Cocoa Touch提供了一系列好的方法, 开发者可以利用系统提供的方法对自己的应用加以优化, 使开发出来的应用运行更快, 用户体验更好。重用就是系统为开发者提供的方法之一。

1 IOS重用原理

1.1 重用

在IOS的一些视图中, 它们的内部包含子视图, 当父视图显示区域发生变化时, 比如用手滑动屏幕, 原来在屏幕中的子视图就会滑出到屏幕之外, 而原来在屏幕之外的子视图就有机会进入屏幕中[1]。对于进入屏幕的不同子视图对象而言, 在进入屏幕时都会实例化该视图, 同时为了节约内存, 对于移出屏幕的子视图也应该执行释放操作。如果包含的子视图数量很多, 频繁的实例化必将造成CPU和内存开销增大, 反复的释放对象操作虽然能及时释放内存空间, 但会加大CPU开销。为了解决该问题, IOS的一些控件提供了重用机制。如果屏幕上所有的子视图或者部分子视图是相同的对象, 采用可重用对象设计不需要进行反复的实例化新对象和释放旧对象操作, 而是先使用可重用单元格标识 (reuseidentifier) 到系统重用队列中去查找可重用对象, 如果找到则重用该对象, 没有则创建新对象。在IOS 6以后, 可以使用可重用对象的父视图有表视图 (TableView) 、集合视图 (UICollectionView) 和地图视图 (MKMapView) [1]。

1.2 TableViewCell重用机制

TableView是IOS中应用最广的控件, IOS应用中很多用户界面 (User Interface) 都采用TableView来实现。因此表视图的设计往往对应用起到重要作用。表视图是典型的可采用重用设计的对象。其内部有两种子视图可采用重用机制设计, 它们是表视图单元格 (UITableViewCell) 和表视图节头节脚视图 (UITableViewHeaderFooterView) 。

如图1所示, 这是在电子商务应用中经常可见到的用户界面, 该UI主要由TableView和Searchbar两个视图构成, 假设该表视图总共有100个单元格 (TableViewCell) , 分别以Cell0—Cell100给单元格命名, 其中可见的有6个单元格, 当Cell0移出屏幕后, 将会有另一单元格Cell6进入屏幕, 当Cell1移出后, Cell7进入屏幕, 依此类推。从界面上可以看出, 这些单元格除了内容不一样外都是同一种样式, 因此IOS并不会采取反复实例化单元格和释放单元格的方式, 而是将最先移出的Cell0加入一个重用CeLL队列中, Cell6要进入时, 首先查找重用队列中是否有可重用的单元格, 如果没有才新建单元格, 否则重用已有单元格。Cell7可以重用Cell0, Cell8重用Cell1, 依此类推。因此, 该表视图不管有多少单元格, 实际只需实例化7个单元格, 也即屏幕可见单元格个数加一。查看UITableView类, 可以看到有- (NSArray*) visibleCells方法, 该方法可以返回一数组对象, 保存表格中当前可见单元格对象[2]。对于同一个应用可能存在多个重用对象, 为了区分不同的重用对象, 可以为每个重用对象设置一个重用标识 (reuseIdentifier) 。在系统定义的UITableViewCell类中可以看到@property (nonatomic, readonly, copy) NSString*reuseIdentifier;语句, 该属性可以获取单元格的重用标识。

2 TableViewCell重用实例分析

为了更好地说明重用机制在创建表视图中的优势, 以图1所示表视图为例, 对重用和不重用单元格两种情况进行介绍与分析。

系统为IOS表视图单元格提供了4种可选的样式UITableViewCellStyleDefault、UITableViewCellStyleSubtitle、UITableViewCellStyleValue1, UITableViewCellStyleValue2, 图1所示表视图不适合这任意一种样式, 其单元格是一种自定义的单元格。对于自定义的表视图单元格可以采用3种方式创建:Nib文件、Stroyboard以及代码实现。Nib文件方式和Storyboard方式都是采用图形界面IB (Interface Builder) 来创建单元格及其子视图, 其特点是直观方便、代码少。采用代码实现比其它两种方式更灵活, 但编写代码相对比较繁琐。

2.1 单元格实现原理

Cell继承自UITableViewCell类。如果视图控制器遵循UITabelViewDataSource协议, 通过实现tabelView:cellForRowAtIndexPath:方法, 数据源会为表视图提供所有Cell对象, 即单元格。Tableview中Cell和数据是分离的, 因此在tabelView:cellForRowAtIndexPath:方法中应先生成单元格, 然后为单元格填充指定的数据内容。本例中即先创建包含4个标签 (UILabel) 控件和一个图形控件 (UIImage) 的单元格, 然后将图书图标、图书名称、价格、卖出册数及售出地的内容填入该单元格。

2.2 IB实现方式

2.2.1 步骤

nib实现方式通过创建单元格图形界面, 采取加载nib文件和重用的方式在tabelView:cellForRowAtIndexPath:方法生成单元格。简要步骤如下。首先在项目 (project) 中创建一个空白view, 并命名为Custom.xib。向view中拖入一个UITableViewCell, 在该单元格中加入4个标签 (UILabel) 控件和一个图形控件 (UIImage) , 调整位置和大小。创建一个UITableViewCell子类CustomCell, 并将CustomCell类与UITableViewCell控件关联 (见图3) , 设定单元格重用标识CellIdentifier (见图4) 。最后为每个单元格子视图控件创建一个插座变量。

Stroryboard方式类似于nib方式, 只是不需要单独建立view文件, 只需在已有tabelview中加入tableviewcell, 其它操作和nib方式类似。

2.2.2 关键代码

代码段1:

代码段2:

以上代码为nib文件方式创建单元格所采用的重用实现, 如采用storyboard方式, 则需将上述代码段1删除, 将代码段2中if语句代码改为“cell=[[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"];”。但该语句只是创建系统缺省模式的cell, 如果是自定义的cell, 还必须通过代码创建cell的各子视图。

2.3 代码实现方式

代码实现cell重用, 可以通过重写- (instancetype) initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString*) reuseIdentifier方法, 在该方法中创建cell的子视图, 并添加到cell。在View load方法中添加代码[self.tableView registerClass:[CustomCell class]forCellReuseIdentifier:@"CellIdentifier"]为Tableview注册CustomCell类。再通过CustomCell*cell=[tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"forIndexpath:indexpath]语句进行重用。因为刚开始无可重用cell, 所以用if语句判断cell==nil时, 执行语句“cell=[[CustomCell alloc〗initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"CellIdentifier"];”。该语句对cell进行初始化, 并指定重用标识为“CellIdentifier”。重写方法代码示例如下。

3 TableViewCell重用优势分析

3.1 试验测试

为了比较使用重用机制与不使用重用在系统开销方面的区别, 可以做一个简单的测试, 比较两种情况系统在cpu资源和内存资源的损耗方面的差异。测试重用机制采用前述Nib文件重用方式;不使用重用机制的情况, 采用代码实现, 将前述代码进行简单的修改。将前述重写- (instancetype) initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString*) reuseIdentifier方法中的代码段3去掉, 将其加入UIViewTableCell的Init方法。如下所示。

代码段3

//代码段4

运行项目, 在debug navigator下查看两种情况下CPU资源和内存的变化。使用重用机制和不使用重用分别如图5、图6所示。

图5和图6中左边为项目运行初始状态, 右边为项目运行后模拟滑动屏幕。可以看出项目刚开始运行时, 两者所占用CPU和内存资源基本上无差异。在屏幕滑动时使用重用机制内存占用比不用重用机制大, 但CPU占用比不用重用机制小。屏幕滑动越快, 两种情况下的CPU占用差异越大。而且如果所用cell不是自定义样式, 而是系统默认的cell样式, 则这种区别更明显。

利用MAC OS自带的内存动态分析工具instruments进行内存测试, 也可以得出类似结论。单击product菜单下的profile子菜单或者使用快捷键commad+i可以打开instrments工具。

3.2 结果分析

为什么实验结果显示, 运用重用机制占用内存反而比不用重用机制占用内存更多?难道ios的重用机制不节约内存, 还耗费内存?为了说明该问题, 可以从项目的运行原理进行分析。所测试的项目是在xcode5下基于ios7操作系统, 支持ARC内存管理机制。不使用重用机制, 创建表格所作的操作是反复创建cell, 释放cell, 当单元格进入屏幕是执行创建操作, 移除屏幕时执行释放操作, 释放cell后, 所占用的内存就释放掉了。因此如果屏幕处于静止状态, 理论上来说只有6个cell占用内存。而对于使用重用机制创建cell时, 除了屏幕可见的6个cell占用内存, 还有重用队列中用于重用的cell所占用内存, 因此重用的cell越多, 则所占用的内存越大。而对于CPU而言, 不使用重用机制必须反复创建cell和释放cell, 而使用重用机制则只需在运行开始时创建cell, 到不需要TableView时才释放, 因此, CPU损耗重用的情况比不重用的情况要小。

以上试验是在Mac Os系统下的模拟器上进行的, 应用在iphone上运行时的实际情况比这要相对复杂, 如有时可能多个应用同时运行, 或者需要加载网络数据, 有时移动屏幕速度又过快。对于iphone有限的CPU资源而言, 所有这些情况都有可能造成CPU资源损耗过大, 而使运行速度变慢, 以至系统不能及时释放移出屏幕的cell, cell释放的延迟会导致内存资源被反复创建的cell所占用, 严重时甚至耗尽内存使应用crash掉。反之, 如果采用重用机制就可避免这种情况的发生。因为重用已有cell比反复创建和释放一个新的cell实例要节约CPU时间, 可以改善内存延迟释放问题, 因此更能体现出重用机制的优势。

4 结语

通过对重用机制在定制tableview中的应用实践可以看出, 对于大型的tableview, 成千上万行的表格, 如果具有相同样式的cell, 使用重用机制可以极大减少系统开销。对于系统没有提供重用机制的控件, 也可利用重用原理, 自定义重用方法。在CPU处理能力和内存有限的情况下, 最大限度控制系统开销是开发的基本准则。

参考文献

[1]关东升.ios开发指南-从零基础到App Stroe上架[M].第2版.北京:人民邮电出版社, 2014.

上一篇:全瓷烤瓷贴面下一篇:湿性愈合