登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

『簡體書』软件是这样“炼”成的——软件架构设计实现

書城自編碼: 3033446
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作者: 王朔韬 刘萍
國際書號(ISBN): 9787302463566
出版社: 清华大学出版社
出版日期: 2017-08-01
版次: 1 印次: 1
頁數/字數: 643/1170000
書度/開本: 32开 釘裝: 平装

售價:NT$ 713

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
咏春八斩刀
《 咏春八斩刀 》

售價:NT$ 391.0
聊不完的艺术家:跨界设计师穆夏
《 聊不完的艺术家:跨界设计师穆夏 》

售價:NT$ 549.0
失去的过去与未来的犯罪
《 失去的过去与未来的犯罪 》

售價:NT$ 279.0
质子交换膜燃料电池系统及其控制   戴海峰,余卓平,袁浩 著
《 质子交换膜燃料电池系统及其控制 戴海峰,余卓平,袁浩 著 》

售價:NT$ 1114.0
绘画的基础 彩色铅笔技法入门教程
《 绘画的基础 彩色铅笔技法入门教程 》

售價:NT$ 279.0
听闻远方有你2
《 听闻远方有你2 》

售價:NT$ 240.0
牛津分配正义手册
《 牛津分配正义手册 》

售價:NT$ 2016.0
全域增长:从战略制定到战术执行
《 全域增长:从战略制定到战术执行 》

售價:NT$ 661.0

建議一齊購買:

+

NT$ 713
《 系统架构设计师教程(第4版) 》
+

NT$ 641
《 分布式服务架构:原理、设计与实战 》
+

NT$ 396
《 编程风格:好代码的逻辑 》
+

NT$ 425
《 软件架构设计:实用方法及实践 》
+

NT$ 468
《 自己动手写Docker 》
+

NT$ 641
《 高性能服务系统构建与实战 》
編輯推薦:
《软件是这样炼成的软件架构设计实现》是《软件是这样炼成的软件过程管理与软件测试过程》和《软件是这样炼成的从软件需求分析到软件架构设计》设计的*后延续,同样用投核保系统为本书*的、连贯性的案例解读软件架构设计。通过独特的场景描述、纪实性的记录手法,深入剖析了系统开发模式、各种工具的安装与配置过程、数据架构设计实现过程和软件架构设计实现等四方面的内容。本系列书是作者对自己多年的软件开发的工作和培训经验、技术要领和心得的总结和升华,以软件生命周期为主线,将各种软件开发相关的思想、方法、工具、技术点巧妙地穿插其中,图表详尽、案例难易适中、内容通俗易懂、语言严谨但不失活泼,真可谓是详实的软件炼成教学片,完整的软件炼成纪录片,每一位软件开发和管理从业人员必备的软件修炼宝典!
內容簡介:
《软件是这样炼成的软件架构设计实现》是《软件是这样炼成的软件过程管理与软件测试》和《软件是这样炼成的从软件需求分析到软件架构设计》的延续,将投核保系统作为*的、连贯性的案例全程记录和解读软件架构设计。本书从文字组织到结构设计方面既不是以理论为主调的学院派编写风格,也不是以应用介绍为主调的应用派编写风格,而是采用了情景对话、场景再现、自然语言的叙述方式。本书是在解读投核保系统的详细设计、数据库设计和软件详细设计的基础上介绍了软件开发过程管理中应用的理论知识以及这些知识的应用,同时分析了这些理论知识的应用场景,然后以投核保系统为案例将软件开发过程中各个阶段的成果完整地展现给读者。
本书包括四篇,即*篇开发之旅起航、第二篇软件开发环境设计实现、第三篇基于Oracle的数据架构设计实现和第四篇基于Struts 2.0 EJB 3.0的软件架构设计实现。本书可以让读者了解如何在解读架构设计的基础上完成企业软件开发的过程,适合于从事软件开发的软件开发管理人员、系统分析师、架构师、程序员阅读,也适合于计算机相关专业的毕业生在就业之前了解企业软件开发的过程,同时也可以作为大学计算机软件专业项目实训的参考教材。
關於作者:
王朔韬,1995年毕业于西安公路交通大学(现长安大学),从事软件开发工作将近20年; 2004年至今,主要从事软件企业管理咨询工作,咨询内容包括软件企业开发过程咨询及大型非软件企业的信息化建设规划等,咨询的客户包括南方航空公司、上海沪东中华造船厂等几十家软件企业及大型非软件企业; 2009年担任IBM高校师资培训主讲老师,也承担怀华学院计算机系部分课程的讲授工作,主要研究方向是软件企业开发过程改进和软件架构。作者目前已与清华大学出版社合作出版了《软件是这样炼成的从软件需求分析到软件架构设计》、《软件是这样炼成的软件过程管理与软件测试》,《软件是这样炼成的软件架构设计实现》是前两本书的设计实现。
目錄
目录


系列书引言

第一篇开发之旅起航

第1章程序员辞职报告讨论

第2章设计实现过程讨论

第3章关于高素质程序员的讨论

3.1高素质程序员应该具有哪些
职业素养

3.2讨论异常

3.3讨论高质量程序代码

3.4解读详细设计报告,编写程序代码

3.5小结

第4章投核保系统编码规范
4.1排版规范

4.1.1注释规范

4.1.2命名规范

4.1.3编码规范

4.2投核保系统的代码走查说明

4.2.1代码走查规则

4.2.2代码走查报告

第5章本书导读
5.1本书的编写思路

5.2本书结构说明及系列书关联说明

第6章开发模式选择
第二篇软件开发环境设计实现

第7章搭建项目组开发环境
7.1关于项目组开发环境的讨论

7.2解读配置图,绘制开发环境
网络拓扑

第8章Oracle WebLogic介绍
8.1Oracle WebLogic概述

8.2Oracle WebLogic的安装

8.3创建域

第9章Oracle数据库介绍
9.1Oracle数据库概述

9.2Oracle数据库体系结构

9.2.1数据库存储结构

9.2.2内存结构

9.2.3实例体系结构

9.2.4实例进程结构

9.2.5数据字典

9.3Oracle产品介绍

9.3.1数据库服务器及投核保系统

9.3.2应用服务器

9.4企业管理器

9.5Oracle客户端工具的选择

第10章Oracle数据库开发环境的
搭建
10.1解读数据库设计报告,规划数据库
安装

10.1.1解读需求分析报告

10.1.2安装数据库的软硬件要求

10.1.3投核保系统数据库服务器
开发时的参数

10.2安装Oracle软件

10.2.1Oracle 11g的下载

10.2.2Oracle 11g的安装

10.3使用DBCA创建数据库

10.4配置Net Configuration Assistant

第11章投核保系统软件配置管理
过程及工具选择
11.1关于软件配置管理过程的讨论

11.2投核保系统软件配置过程规范

11.3投核保系统配置库使用制度

11.4关于配置管理工具的选择

第12章解读配置管理计划,搭建
配置管理环境
12.1投核保系统软件配置管理计划
全文

12.2CVS配置管理工具介绍

12.2.1CVS简介

12.2.2CVS中的基本概念

12.2.3环境搭建的准备

12.3投核保系统软件配置管理服务器
CVS的安装与配置

12.3.1安装及配置CVS服务器

12.3.2配置投核保系统的配置库
结构

12.3.3CVS用户的权限分配

12.4投核保管理系统CVS客户端的
安装与配置

12.4.1WinCVS客户端的安装

12.4.2WinCVS客户端的配置

第13章投核保系统开发环境
配置手册
13.1投核保系统开发环境的配置

13.2开发环境配置表

13.2.1数据库开发组开发环境
配置表

13.2.2业务逻辑开发环境配置表

13.2.3表示层开发环境配置表

13.3JDK 7.0的安装与配置

13.4MyEclipse的安装

13.5部署EJB服务

13.6安装与配置JUnit

13.7安装与配置Ant

13.7.1安装Ant

13.7.2配置Ant

13.7.3Ant与JUnit的集成

13.8在MyEclipse中配置Oracle
数据源

13.9安装Eclipse HTML Editor

第三篇基于Oracle的数据架
构设计实现
第14章投核保系统数据库设计
报告
14.1引言

14.1.1编写目的

14.1.2预期待和阅读建议

14.1.3参考资料

14.2数据库设计命名规范

14.2.1数据库设计字符规范

14.2.2数据库对象命名规范

14.3数据库实体关系设计

14.4数据库逻辑设计

14.5数据库物理设计

14.5.1投核保系统数据库物理设
计图

14.5.2初始数据库大小

14.5.3数据库增长速度

14.5.4记录查找的类型和平均数量

14.5.5网络和共享访问需求

14.5.6性能

14.5.7安全性

14.5.8数据备份和恢复

14.5.9数据库及数据表空间设计

14.6数据库基本表设计

14.7索引设计

14.8视图设计

14.9授权设计

第15章投核保系统数据库实施
讨论
15.1数据库实施过程讨论

15.2关于优化实例内存的讨论

第16章Oracle SQL简介
16.1SQL语言概述

16.1.1SQL语言的特点

16.1.2SQL语言的编写规则

16.2SQL语言的分类

16.3不同类型的SQL语言场景分析

16.3.1SQL查询语言应用场景分析

16.3.2DML语言应用场景分析

16.3.3TCL语言应用场景分析

16.3.4DDL语言应用场景分析

16.3.5DCL语言应用场景分析

第17章Oracle Enterprise Management
介绍
17.1配置Oracle Enterprise Manager

17.2主目录

17.3性能

17.3.1CPU性能

17.3.2吞吐量

17.3.3IO

17.3.4并行执行

17.3.5服务

17.4可用性

17.4.1高可用性控制台

17.4.2备份恢复

17.4.3Oracle Secure Backup

17.5服务器

17.5.1存储

17.5.2数据库配置

17.5.3Oracle Scheduler

17.6方案

17.6.1数据库对象

17.6.2程序

17.6.3实体化视图

17.6.4用户定义类型

17.7数据移动

17.8软件和支持

17.9小结

第18章Oracle SQL Developer介绍
18.1创建数据库连接

18.2对象浏览窗口

18.3使用SQL Developer调试
PLSQL

18.4菜单栏

18.5小结

第19章SQL Plus介绍
19.1SQL Plus简介

19.2SQL语句、PLSQL块和SQL
Plus命令之间的区别

19.3SQL Plus的启动

19.4使用SQL Plus的编辑功能

19.4.1编辑命令

19.4.2保存命令

19.4.3加入注释

19.4.4运行命令

19.4.5跟踪语句

19.4.6环境参数的设置

19.5小结

第20章投核保系统表空间
设计实现
20.1关于表空间的讨论

20.2Oracle表空间介绍

20.2.1Oracle数据存储模型

20.2.2Oracle 11g表空间类型

20.3解读数据库设计报告,规划表
空间

20.4使用OEM创建数据表空间

20.5使用SQL Plus创建数据表空间

20.6管理表空间

20.6.1通过Oracle Enterprise Manager
管理表空间

20.6.2通过SQL Developer管理表
空间

第21章投核保系统数据表
设计实现
21.1Oracle概述表概述

21.1.1数据表的数据类型

21.1.2数据表的分区

21.1.3创建数据表时的注意事项

21.2解读数据库设计报告,分析
数据表

21.3使用SQL Developer创建数据表

21.4使用SQL Plus管理数据表

21.4.1管理表

21.4.2管理表分区

21.5关于优化数据表性能的讨论

第22章SQL SELECT语句研究
22.1SQL SELECT语句的格式

22.1.1SELECT语句的语法格式

22.1.2SELECT语句的编写规则

22.1.3Oracle SELECT的执行步骤

22.2使用WHERE子句限制条件
指定行

22.3使用ORDER BY排序

22.4使用DISTINCT检索唯一的
表列值

22.5使用GROUP BY进行数据分组

22.6使用HAVING分组数据

22.7表的连接

22.7.1左外连接

22.7.2右外连接

22.7.3全外连接

22.7.4自连接

22.8输出目标INTO子句

22.9复杂SELECT语句的使用

22.9.1集合操作

22.9.2子查询

22.9.3CASE语句的使用

22.10关于SQL SELECT语句
性能的讨论

第23章投核保系统索引
设计实现
23.1Oracle索引概述

23.2索引类型及应用场景

23.2.1B*树索引

23.2.2反向索引

23.2.3降序索引

23.2.4位图索引

23.2.5函数索引

23.3索引分区

23.3.1全局索引的特点

23.3.2本地索引的特点

23.4解读数据库设计报告,分析
数据表索引

23.5使用SQL Developer创建索引

23.6使用SQL Plus管理索引

23.6.1建立索引

23.6.2管理索引

23.6.3管理索引分区

23.7关于索引性能的讨论

第24章投核保系统视图
设计实现
24.1视图介绍

24.1.1视图的概念

24.1.2视图的优点

24.1.3视图的分类

24.2解读数据库设计报告,设计视图


24.3使用SQL Developer创建视图

24.4使用SQL Plus管理视图

24.4.1创建视图

24.4.2更改视图

24.4.3删除视图

24.4.4查看视图

第25章存储过程与触发器
设计实现
25.1存储过程介绍

25.1.1存储过程的概念

25.1.2存储过程的优点

25.1.3存储过程的语法格式

25.2触发器介绍

25.2.1触发器的概念

25.2.2触发器的语法格式

25.2.3触发器的组成

25.3解读数据库设计报告,规划存储
过程与触发器

25.3.1存储过程的规划

25.3.2触发器的规划

25.4使用SQL Developer开发触发器

25.5使用SQL Developer开发存储
过程

25.5.1创建存储过程

25.5.2修改存储过程

25.6存储过程例程

第26章投核保系统数据库
用户管理
26.1Oracle用户、角色、权限和模式

26.2解读数据库设计报告,规划角色

26.2.1DBA角色的规划

26.2.2开发者角色的规划

26.2.3公司管理层对象的操作授权

26.2.4部门管理的操作授权

26.2.5公司业务人员的操作授权

26.3创建和管理角色

26.3.1创建角色

26.3.2通过SQL Plus管理角色

26.3.3查看角色

26.4使用者组

26.5创建和管理用户账户

26.5.1使用Oracle Enterprise Manager
完成用户的创建

26.5.2使用SQL Plus管理用户

第27章投核保系统数据库安全性
设计实现
27.1Oracle安全性设计要求

27.2解读数据库设计报告,管理用户
资源

27.2.1用户资源的基本概念

27.2.2投核保系统用户资源配置表

27.3Oracle用户资源配置的设计实现

27.3.1使用Oracle Enterpeise
Management配置用户
资源

27.3.2使用SQL Developer创建
概要文件

27.4Oracle数据库审计

27.4.1审计的概念

27.4.2投核保系统的用户角色
审计说明

27.4.3使用Oracle Enterprise
Management实现审计
功能

27.5透明数据加密

第28章关于数据库设计实现
总结
第四篇基于Struts 2.0 EJB 3.0
的软件架构设计实现
第29章开发模式与开发流程
讨论
29.1开发模式的讨论

29.2开发流程的讨论

第30章本篇导读
30.1编写原因及思路

30.1.1编写本篇的原因

30.1.2编写本篇的思路

30.2本篇的组织

第31章使用MyEclipse配置
WebLogic
31.1在MyEclipse中配置WebLogic
服务器

31.2在MyEclipse中配置WebLogic
开发包

第32章在MyEclipse中创建工程包
和Java文件
32.1关于工程文件的讨论

32.2解读投核保系统的包设计,规划
工程文件

32.2.1工程文件的设计原则

32.2.2解读投核保系统包图,完成
工程文件的设计

32.3使用MyEclipse创建工程、包和
程序文件

32.3.1创建工程

32.3.2创建包

32.3.3创建Java程序

第33章投核保系统异常设计
实现
33.1关于异常的讨论

33.2预备知识

33.2.1Java异常

33.2.2业务异常

33.3异常处理设计

33.3.1程序异常处理流程

33.3.2业务异常处理方法

33.4异常设计实现

33.4.1接口程序

33.4.2异常处理实现程序

第34章EJB 3.0简单介绍
34.1会话Bean

34.1.1无状态会话Bean

34.1.2有状态会话Bean

34.1.3有状态会话Bean和无状态
会话Bean的区别

34.2实体Bean

34.3消息驱动Bean

34.4事务管理

34.5小结

第35章投核保系统数据库
连接实现
35.1JDBC基础

35.1.1预备知识

35.1.2JDBC连接数据库的流程
及原理

35.1.3Oracle的JDBC驱动方式

35.2数据库连接的讨论

35.2.1关于数据库产品用户数
的讨论

35.2.2关于JDBC连接数据库
性能的讨论

35.3数据库连接的实现

35.3.1数据库连接与Oracle用户
权限问题

35.3.2程序结构设计

35.3.3数据源配置参数的设置

35.4数据库连接的代码

第36章Java调用存储过程的
基本流程
36.1存储过程简述

36.2调用的基本流程

第37章投核保系统实体Bean
设计实现
37.1预备知识

37.1.1CMP实体Bean介绍

37.1.2CMP实体Bean的生命
周期状态

37.1.3CMP持久化实体管理器

37.1.4CMP实体Bean的关联关系

37.2关于实体Bean的讨论

37.3解读投核保系统的实体Bean
设计,完成设计实现

37.4实体Bean实现例程

37.5实体Bean程序包结构

第38章投核保系统业务Bean
设计实现
38.1预备知识

38.1.1会话Bean介绍

38.1.2消息驱动Bean介绍

38.1.3业务Bean调用实体Bean

38.2关于业务Bean的讨论

38.3解读投核保系统详细设计,组织
会话Bean程序

38.4投核保系统中投保建档的相关源
程序代码

38.4.1相关接口源程序代码展示

38.4.2业务Bean源程序代码

38.5投核保系统中业务逻辑层源程序
的包文件结构

第39章投核保系统业务逻辑
编译与发布
39.1Javadoc的注释规范

39.1.1Java文档和Javadoc

39.1.2文档注释的格式

39.1.3使用Javadoc标记

39.1.4Javadoc命令

39.2使用MyEclipse生成Javadoc
开发文档并发布

39.3将投核保系统的业务逻辑应用
发布到服务器

第40章Struts 2.0介绍
40.1Struts 2.0配置文件介绍

40.1.1web.xml介绍

40.1.2struts.xml介绍

40.1.3struts.properties文件

40.2Struts 2.0数据类型的转换

40.2.1数据类型转换的分类

40.2.2常用类型转换器

40.2.3自定义类型转换器

40.2.4注册自定义类型转换器

40.2.5类型转换中的错误处理

40.3Struts 2.0校验

40.3.1Struts 2.0编程式校验

40.3.2配置式校验

40.3.3内建校验器

40.4Struts 2.0国际化

40.5Struts 2.0标签库

40.6小结

第41章在MyEclipse中配置
Struts开发环境

第42章Struts 2.0与业务逻辑
集成
42.1在MyEclispe中配置业务逻辑
程序包

42.2对Action连接EJB的讨论

42.3Struts 2.0连接EJB的例程

42.3.1Action连接EJB业务逻辑
的程序规划

42.3.2Action连接EJB业务逻辑
的例程

第43章投核保系统Action开发
与Struts配置
43.1预备知识

43.2关于Action与Struts配置的
讨论

43.3解读详细设计报告,完成Action
设计实现

43.3.1解读详细设计报告

43.3.2Action例程

43.4解读详细设计报告,编写Struts
配置文件

43.4.1解读struts.xml详细设计

43.4.2Struts配置文件例程

第44章投核保系统Struts数据
类型转换
44.1预备知识

44.1.1全局数据类型转换

44.1.2局部数据类型转换

44.1.3自定义类型转换器

44.1.4集合数据类型转换

44.1.5自动数据类型转换

44.2解读详细设计报告,完成数据
类型实现

44.3数据类型转换例程

第45章投核保系统Struts
数据校验实现
45.1预备知识

45.1.1Struts 2.0数据校验框架

45.1.2Struts 2.0数据校验流程

45.1.3在Struts 2.0中实现表单
数据校验

45.1.4使用Validation框架校验
数据

45.1.5Struts 2.0中数据校验文件
的配置方法

45.2解读详细设计报告,完成数据
校验实现

45.3数据校验例程

第46章投核保系统Struts
国际化编程
46.1预备知识

46.1.1Struts 2.0实现国际化的
运行机制

46.1.2用Struts 2.0加载国际化
资源文件

46.2解读数据字典并完成国际化设计

第47章Struts 2.0标签在投核保
系统中应用
47.1预备知识

47.1.1数据标签

47.1.2控制标签

47.1.3UI标签

47.2Struts 2.0标签在投核保系统中的
部分应用

第48章投核保系统Struts
拦截器编程
48.1Struts 2.0拦截器简介

48.2关于拦截器的讨论

48.3拦截器在投核保系统中的应用

48.3.1用户登录验证

48.3.2投保书操作日志

48.3.3问题件操作日志

48.4Struts 2.0拦截器配置方法

48.4.1默认拦截器的定义

48.4.2自定义拦截器

48.4.3配置全局拦截器

48.5投核保系统拦截器例程

第49章表现层页面设计实现
49.1HJCA的应用

49.1.1HJCA在投核保系统中
的应用

49.1.2动态生成页面的HJCA
技术应用

49.1.3柜员业务页面的HJCA
技术应用

49.1.4HJCA在投保建档中的应用

49.2关于表现层实现的讨论

49.3解读页面设计,完成代码规划

49.3.1关于界面元素设计的讨论

49.3.2界面设计原则

49.3.3界面元素设计

第50章编写编码报告
50.1关于编码报告的讨论

50.2投核保系统编码报告样例

后记
內容試閱
前言
经过多年的积累以及整理和思考,软件是这样炼成的系列书终于在艰难中分娩了,《软件是这样炼成的从软件需求分析到软件架构设计》和《软件是这样炼成的软件过程管理与软件测试》相继出版发行,读者数量也不错,有许多忠实的读者通过微信和QQ消息发来了最为诚恳的建议,这些读者给了我继续写下去的动力。本书书名为《软件是这样炼成的软件架构设计实现》,这本书的出版完成了一个项目的全程记录,将投核保系统项目的全部过程展现给读者,让读者通过项目感悟项目开发过程中可能遇到的各种挫折及解决问题的思路。本系列书的最大特点是将学院派和应用派的两大著书思想有效地结合起来,既没有专注讲空洞的理论,也没有专注于讲宽泛的应用,将理论与实践融合起来,能够给读者以新的感受和收获。在文字组织上,本系列书采取了场景再现、情景对话等方式,将软件企业开发过程中的软件过程改进、软件过程管理和软件测试过程全面展现给读者。本书自始至终使用保险公司的投核保系统作为唯一案例,将软件开发的各个环节串连起来,使得读者能够系统地、完整地了解项目开发的全部过程。本书由四篇共50章组成。第一篇开发之旅起航以投核保系统为案例,通过叙事方式分析软件编程设计过程中存在的问题,并且引出了投核保系统的开发模式; 第二篇以投核保系统配置图为设计依据,全面介绍了各种工具的安装与配置过程; 第三篇是以投核保系统为案例,以投核保系统数据架构设计为唯一依据,介绍了基于Oracle的数据架构设计实现过程; 第四篇是以投核保系统详细设计架构为设计依据,介绍了基于Struts 2.0和EJB 3.0的技术方法将软件架构设计最终落实到具体的代码上。《软件是这样炼成的从软件需求分析到软件架构设计》和《软件是这样炼成的软件过程管理与软件测试》两本书出版以后得到了广大读者的殷切关注和大力支持,并且提出了许多宝贵的意见,这里表示真心的感谢,希望各位继续提出宝贵的意见。在本书的编写过程中得到了家人和朋友的大力支持,在此我要感谢我的妻子商莉和我的女儿王贝思给予我的最大的支持,同时感谢我的好朋友罗少木和姜伟给予我的帮助和大力支持。由于作者水平有限,书中难免有疏漏和不足之处,恳请各位专家和广大读者提出宝贵的意见。如果读者在阅读过程中遇到问题,可以直接和本人联系。QQ: 307050843。作者2017年5月


第3章关于高素质程序员的讨论
特别说明,本章部分内容转自作者本人专著《软件是这样炼成的从软件需求分析到软件架构设计》的第28章,不管你是否读过这本书,建议你不要跳过本章阅读,请你耐心看完,必有收获。3.1高素质程序员应该具有哪些职业素养谈到高素质程序员,其不仅具有高超的技术水平,还应该具有职业素养和工作能动性。在这里我对程序员应该具有的职业素养做一下简单介绍。首先,如果真想做程序员,应该肯定地认为选择做程序员符合自己的兴趣和志向,是对自己智慧和能力的挑战,如果不想在这个职业里混,那就什么也谈不上了。一个人要有所成就,就需要在一个行业中积累一段时间,这样才能获得足够的经验值。其次,我们在做事的时候要主动,越主动,我们得到的机会就会越多。在我们公司,张伟本是一个初级程序员,但是他的工作业务水平很不错,平常也乐意帮助别人。有一次公司要开发一个MIS系统,这个系统要用到Oracle数据库,由于我们公司第一次使用Oracle数据库,没有人懂得这些知识,我当时挑选了一位我认为不错的程序员张伟来负责Oracle数据库的安装与建库等工作,但是这位程序员建议公司派他出去培训。有一天,张伟告诉我,他已经基本掌握了Oracle数据库的应用,他是在公司下班后利用业余时间钻研的,我当时很感动,并且答应了他的要求,结果张伟做得确实不错,就这样,我给他了更多的机会让他成长,使他在公司里的地位各方面都有所上升。我们说到主动,在做软件的过程中,一种状态是等客户提供需求,然后规规矩矩地将其实现,这是一个合格的程序员的做法; 另外一种做法则是能够主动出击,能够将其他软件的一些优点也提供给用户,逐步从被用户牵着走到自己引导客户转变,这实际上是信息地位的变化,谁处在引导者地位,谁就在实际情况中处于优势地位,对于这一点大家可以多体会一下。再次,在我们这个职业当中,掌握与计算机相关的知识并且具有宽知识面是非常有用的,做软件的人需要了解硬件,做.Net的人需要了解Java,做行业软件需要了解通用软件,为什么这样说呢,因为在现实当中我们会碰到很多复杂的情况需要解决,客户的需求是会不断变化的,我们要通过较宽的知识面理解和挖掘客户需求。我们应该把Java学好,因为投核保系统本身应用的是基于Java技术的Java EE技术,如果我们能够很好地理解和应用Java知识,在学习和应用Java EE的过程中就会非常轻松,并且能够编写出高质量的Java程序。如果要成为一位高素质的程序员,不仅应该具有职业素质,还应该具有高的技术水平,比如说如何处理异常,如何编写出高质量的程序代码,如何解读详细设计编程程序等。下面我们对程序员的Java技术要求方面展开讨论。3.2讨论异常晨落: 请大家回答一个问题,一个项目运行的可靠性和稳定性是由什么决定的?JackJeff: 决定因素是对语法的熟练程度和算法是否很精炼。晨落: 我们在编写一段程序代码的过程中主要考虑哪些方面的内容?JackJeff: 主要考虑语法应用、算法是否精炼和对资源的消耗,争取做到在资源低消耗的情况下提高程序的运行速度。晨落: 请你编写一段代码,这段代码是按行读取A驱动器上名为good.txt的文件。JackJeff: 用什么语言?晨落: Java。JackJeff的代码如下:
Importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.text.
public class ReadFromFile {
**
* 以行为单位读取文件,常用于读面向行的格式化文件
*
public static void readFileByLinesString fileName
{
File file = new FilefileName;
BufferedReader reader = null;
System.out.println"以行为单位读取文件内容,一次读一整行: ";
reader = new BufferedReadernew FileReaderfile;
String tempString = null;
int line = 1;
一次读入一行,直到读入null时文件结束
while tempString = reader.readLine != null
{
显示行号
System.out.println"line " line ": " tempString;
line;
}
reader.close;
}
public static void mainString[] args
{
String fileName = "A: good.txt";
ReadFromFile.readFileByLinesfileName;
}
}
晨落: 我们来分析一下你的程序代码,你觉得有没有必要完善一下以上的程序代码?JackJeff: 没有。晨落: 如果A驱动器中没有盘怎么办?JackJeff: 这需要客户来控制异常信息输入,不是编程人员思考的问题。晨落: 那你觉得程序员的主要任务是什么?JackJeff: 程序员的主要任务就是编写好自己的代码。晨落: 你的编程思想是不少程序员的基本思想,在编程的过程中只关注程序代码,不关注程序异常。你编写的实现读取A驱动器中文件的程序至少有20多个异常可能发生,然而在你编写的程序代码中没有对这些异常进行任何处理。按正常情况,程序员应该将70%左右的时间花在程序异常处理中。但我们的程序员几乎很少思考异常,特别是对业务异常的思考更少。JackJeff: 那么异常是什么意思?为什么要处理异常?晨落: 按照正常词汇解释,异常就是不同于正常情况的状态。异常属于中性词,比如异常的好、异常的坏等,异常这个词汇可以用到不同的场景,具有修饰的作用。在大型软件开发中,最大的问题就是错误连篇的、不稳定的代码。而在设计与实现中,最大的开销花在测试、查找和修改错误上。程序的异常一种是编译错误,一种是运行时发生的错误,还有一种是我们经常忽略的业务逻辑错误。逻辑错误是由于不当的设计造成的,一般只有用户做了某些出乎意料的事才出现。运行异常可以预料,但不能避免,它也是由于不当的设计造成的。这些错误会使程序变得脆弱,然而这些错误是能够预料的,通常加入一些预防代码即可防止这些异常发生。有些异常是设计和开发过程中最容易忽略的异常,这种异常给客户带来的损失往往是非常大的甚至是致命的。JackJeff: 在系统架构过程中我们如何规划和设计异常?将异常设计作为系统架构的重要组成吗?晨落: 这正是本章需要考虑的问题,我们后面将详细介绍,并针对投核保系统具体项目规划异常。JackJeff: 异常处理的重要性在哪里?晨落: 任何一个系统架构必须充分考虑系统的异常并且及时捕获异常有效处理,没有考虑异常的系统就如同没有消防通道的大楼一样,一旦发现异常对系统来说往往是毁灭性的。JackJeff: 投核保系统的异常处理包含了哪些内容?晨落: 为了满足用户需求,增强系统的可靠性和可维护性,在投核保系统中专门设计了一套异常处理机制,正确地运用这套机制有助于提高程序的健壮性。所谓程序的健壮性就是指程序在多数情况下能够正常运行,返回预期的正确结果; 如果偶尔遇到异常情况,程序也能采取周到的解决措施。不健壮的程序则没有事先充分预计到可能出现的异常,或者没有提供强有力的异常解决措施,导致程序在运行时经常莫名其妙地终止,或者返回错误的运行结果,而且难以检测出现异常的原因。所以,在系统架构中将异常作为重要内容进行设计是非常有必要的,也是非常重要的。3.3讨论高质量程序代码晨落: 刚才和JackJeff就异常处理进行了讨论,在这部分内容中,我们仅仅是抛砖引玉地抛出了一个主题,那就是程序员不仅仅是语法的使用者,更多的是需要从工程的角度、质量的角度进行思考。所以,下面针对高质量程序代码方面和大家进行讨论,在这里我所表述的内容只是本人对Java高质量程序代码的理解,不代表高质量程序代码的标准。请各位踊跃讨论,共同学习。张磊: 老师,对于JackJeff的代码,您提到了异常处理的重要性,我建议我们现在对Java程序中的异常问题进行讨论,请问如何确定异常情况呢?晨落: 我将异常分为两大类,当然不同的人有不同的分法,我将异常分为业务异常和程序异常两大类。业务异常其实是可控制的,也是可预计的,只要按照业务规则或数据字典对数据和业务进行异常捕获,并且定义异常处理类处理异常即可。难度在于虽然程序异常处理了,但有许多异常是不可预见的。张伟: 对这个问题我有些理解,我说一下我的观点,看大家能否接受?晨落: 太好了,我希望大家共同讨论、共同学习,不希望以说教的方式来告诉大家知识,而是通过讨论和大家的思考最终使大家深刻理解每个知识点。请张伟谈一谈对程序异常方面的看法。张伟: 异常不是在任何情况下都适用,但是,一旦决定使用异常就必须按照异常的规则执行异常。比如说如何确定需要抛出的异常,异常与方法的关系,用Error的子类来表示系统级的异常和程序不必处理的异常,用链式异常来保存原始异常信息。我总结了异常处理的几个经验。王鹏: 你可以再详细说一下吗?张伟: 首先,如果是可恢复错误,使用检查型异常;如果是编程错误,使用非检查型异常。许多Java编程人员很苦恼,到底是该选择检查型异常还是选择非检查型异常。检查型异常是一种从语言到强制程序员编写代码的一种方式,可以保证程序员对错误条件提供异常处理代码,但同时会引入大量杂乱的代码导致其不可读。如果程序员有恢复策略,这样做看起来似乎也可以。其次,在Java程序处理异常后要适当地释放资源。Java程序员对此都有所了解,在处理网络和IO类的时候相当于一个标准。在finally块中关闭资源,在正常和异常执行的情况下保证之前和稀缺资源的合理释放,这由finally块保证。第三,始终提供关于异常的有意义的完整信息,异常信息非常重要,因为这是Java程序员最先看到的一个地方,在这里会有非常精确并且真实的信息,他们可以找到问题产生的根本原因。第四,避免过度使用检查型异常,虽然检查型异常在强制执行方面有一定的优势,但同时它也破坏了代码,通过掩盖业务逻辑使代码的可读性降低。所以,Java程序员要注意不能过度使用检查型异常,可以最大程度地减少这类情况,这样会得到更精准、简洁的代码。第五,对于性能而言,异常的代价比较高,还会让代码的运行变得缓慢。如果你有方法从ResultSet中进行读取,这时常会抛出SQLException异常而不会移到下一个元素,这将会比不抛出异常的正常代码的执行速度慢很多。因此,Java程序员要最大限度地减少不必要的异常捕捉和移动。如果你能使用boolean变量表示执行结果,而不仅仅是抛出和捕捉异常,你就可能得到更简洁、性能更高的解决方案。第六,没有什么比空的catch块更糟糕的了,因为它不仅隐藏了错误和异常,还可能导致你的对象处于不可使用的状态。空的catch块没有任何意义,如果你非常肯定异常不会继续以任何方式影响对象状态,在程序执行期间用日志记录错误依然是最好的方法。最后,Java提供了throw和throws关键字来抛出异常,在Javadoc中用@throw记录任何方法可能会抛出的异常。如果我们编写API或者公共接口,这就变得非常重要。任何方法抛出的异常都有相应的文档记录,这样你就能提醒任何使用该方法的人,为系统的维护提供了很大的方便。张亮: 老师,高质量的程序代码包括代码风格的约定吗?晨落: 当然包括了,但是我们今天不对此进行讨论,我们将专门设一个章节讨论Java代码的风格和规范问题。内存管理是编写Java程序必须考虑的问题之一,如果不合理地使用内存将会影响Java代码的质量等。请问谁可以说明分析一下?张杰: 我对这个概念虽然明白,但是没有思考过太多。老师,请问Java是如何管理内存的?晨落: Java的内存管理包括对象的分配和释放两个部分。内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间基本类型除外,所有的对象都在堆Heap中分配空间。内存的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作,但同时也加重了JVM的工作。因为GC为了能够正确地释放对象,必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。韩磊: 那么什么叫Java的内存泄漏呢?晨落: 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点。首先,存在该内存对象的引用; 其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以被判定为Java中的内存泄漏,这些对象虽然不会被GC回收,但是它却占用内存。田亮: 请问老师,内存有哪些类型,如何使用内存呢?晨落: Java把内存分两种,一种是栈内存,另一种是堆内存。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配; 堆内存用来存放由new创建的对象和数组以及对象的实例变量,在函数代码块中定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量分配的内存空间; 在堆中分配的内存由Java虚拟机的自动垃圾回收器来管理。堆的优势是可以动态地分配内存大小,在生存期也不必事先告诉编译器,因为它是在运行时动态地分配内存的。其缺点是要在运行时动态地分配内存,存取的速度较慢。栈的优势是存取速度比堆快,仅次于直接位于CPU中的寄存器。另外,栈数据可以共享,缺点是保存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。郭涛: 什么时候需要注意内存泄漏?晨落: 如果在你的程序执行一段时间之后遇到Java.lang.OutOfMemoryError,内存泄漏无疑是最值得怀疑的。那么除了这种明显的情况以外,什么时候需要考虑内存泄漏?如果要求更高,内存泄漏都需要进行审查和更改。然而,在跳到这一结论之前还需要考虑其他几个因素,即程序的生命周期以及内存泄漏的大小。考虑一下在一个程序的生命周期里垃圾收集器可能从未执行的情况,无法保证什么时候JVM会调用垃圾收集器程序显式调用System.gc。通常情况下,垃圾收集器不会自动运行,直到程序需要比目前的可用内存还要多的内存。此时,JVM会首先尝试调用垃圾收集器以获取更多的可用内存。如果这个尝试仍然不能够释放出足够的资源,JVM将会从操作系统获取更多的内存,直到达到允许的内存的最大值。郭涛: 那如何判断内存泄漏呢?晨落: 查看一个运行在Windows平台上的Java程序是否内存泄漏,可以简单地在程序运行的时候观察任务管理器中的内存设置。然而,我们在观察一些运行中的Java程序之后会发现,它们与本地应用程序相比使用了更多的内存。我开发过的一些Java项目会启用10~20MB的系统内存。与这个数字相比,本地的操作系统自带的Windows Explorer程序使用5MB。对于Java程序的内存使用,另一个需要注意的是典型的运行在IBM JDK 1.1.8 JVM上的程序似乎在其运行时不断吞噬了越来越多的系统内存,程序似乎永远不会返回一些内存给操作系统,直到将一个非常大的物理内存分配给它,这会不会就是内存泄漏的迹象。如果要明白怎么回事,需要熟悉JVM是如何将系统内存用作自己的堆的。在运行Java.exe时,你可以使用一些特定的选项来控制垃圾收集的堆的启动容量和最大容量分别是ms和mx。Sun的JDK 1.1.8默认使用1 MB的启动设置和16 MB的最大设置。IBM JDK的1.1.8默认使用计算机的物理内存容量的一半作为最大设置。这些内存设置对JVM发生内存溢出时的做法具有直接影响,这时JVM可能会继续增加堆内存,而不是等待一个垃圾回收的结束。因此,为了寻找并最终消除内存泄漏,需要用比任务监视程序更好的工具。当你想检测内存泄漏的时候,内存调试程序就可以派上用场了。这些程序通常会给你堆内存里对象的数量、每个对象实例的个数以及对象使用中的内存等信息。此外,它们还会提供很有用的视图,这些视图可以显示每个对象的引用和引用者,以便你跟踪内存泄漏的来源。田亮: 请问如何防止内存泄漏?晨落: 通过对一些常见问题的注意来防止内存泄漏。容器类(比如哈希表和向量)是常见的找到引起内存泄漏的地方,尤其是当这些类被声明为静态的并存活于应用程序的整个生命周期之中时。另一个常见的导致内存泄漏的问题是你将一个类注册为事件监听器,却没有考虑当这个类不再需要时将其注销,还有就是指向其他类的成员变量在恰当的时候要设置为null。当然不仅仅是这些。张伟: 各种对象关系如何处理,能够给一个好的建议吗?晨落: 这是一个很大的话题,但是我觉得考虑以下几点就可以了。第一,尽量用接口代替抽象类; 第二,不要同时使用重载和覆盖等; 第三,正确地使用集成表示分类关系; 第四,尽量用组合表示包含关系。李锐: Java程序的执行性能是衡量代码质量的重要内容之一,那么请问老师,对于性能方面你有哪些建议呢?晨落: 对于Java性能方面,我总结了一些经常采用的方法和技巧供大家参考。第一,Java程序设计中的一个普遍问题就是没有好好地利用Java语言本身提供的函数,从而经常会生成大量的对象或实例。由于系统不仅要花时间生成对象,以后还可能需要花时间对这些对象进行垃圾回收和处理,因此生成过多的对象将会给程序的性能带来很大的影响,建议大家尽量采用Java语言本身提供的函数。第二,对于异常方面,在Java语言中提供了trycatch来方便用户捕捉异常,进行异常的处理,但是如果使用不当,也会给Java程序的性能带来影响。因此,大家要注意一些技巧,比如避免对应用程序的逻辑使用trycatch,如果可以用if、while等逻辑语句来处理,那么就尽可能不用trycatch语句。另外还有重用异常,在必须进行异常的处理时要尽可能重用已经存在的异常对象。因为在异常的处理中,生成一个异常对象要消耗掉大部分的时间。第三,在一个高性能的应用程序中一般都会用到线程,因为线程能够充分利用系统的资源。在其他线程因为等待硬盘或网络读写时,程序能继续处理和运行。但如果对线程运用不当,也会影响程序的性能。第四,输入和输出包括很多方面,但涉及最多的操作是对硬盘、网络或数据库的读写操作。对于读写操作,又分为有缓存和没有缓存的; 对于数据库的操作,又有多种类型的JDBC驱动器可以选择,但无论怎样都会给程序的性能带来影响,比如使用输入输出缓冲尽可能地多使用缓存。如果要经常对缓存进行刷新flush,则建议不要使用缓存。又如输出流Output Stream和Unicode字符串,当使用Output Stream和Unicode字符串时,Write类的开销比较大,因为它要实现Unicode到字节byte的转换。因此,如果有可能,在使用Write类之前就实现转换或用OutputStream类代替Writer类来使用。如果使用String字符串进行写入,使用FileWriter比用OutputStream性能好。第五,还有一些小技巧,例如使用局部变量,避免在同一个类中通过调用函数或方法get或set来设置或调用变量,避免在循环中生成同一个变量或调用同一个函数参数变量也一样,尽可能地使用static、final、private等关键字。在复制大量数据时,通常使用System.arraycopy。3.4解读详细设计报告,编写程序代码刘柯迪: 老师,我今天看编程阶段的项目计划时实在不明白是什么意思,不知道应该如何带领我的程序员开展工作。晨落: 首先要弄清编码过程中项目计划制订的依据,编码过程中的工作安排的最关键因素是由架构决定的,不同的架构方式决定了编码的工作流程和工作安排。刘柯迪: 按照我们工作的传统方法,某个程序员是以功能需求为分配依据来安排工作的,比如说投核保系统中的投保建档部分,表示层、业务逻辑层、数据操作层和数据库建表等由一个程序员来完成,这样保证了程序员工作的连贯性。一个人编写整个系统容易调试,容易发现问题。晨落: 是的,你那是典型的作坊开发方式,这种方式很显然不适应现代软件工程对开发的需要。面向对象的软件开发方法的核心任务是软件代码的可复用性,在表示层我们可以看到相对独立的软件功能,但是当我们逐层深入的时候会发现许多逻辑层的每个模块之间有着千丝万缕的关联关系,并且业务功能表示层在调用业务逻辑层模块时有不少是相互重复的。这里以投核保系统的投保书信息查询为例,对于投保书信息的查询有可能在投核保系统中的所有表示层要用到,这样不同的程序员编写同一个功能,肯定会导致程序冗余,浪费劳动力。另外,架构的出发点就是基于服务的架构,也就是说每个类是为其他类提供服务的,在同一个架构层次中尽量减少了同一个服务功能的出现。我们可以把每个层次中的每个类理解为一个零件,每个零件完成其特有的功能,为其他类提供服务就可以了,至于其他类是谁,完全不必不知道,这样就减少了系统类之间的耦合度,提高了系统的可维护性。刘柯迪: 是的。晨落: 所以,架构的特性决定了编码的顺序是创建数据库实体Bean开发会话Bean开发业务逻辑开发表示层开发,这是由上一层是为下一层提供服务所决定的。刘柯迪: 请问老师,每个层次的开发只关注其提供的服务即可,那么系统的运行流程由谁来关注?晨落: 这当然不是程序员关注的内容了,就好像车间工人一样,工人在制造每个零部件的时候只要能够读懂某个零部件的设计图纸并按照设计人员规定的尺寸加工零部件就足够了,剩下的事情由设计人员来考虑。刘柯迪: 那么在编程过程中每个阶段的编程依据是什么?晨落: 数据库设计实现是解读数据库设计报告,根据数据库设计报告设计的内容创建数据表、编写视图实现、编写存储过程代码、编写触发器代码、完成数据库安全设计配置等。刘柯迪: 数据库开发环境的配置也是由程序来负责吗?晨落: 这由项目组内部协调,一般是由采购人员采购数据库开发硬件,然后由开发人员自行搭建数据库开发环境等。开发环境的搭建也一样。刘柯迪: 下一步的工作是什么?晨落: 在开发环境和测试环境搭建完成之后,由开发经理负责创建配置库。刘柯迪: 配置库结构按照配置管理计划中规定的进行吗?晨落: 是的,并且严格按照配置管理计划中所设定的权限分配要求分配给项目组成员,根据配置管理对权限的设定,项目组成员执行相应的任务。刘柯迪: 程序的发布由谁来负责?如何执行程序的发布?晨落: 程序员完成自己的编程任务后,由开发经理负责将程序编译成二进制文件,然后按照配置管理计划的相关约定添加到相应的配置库中,再按照设计发布于开发环境中。刘柯迪: 程序员阅读的文档有哪些?晨落: 负责搭建开发环境和测试环境的程序员只要负责解读概要设计的组件图、包图就可以了,而程序员要阅读每个类的设计文档。刘柯迪: 这么简单?晨落: 对,就这么简单。刘柯迪: 你帮我们做个示范,让我们体验一下,可以吗?晨落: 当然可以了,我随便找个类给大家示范一下。表31是投保书基本信息查询的一个会话Bean详细设计。程序员接受这个开发任务后,首先阅读基本信息,可以解读为投保书基本信息查询会话Bean的主要功能是为其他应用提供信息服务查询,包含5个方法体。
表31投保书信息查询会话Bean设计
类编号10101类名称ImplementsQueryProposalBaseInfoBean所属子系统不确定方法体个数5服务说明本Bean为客户端提供投保书基本信息查询服务方法体名称QueryByProposalNumber按照投保书编号查询
输入数据结构String数据元素ProposalNumber投保书编号
调用类及方法体ImplementsQueryProposalBaseInfoDBOperation.QueryByProposalNumber续表
返回数据结构ArrayList数据元素ProposalBaseInfo投保书基本信息
算法无状态改变及性质无数据表操作方法体名称QueryByProposalNumber
输入数据结构String数据元素ProposalNumber按照投保书编号查询
调用类及方法体ImplementsQueryProposalBaseInfoDBOperation.eQueryByProposalNumber按照投保书编号查询
返回数据结构Java Bean数据元素ProposalBaseInfo投保书基本信息
算法无状态改变及性质无数据表操作方法体名称QueryByRegistrationDate按照注册日期查询
输入数据结构Date数据元素RegistrationDate
调用类及方法体ImplementsQueryProposalBaseInfoDBOperation.QueryByRegistrationDate
返回数据结构ArrayListJava Bean数据元素ProposalBaseInfo投保书基本信息
算法While循环状态改变及类型无数据表操作方法体名称QueryByTheInsuredIDNumber
输入数据结构String数据元素TheInsuredIDNumber被保险人身份证
调用类及方法体ImplementsQueryProposalBaseInfoDBOperation.QueryByTheInsuredIDNumber
返回数据结构ArrayListJava Bean数据元素ProposalBaseInfo投保书基本信息
算法While状态改变及类型无数据表操作方法体名称QueryByProposerIDNumber
输入数据结构String数据元素ProposerIDNumber投保人身份证号码
调用类及方法体ImplementsQueryProposalBaseInfoDBOperation.QueryByProposerIDNumber
返回数据结构ArrayList数据元素ProposalBaseInfo投保书基本信息
算法无状态改变及类型无数据表操作对于一个设计得足够详细的设计文档,程序员是可以不看任何概要设计文档的,只要复制、粘贴就可以了。具体步骤如下:1 创建类文件,将类文件命名为ImplementsQueryProposalBaseInfoBean。2 导入该类文件使用的程序包,这些包包括两类,一类是开发系统所需要的程序包,另外一类是开发环境所需要的程序包。3 确认输入和输出参数中是否包含实体Bean类,如果有,查询包图,将实体Bean类也导入到该类中并加注释。4 解读方法体设计,完成方法体框架程序的编写并加注释。5 编码并加注释,在这里主要考查程序员的编程思想和设计能力。为了将编程过程介绍的更加清楚,本人将在例程31中详细分析,告诉各位编程思路是什么。6 编写编码报告。
【例程31】投保书基本信息查询Session Bean例程。
* *************************************
* 文件名: ImplementsQueryProposalBaseInfoBean.java
* 版权: 昂特拉软件公司
* 描述: 投保书基本信息查询实现的数据库操作类,主要完成与DBoperation的数据交换,
* 完成数据的查询以及返回结果值数组的组织。
* 修改人: 晨落
* 修改时间: 2012-7-25
* 修改单编号: 20120101-02-23
* 修改内容: 主要是添加了代码的解析说明*
*****************************************
package IUW.BO.BEAN.SESSIONBEAN.Proposal;
import java.sql.Date;导入系统开发包
import java.sql.SQLException;
import java.util.ArrayList; 导入系统开发包
import javax.ejb.Local; 导入系统开发包,本包是EJB 3.0本地接口包
import javax.ejb.Remote; 导入系统开发包,本包是EJB 3.0远程接口包
import javax.ejb.Stateless; 导入系统开发包,本包是EJB 3.0无状态接口包
***************************************************************
*与本类相关的所有的程序包导入程序,程序员通过阅读包文件结构
*确定相关类所在的包文件位置 *
****************************************************************
import IUW.BO.BEAN.JAVABEAN.Proposal.JB_ProposalBaseInfo;
投保书基本信息实体Bean,位于IUW.BO.BEAN.JAVABEAN.Proposal包中
import IUW.BO.BEAN.JAVABEAN.System.JB_Passport;
系统用户信息实体Bean,位于IUW.BO.BEAN.JAVABEAN.System包中
import IUW.BO.DataOperation.Implements.Proposal.ImplementsQueryProposalBaseInfoDBOperation;
投保书基本信息查询实现的数据库操作类,主要完成与DBoperation的数据交换,
完成数据的查询以及返回结果值数组的组织
可能有些朋友不太理解,程序员不明白ImplementsQueryProposalBaseInfoDBOperation类的功能就能直接
调用吗?回答是肯定的,作为程序员,只要按照架构师设计要求为其他类提供服务或者是向其他类请求
服务就可以了,作为程序员,只要考虑到本类的核心任务以及完成这些任务的实现就可以了,剩余的
由架构师考虑
import IUW.BO.Interface.Local.Proposal.InterfaceQueryProposalBaseInfoLocal;
投保书基本信息查询本地接口
import IUW.BO.Interface.Remote.Proposal.InterfaceQueryProposalBaseInfoRemote;
投保书基本信息查询远程接口
*************************************************************************
* 第34行至第37行是对ImplementsQueryProposalBaseInfoBean的EJB声明
*********************************************************************
@StatelessmappedName="ImplementsQueryProposalBaseInfoBean"
一个无状态Bean远程映射名称,远程映射名称为ImplementsQueryProposalBaseInfoBean
@RemoteInterfaceQueryProposalBaseInfoRemote.class远程实现接口
@LocalInterfaceQueryProposalBaseInfoLocal.class本地实现接口
**
* 在这里是根据详细设计说明中关于类的说明部分所添加的内容,并且通过规范注释
* 可以生成Javadoc文件,为其他程序员编程时提供类、方法和参数等,程序员可以根据
* 帮助文档了解每个类提供的服务
* 类编号: 10101
* 类名称: ImplementsQueryProposalBaseInfoBean
* 所属子系统: 不确定
* 方法体个数: 5
* 服务说明: 本Bean为客户端提供投保书基本信息查询服务
* @author 晨落
* @version 1.0
* @Date 2012-7-28
*
*
public class ImplementsQueryProposalBaseInfoBean implements
InterfaceQueryProposalBaseInfoRemote ,
InterfaceQueryProposalBaseInfoLocal
{
ImplementsQueryProposalBaseInfoDBOperationQueryProposalBaseInfoDBOperation
= new ImplementsQueryProposalBaseInfoDBOperation;
向IUW.BO.DataOperation.Implements.Proposal.ImplementsQueryProposalBaseInfoDBOperation
提出请求,在详细设计中是调用类及方法体的说明
**
* 本方法体是为系统应用提供以投保书编号为查询字段、返回值为投保书基本信息的ArrayList集合
* @param passport 系统用户基本信息
* @param ProposalNumber 投保书编号
* @return ArrayListJB_ProposalBaseInfo 返回值为投保书基本信息数据类型的一个集合
*
public ArrayListJB_ProposalBaseInfo QueryByProposalNumber
JB_Passport passport, String ProposalNumber
{
return QueryProposalBaseInfoDBOperation.QueryByProposalNumberpassport, ProposalNumber;
在这里大家可能觉得原来程序如此简单,就一条语句,是的,架构师的最高境界应该是将程序粒度最小化
使其可重用性更强,以提供服务为理念,分工明确,程序中的每个程序各负其责,松耦合,多内聚
或许有些程序员会思考ImplementsQueryProposalBaseInfoDBOperation这个程序是用来做什么的呢
回答是负责数据库SQL语句的组织,并且向数据库执行程序DBoperation发出请求。需要
告诉各位的是
其实你根本没有必要关注ImplementsQueryProposalBaseInfoDBOperation,因为会有程序员关注的
}
**
* 本方法体是为系统应用提供以投保人身份证号码为查询字段、返回值为投保书基本信息的
* ArrayList集合
* @param passport 系统用户基本信息
* @param ProposerIDNumber 投保人身份证号码
* @return ArrayListJB_ProposalBaseInfo 返回值为投保书基本信息数据类型的一个集合
*
public ArrayListJB_ProposalBaseInfo QueryByProposerIDNumber

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.