`
java-xb
  • 浏览: 126702 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

代码重构之第二章 从基础开始

阅读更多
第二章 从基础开始
上一章定义了一个Student类。在学校里,学生都有课程安排,所以需要一个CourseSession类表示课程安排,它存储上课时间和教师信息,同时保存一份这门课程的学生。
  
class CourseSession{
	private String department; //课程名称
	private String number;  //编号
	
CourseSession(String department,String number){
	this.department = department;
	this.number = number;
	}
}


CourseSession 需要存储学生,所以需要一个集合来存储学习,大家立刻会想到用ArrayList
private ArrayList<Student> students = new ArrayList<Student>();
注意用import包把java.util.ArrayList包含进来,包提供了一种将相关的类进行分组的机制。
包有几个用途:
首先,将一组类打成包,给开发者提供了相当的便利,避免开发者必须同一时刻在成十,成百,甚至上千的类中查找。
第二,类被打成包也有发布地目的,可以方便地重用模块或者子系统。
第三,包在java中提供了命名空间。包提供了赋予类一个唯一名字的机制,从而最小化类命名冲突。比如您的类有全称 com.mycompany.studentinfosystem.Student ,第三方API也许会用 com.thirdpartyco.expensivepackages.Student.
习惯:默认的包对于例子或者非商业程序是允许的。但是,对于任何真正的软件开发,所有的类都应该某些包而不是默认包。事实上如果您把类放在        默认包,那么您不可能从其他包使用这些类。
      您地开发团队应该就包的命名达成一致。多数公司把他们的域名倒过来,作为包名的开始。例如,一个名叫Minderbinder Enterprise的公司或许用 com.minderbinder作为包名的开始
声明类参数化类型的一个好处是:限制Java.util.ArrayList只能包含Student对象,从而避免不小心把其他类型的对象添加进去。
重构代码
隐藏CourseSession不必要暴露的细节。您封装了student集合,只可以用get、add、size方法来处理该集合。
例如
    
   // 暴露了CourseSession的细节
ArrayList<Student> getAllStudents(){
    return students;
}
   //用get方法根据索引得到student
Student get(int index){
    return students.get(index);
}

封装提供了两个优点:首先,目前在ArrayList中保存student列表。ArrayList是有着特定用法和性能指标地一种数据结构。如果您将该列表直接暴露给客户代码,客户代码将依赖于用ArrayList存储student的事实。这样依赖意味着您无法轻易地改变students的存储形式。第二,暴露完整的集合意味着其他类可以操作该集合——加入新的student对象,删除student对象,诸如此类——而且CourseSession类无法意识到这些改变。CourseSession对象的完整性将遭到破坏。

关键点:
    1. 用关键子staticfinal来声明类常量,类常量是成员变量。提醒一下,关键子final表明该成员变量的引用不能改变,即指向不同的值。关键字static意味着在没有创建类的实例的情况下就可以使用该成员变量。
    例子:
    
class ChessBoard{
	static final int SQUARES_PER_SIDE = 9;

}

   使用方法:int numberOfSquares = ChessBoard.SQUARES_PER_SIDE;
   按照约定,用大写字母定义类常量。当所有的字母都是大写,用“驼峰模式”来标记就不可能,所以标准方法是采用下划线来分割单词。
**********************************************
课程安排需要开始时间和结束时间。用来标记第一天和最后一天,课程一般都是16周(15周课程,在第7周后会用一周的休息时间)
  在CourseSession类中定义一个变量startDate;
  private Date startDate;  //课程安排需要开始时间
  然后重载(不是修改原来的构造函数,而是多写一个构造函数)构造函数
 
CourseSession(String department,String number,Date startDate){
	this.department = department;
	this.number = number;
	this.startDate = startDate;
}
Date getEndDate(){		
	GregorianCalendar calendar = new GregorianCalendar();
	calendar.setTime(startDate);
	int numberOfDays = 16*7-3;
	calendar.add(Calendar.DAY_OF_YEAR, numberOfDays);
	Date endDate = calendar.getTime();
	return endDate;
}

增加对工厂方法的理解
  如果方法足够短,我们就容易提供有意义的、简短的名字命名方法。如果发现为方法命名很困难,请考虑将其拆为几个更小的方法,每个方法只做一个简单的、可以命名的事件。
 
 int year  = 103;
   int month = 0;
   int date = 6;
   Date startDate = new Date(year,month,date);

   像上面的代码让人看着糊涂——因为要相对1900年份来指定年份,月份必须指定在0到11,而不是1到12直接。可以通过增加一个生产Date实例的方法来创建时间
 
Date createDate(int year,int month,int date){
     return new Date(year-1900, month-1, date);
 }
  用这个方法好比一个工厂生产时间实例,给我年月日,就给你个日期实例,相当简单。这样创建date实例有助于封装对局部变量的理解。

消除所有的警告。
  忽略编译警告就像牙虫的危害---迟早您会为其付出代价,而且为您长期的忽视付出昂贵的代价。
  用Calender创建日前而不是用Date创建日期。消除警告(想必大多数人用Date都有警告)。
  Date createDate(int year,int month,int date){
  	GregorianCalendar calendar = new GregorianCalendar();
   	calendar.clear();
	calendar.set(Calendar.YEAR, year-1900);
	calendar.set(Calendar.MONTH, month-1);
	calendar.set(Calendar.DAY_OF_MONTH, date);
	return calendar.getTime();
}
   


int numberOfDays = 16*7-3; 

这样的地方容易让人难以理解。可以通过增加注释的方法帮助理解,
例如 weeks * days per week -3days,
但是错误或容易引起误解的注释是声名狼藉的。上面的注释是无效注释的经典例子
一个好的解决方案是:
final int sessionLength = 16 ;
final int daysInWeek = 7;
final int daysFromFridayToMonday = 3;
int numberOfday = sessionLength * daysInWeek - daysFromFridayToMonday;

这样更富有表现力










分享到:
评论

相关推荐

    《重构 改善既有代码的设计》之重构,第一个案例详解

    ### 《重构 改善既有代码的设计》之重构,第一个案例详解 #### 一、引言 《重构 改善既有代码的设计》是由Martin Fowler等人撰写的经典之作,旨在教授软件开发者如何通过重构来提高代码质量和可维护性。本书不仅...

    软件工程中的代码重构与性能优化.pptx

    #### 第二章:代码重构技术 **重构的原则** - 确保代码具备良好的可读性和可维护性。 - 提高代码质量,减少不必要的重复,增加代码复用性。 - 降低复杂度,提高代码的可理解性。 - 简化代码结构。 **常见的重构...

    软件工程中的代码重构与性能优化方法研究.pptx

    #### 第二章:代码重构基础 **代码重构概述** 代码重构是指在不改变外部行为的前提下,对现有代码进行结构上的修改,以提高其内部质量的过程。目标是在保持原有功能的基础上,提高代码的可读性、可维护性和扩展性...

    代码大全第二版 中文版(1-20章)

    - 第二章“规划重构”讲述了如何在项目早期进行代码结构的规划,以及如何通过重构来改进代码。 - 第三章“设计原则”介绍了 SOLID 原则等设计模式,为编写可复用和可维护的代码提供指导。 - 第四章“控制流”讲解...

    精通Eclipse(第二版9-23章)光盘源代码

    《精通Eclipse(第二版9-23章)光盘源代码》涵盖了Eclipse IDE的高级使用技巧和开发实践,是深入理解并掌握Eclipse这一强大开发工具的重要资源。源代码包含了从第9章到第23章的全部示例项目,旨在帮助读者通过实际操作...

    Android2.0游戏开发实践宝典源代码源代码(1-10章)

    2. **第二章**:通常讲解Android游戏开发的基本概念,如游戏循环(Game Loop)的设计,这是所有游戏的基础,用于处理游戏的更新和渲染。还会涉及线程管理和时间管理,确保游戏的流畅运行。 3. **第三章**:通常涉及...

    白痴都能看懂的Java教程(第二章:Eclipse的安装使用以及人生第一个Java项目实战)

    5. 熟悉Eclipse的重构、调试和代码管理工具,可以帮助开发者更高效地编写和维护代码。 以上就是根据提供的文件内容,总结的关于Eclipse安装使用和编写第一个Java程序的知识点。希望对读者在Java学习和开发过程中...

    matlab小波分析第一章代码

    "matlab小波分析第一章代码"是针对张德丰著作的第一版内容,主要涵盖了MATLAB环境下小波分析的基础应用。 首先,我们需要理解小波分析的基本概念。小波(Wavelet)是一种时间和频率局部化的函数,它可以同时提供...

    MATLAB图像重构实战.zip_fanbeam _fanbeam matlab_matlab图像重构_图像重构算法_重构算法m

    这个压缩包中的"第13章 MATLAB图像重构实战"可能包含了一系列的MATLAB脚本和函数,用于演示如何使用MATLAB实现fanbeam变换。这些脚本可能包括数据读取、预处理、fanbeam投影、反投影以及图像重构等步骤。在学习和...

    Android第二章Kotlin

    通过学习本章内容,开发者将掌握Kotlin的基础语法,理解其在Android应用开发中的优势,并能熟练运用Kotlin特性优化代码,提升开发效率。在实践中不断探索,你将发现Kotlin是Android开发的理想选择。

    46625 修改代码的艺术_代码_艺术_46625KB_

    "2-3.pdf"和"2-3.txt"可能是书中第二章至第三章的内容,这部分可能详细讨论了代码重构,这是提高代码质量的重要手段。重构可以使得代码结构更清晰,逻辑更简洁,同时不改变外部行为。作者可能会分享如何识别代码坏...

    软件工程中的软件重构与重用.pptx

    #### 第二章:软件重构 **重构概述**:软件重构是一种在不改变软件外部行为的前提下,改进其内部结构和设计的过程。重构的目标是提高代码的可读性、可维护性和性能。 **重构原因**: - 提高代码的可读性和可维护性...

    软件工程中的软件设计与重构技术.pptx

    #### 第二章:软件设计基础 - **软件设计定义**:软件设计是根据需求规格说明书创建软件架构和详细设计方案的过程。它是连接需求分析和编码实施的关键环节。 - **软件设计的作用**:确保软件结构清晰、逻辑合理,...

    《orange's 一个操作系统的实现》附书光盘 源代码

    在压缩包中,有两个子文件夹,分别是"chapter2"和"chapter1",代表了书中的第一章和第二章的源代码。这些源代码是学习操作系统实现的基础,它们涵盖了操作系统设计的关键概念和技术。 在第一章中,通常会介绍操作...

    Android开发案例驱动教程 配套代码

    注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式展开讲解知识点,即介绍案例-&gt;案例涉及...

    第二章小波例子.rar_MATLAB 小波_matlab 小波分析_小波 matlab_小波分析_小波分析例子

    例如,“www.pudn.com.txt”可能包含的是关于下载资源的链接或者说明,而“第二章”很可能是指一系列教程中的一个章节,其中可能包含了具体的MATLAB代码示例,教授如何进行小波变换。 在小波分析的例子中,通常会...

    软件工程与软件系统可重构性评估.pptx

    #### 第2章 软件重构技术 **重构技术概述** 软件重构是在不改变软件功能的前提下,对其结构进行改善的过程。通过重构可以提高代码的可读性、可维护性,减少技术债务,进而提升软件的整体质量。 常见的重构技术...

    CAD应用程序开发源代码

    - 代码重构与模块化设计,提高代码可读性和可维护性 这些章节的源代码实例将帮助开发者深入理解CAD应用的各个层面,从基本的图形绘制到复杂的参数化设计,再到高效的数据交换和性能优化。通过学习和实践这些代码,...

    VC开发经验技巧 共分为21章 第二十一章

    第二十一章可能是整个系列的总结或聚焦于特定主题,但由于具体章节内容未给出,我们将基于一般性的VC开发经验进行详细的讲解。 1. **环境配置与项目设置**:良好的开发环境是高效编程的基础。VC支持多种编译器选项...

Global site tag (gtag.js) - Google Analytics