- 博客(99)
- 资源 (16)
- 收藏
- 关注
原创 重构第十一章学习
1:如果多个子类有相同的值域、方法,那么将这个值域、方法放到父类里。2:如果多个子类的构造函数代码几乎一样,或者说有很多一样的,就把一样的部分放到父类中去,然后子类中调用super3:如果父类中的某个方法或者值域只是某些个子类中有,那么直接放到子类里去。4:折叠继承关系,子类和父类之间差别不大。(待续)《重构》的学习暂时结束,刚开始看的时候比较有感触,但是到了后来就有点
2011-12-27 17:12:12
558
原创 封装使用的一个小例子
范例(Examples) 本例从两个classes开始,代表「人」的Person和代表「部门」的Department: class Person { Department _department; public Department getDepartment() {
2011-12-26 17:25:16
637
原创 关于冗余类
首先吐槽一下,优快云最近的登录很慢很不爽啊。以下几个方面需要注意,其实说的就是多态时候的关于继承的几个小点,不管是值域还是方法,如果只有子类中单独几个用,不要放在父类里面,以免增加所有子类的对象大小。直接上图: 我靠,图片都不让贴了,今天下午可是气死我了。 算了,就是上面说的那几点,不要使子类冗余,也不要使父类冗余。(似乎是废话)
2011-12-26 17:09:41
739
原创 类型码,似乎是对于构造成java枚举类似的应用。
在使用Replace Type Code with Class 之前,你应该先考虑type code 的其他替换方式。只有当type code 是纯粹数据时(也就是type code 不会在switch 语句中引起行为变化时),你才能以class 来取代它。Java 只能以整数作为switch 语句的「转辙」依据,不能使用任意class ,因此那种情况下不能够以class 替换type code
2011-12-26 16:58:11
526
原创 引入参数对象
这个方法其实就是说:如果某些(2个或者两个以上)在2个或者多个函数里同时出现,这就是数据泥团,应该包装一下。你常会看到特定的一组参数总是一起被传递。可能有好几个函数都使用这一组参数,这些函数可能隶属同一个class,也可能隶属不同的classes 。这样一组参数就是所谓的Date Clump (数据泥团)」,我们可以运用一个对象包装所有这些数据,再以该对象取代它们。哪怕只是为了把这些数据组
2011-12-23 12:46:24
1524
原创 Divergent Change & shotgun Surgery & Inline Class & Feature Envy
希望软件能够容易被修改,针对某一外界变化的所有的相应修改,都只应该发生在单一的类中。Shotgun Surgery类似Divergent Change,但恰恰相反。如果每遇到某种变化,你都必须在许多不同的classes内做出许多小修改以响应之,你所面临的坏味道就是Shotgun Surgery。如果需要修改的代码散布四处,你不但很难找到它们,也很容易忘记某个重要的修改。这种情况下你
2011-12-23 11:32:07
815
原创 过长参数列表 & 函数取代参数 & Inline Method
例子:源代码: public double getPrice() { int basePrice = _quantity * _itemPrice; int discountLevel; if (_quantity > 100) discountLevel = 2; else discountLevel = 1; doubl
2011-12-22 17:23:23
766
原创 坏味道之3 过大类 & Extract class & Move Method & Encapsulate Field & Self Encapsulate Field
对于类,如果想要用单一类做太多的事情,就会出现太多的instance变量通常如果class内的数个变量有着相同的前缀或字尾,这就意味有机会把它们提炼到某个组件内。Extract class 某个class做了应该由两个classes做的事。建立一个新class,将相关的值域和函数从旧class搬移到新class。如果某些数据和某些函
2011-12-22 16:55:45
988
原创 剖解临时变量
如果某个临时变量被赋值超过一次,并且它既不是循环变量,也不是集用临时变量。。「循环变量」和「集用临时变量」就是两个典型例子:循环变量(loop variables )[Beck]会随循环的每次运行而改变〔例如for (int i=0; i集用临时变量(collecting temporary variable)[Beck]负责将「通过整个函数的运算」而构成的某个值收集起来。
2011-12-22 14:34:56
758
原创 何时提炼函数 & 用查询取代临时变量
拥有[短函数」(short methods)的对象会活得比较好、比较长。不熟悉面向对象技术的人,常常觉得对象程序中只有无穷无尽的delegation(委托),根本没有进行任何计算。我们遵循这样一条原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。我们可以对一组或甚至短短一行代码做这件事。哪怕替换后的函数调用动作比函数自
2011-12-22 11:27:37
621
原创 第三章和第六章代码大坏味道 函数过长&Extract Method (1)
1:重复的代码(不仅仅是函数里,还有类之间)Extract Method是我最常用的重构手法之一。当我看见一个过长的函数或者一段需要注释才能让人理解用途的代码,我就会将这段代码放进一个独立函数中。有数个原因造成我喜欢简短而有良好命名的函数。首先,如果每个函数的粒度都很小(finely grained),那么函数之间彼此复用的机会就更大;其次,这会使高层函数码读起来就像一系列注释;再
2011-12-19 17:04:39
649
原创 重构第二章 重构原则
1:重构,改进软件设计(改进设计的一个重要方向是消除重复代码)2:重构,使软件更易被理解3:重构,帮助找到bugs。4:重构,帮你提高编程速度。什么时候重构?(三次法则)1:添加功能时---并重构2:修补错误时---并重构3:代码审核时---并重构总得来所,第二章是一个高层次的抽象章节,内容不多,可以说简单的做了一些概括,比较重要的就是重构的
2011-12-19 16:40:48
589
原创 重构第二章
这一章花费了一些时间才弄明白。1:state模式(GOF定义:允许一个对象在状态改变时,改变它的行为)a:如果一个对象的行为取决于它的状态,并且必须在运行时根据状态改变它的行为。b:一个操作中很多的分支的条件语句,并且根据依赖该对象的状态,状态模式将每一个分支条件放到一个独立的类里。年前还有大约5周,想要把这本书看完的话,大约每周3章,比较多啊,加油吧!
2011-12-19 10:35:42
482
原创 重构学习笔记2(第一章)
对于重构的学习,其实也是对于面向对象思想的提升锻炼,并且应该找到设计类的时候到底怎么样才能提升扩展性。第一章,重构的小例子。第一步:首先是找到代码泥团,也就是一个函数实现了多个功能,比较复杂的地方,抽取方法。第二步:找到泥团代码的局部变量以及参数;一般来说,不会被修改的变量可以作为函数参数传进来,然后会被修改到,如果只有一个就当作返回值。第三步:修改抽出来的函数的变量名等,使更加容
2011-12-16 12:42:54
473
原创 谜题70:(其实涉及到对于修饰符的一个理解)
先摘抄java解惑里面的一个谜题下面这个程序设计在不同的包中的两个类的交互,main方法位于hack.TypeIt中。那么,这个程序会打印什么呢? package hack;import click.CodeTalk;public class TypeIt { private static class ClickIt extends CodeTalk { void p
2011-12-14 16:20:35
556
转载 谜题72:final相关的几个知识点
本谜题旨在检验当你试图隐藏一个final域时将要发生的事情。下面的程序将做些什么呢? class Jeopardy { public static final String PRIZE = "$64,000";}public class DoubleJeopardy extends Jeopardy { public static final String PRIZE =
2011-12-14 16:15:30
500
转载 不要隐藏变量。
在下面的程序中,子类的一个域具有与超类的一个域相同的名字。那么,这个程序会打印出什么呢? class Base { public String className = "Base";}class Derived extends Base { private String className = "Derived";}public class PrivateMatter
2011-12-14 11:38:05
746
转载 不要使用基于减法的比较器
下面的程序使用定制的比较器,对一个由随机挑选的Integer实例组成的数组进行排序,然后打印了一个描述了数组顺序的单词。回忆一下,Comparator接口只有一个方法,即compare,它在第一个参数小于第二个参数时返回一个负数,在两个参数相等时返回0,在第一个参数大于第二个参数时返回一个整数。这个程序是展示5.0版特性的一个样例程序。它使用了自动包装和解包、泛型和枚举类型。那么,它会打印出什么呢
2011-12-14 11:15:56
1399
转载 Math.abs()方法不一定总是返回整数
下面的程序将生成整数对3取余的柱状图,那么,它将打印出什么呢? public class Mod { public static void main(String[ ] args) { final int MODULUS = 3; int[] histogram = new int[MODULUS]; // Iterate over al
2011-12-14 11:10:03
3610
转载 日期谜题(也暴露了Java)设计中不大好的两个类库
下面的程序演练了Date和Calendar类的某些基本特性,它会打印出什么呢? import java.util.*;public class DatingGame { public static void main(String[ ] args) { Calendar cal = Calendar.getInstance(); cal.set(1999
2011-12-14 10:48:21
812
原创 库谜题60:用一行代码实现功能
package LibPuzzles;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedHashSet;import java.util.List;/** * 下面中的方法都是用一行的代码实现功能。 * * @author xixizhao * */public clas
2011-12-14 10:33:13
746
原创 库谜题之57名字问题(equals和hashcode)(考虑散列函数的问题)
但是一个问题,怎么保证散列函数返回的函数值,对于不同的名字不同?还有,对于eauqls方法重写的时候,要注意它的参数类型一定要是Object。package LibPuzzles;import java.util.HashSet;import java.util.Set;/** * 无论何时,只要重写了equals方法,就要重写hashCode方法。 * @author xixizha
2011-12-14 10:02:07
472
转载 BigInteger类型是不可变的(String)
import java.math.BigInteger;public class BigProblem { public static void main(String[ ] args) { BigInteger fiveThousand = new BigInteger("5000"); BigInteger fiftyThousand = new B
2011-12-12 16:55:13
3811
转载 千万不要在构造器中调用可覆 写的方法。
下面这个程序有两个不可变的值类(value class),值类即其实例表示值的类。第一个类用整数坐标来表示平面上的一个点,第二个类在此基础上添加了一点颜色。主程序将创建和打印第二个类的一个实例。那么,下面的程序将打印出什么呢? class Point { protected final int x, y; private final String name; // Cached
2011-12-12 16:46:31
1295
转载 还是一个类的初始化问题(初始化过程解释的非常清楚)
下面的程序在一个类中计算并缓存了一个合计数,并且在另一个类中打印了这个合计数。那么,这个程序将打印出什么呢?这里给一点提示:你可能已经回忆起来了,在代数学中我们曾经学到过,从1到n的整数总和是n(n+1)/2。class Cache { static { initializeIfNecessary(); } private static int sum;
2011-12-12 16:38:51
989
转载 关于instanceof和转型的理解
package ClassPuzzle;public class TypePuzzle { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str = null; //尽管null对于每一个引用类型来说都是其子
2011-12-12 16:22:43
658
转载 类谜题:初始化循环问题;还是static问题(详细分析了初始话过程)
知识点:递归的初始化会被忽略;(比较重要的一点是关于final类型常量的初始化过程,非常清晰!!!假如小报是可信的,那么摇滚之王“猫王”就会直到今天仍然在世。下面的程序用来估算猫王当前的腰带尺寸,方法是根据在公开演出中所观察到的他的体态发展趋势来进行投射。该程序中使用了Calendar.getInstance().get(Calendar.YEAR)这个惯用法,它返回当前的日历年份。那
2011-12-12 15:23:31
545
转载 类谜题:static使用的另外一个问题
知识点:static关键字修饰的方法调用问题!!!下面的程序对巴辛吉小鬣狗和其它狗之间的行为差异进行了建模。如果你不知道什么是巴辛吉小鬣狗,那么我告诉你,这是一种产自非洲的小型卷尾狗,它们从来都不叫唤。那么,这个程序将打印出什么呢?class Dog { public static void bark() { System.out.print("wo
2011-12-12 15:15:12
755
转载 类谜题:关于静态域的一个小问题
知识点:静态与只有一个,没有拷贝,是共享的。第二个:关于使用集成还是组合。下面的程序使用了一个Counter类来跟踪每一种家庭宠物叫唤的次数。那么该程序会打印出什么呢? class Counter { private static int count = 0; public static final synchronized void increment() {
2011-12-12 15:10:09
602
原创 类谜题 46:构造器
package ClassPuzzle;public class ConstructorPuzzle { public ConstructorPuzzle(Object o) { // TODO Auto-generated constructor stub System.out.println("Object"); } public ConstructorPuzzle(
2011-12-12 15:04:51
90
原创 异常谜题之关闭流
这里忽然想到,其实这个知识点当时看马士兵的视频教程的时候看到过,但是没有仔细的研究:static void copy(String src, String dest) throws IOException { InputStream in = null; OutputStream out = null; try { in
2011-12-09 15:55:18
655
原创 finally不一定总是执行
package ExceptionPuzzles;public class Hellogoodbye {/* * 总之,System.exit将立即停止所有的程序线程,它并不会使finally语句块得到调用, */ public static void main(String[] args) { try { System.out.print
2011-12-09 15:47:04
1293
原创 异常谜题37:有的不能抛出异常
两个知识点:a: println()方法不抛出异常b:一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查异常集合的交集,而不是合集import java.io.IOException;public class Arcane1 { public static void main(String[] args) { try {
2011-12-09 11:18:23
1010
原创 异常谜题1:finally中最好别有return,若try中也有return。
下面这个可怜的小程序并不能很好地做出其自己的决定。它的decision方法将返回true,但是它还返回了false。那么,它到底打印的是什么呢?甚至,它是合法的吗?public class Indecisive { public static void main(String[] args) { System.out.println(decision());
2011-12-09 11:09:42
596
原创 循环谜题26Interger。MaxValue的理解
package loopPuzzles;public class IntergerMaxPuzzle { public static final int END = Integer.MAX_VALUE; public static final int START = END - 100; public static void main(String[] args) { int c
2011-12-09 10:56:20
869
原创 循环谜题25:增量操作
package loopPuzzles;public class ZizengPuzzle { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int j = 0; for(int i=0; i<100; i++) {
2011-12-09 10:55:31
609
原创 今天比较在状态,很high,java解惑的第二章字符的全部看完了。
RT,不过现在好困啊,明显感觉思维不大灵活了。 加油!!!! 看起来,本月底计划可以提前完成啊!!!!等会去散分庆祝。
2011-12-08 16:36:19
345
转载 字符谜题最后一个
非常经典,所以全文摘抄package characterPuzzles;import java.util.Random;public class Switch { private static Random rnd = new Random(); /** * @param args */ public static void main(String[] args) {
2011-12-08 16:27:36
418
原创 URL:其实是标号问题
public class BrowserTest { public static void main(String[] args) { System.out.print("iexplore:"); http://www.google.com; System.out.println(":maximize"); }}public
2011-12-08 16:20:38
347
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人