??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲无mate20pro麻豆,亚洲成av人片在www鸭子,亚洲最大视频网站http://www.tkk7.com/iNeo/zh-cnMon, 12 May 2025 02:43:55 GMTMon, 12 May 2025 02:43:55 GMT60关于搜烦时的相对路径问题http://www.tkk7.com/iNeo/archive/2006/08/03/61448.html只牵q只?/dc:creator>只牵q只?/author>Thu, 03 Aug 2006 01:12:00 GMThttp://www.tkk7.com/iNeo/archive/2006/08/03/61448.htmlhttp://www.tkk7.com/iNeo/comments/61448.htmlhttp://www.tkk7.com/iNeo/archive/2006/08/03/61448.html#Feedback0http://www.tkk7.com/iNeo/comments/commentRss/61448.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/61448.htmlsearcher = new IndexSearcher(“luc\\public\\index?;
报错了,因ؓlucene在FSDirectory里将我的路径lnew File(file.getCanonicalPath());
但奇怪的是file.getCanonicalPath()出来路径不对呀
错误?br />java.io.IOException: D:\eclipse\luc\public\index not a directory
应该是d:\eclipse\workspace\luc\public\index 才对?br />郁闷很久?现在q没办法解决!!!!!!!!!!!!!!!!!!!!!!!!!!

]]>
Eclipse的数据库插ghttp://www.tkk7.com/iNeo/archive/2006/03/30/38228.html只牵q只?/dc:creator>只牵q只?/author>Thu, 30 Mar 2006 04:42:00 GMThttp://www.tkk7.com/iNeo/archive/2006/03/30/38228.htmlhttp://www.tkk7.com/iNeo/comments/38228.htmlhttp://www.tkk7.com/iNeo/archive/2006/03/30/38228.html#Feedback1http://www.tkk7.com/iNeo/comments/commentRss/38228.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/38228.html 今天上午升 Eclipse ?/span> 3.1.2 版本Q完了之后就x个数据库的插Ӟ但花了近 2 个小时后得出的结论是Q还没有支持 3.1.x 版本的数据库插gQ郁L不行。看?/span> eclipse3.1.12 的发行日期—?/span> 2005.12.26 Q咳Q去q?/span> 12 月䆾出的Q想不到到现在还没有支持的版本。当然也可能是我没找到。如果哪位兄台能l个支持 3.1.x 版本的数据库插gQ将不甚感激Q?/span>

虽然没找到正主,但还是找C一?/span> Eclipse3.0.x 版本可用的版本,以共来参考?/span>

SQLExplorer
SQLExplorer 可以通过JDBC讉K几乎M一U数据库。同时也支持?span lang="EN-US">Hibernateq样的工兯问数据库。现在的版本?span lang="EN-US">SQLExporer 2.2.4 released?span lang="EN-US">

下栽地址Q?span lang="EN-US">http://sourceforge.net/projects/eclipsesql

JFaceDBC

是一个很好的 SQL 控制?/span> , 支持各类L数据库。现在的版本?/span> JFaceDbc 3.0

下栽地址Q?span lang="EN-US">http://sourceforge.net/projects/jfacedbc

Quantum
Quantum 是一个数据库讉K插g.它当前支持的数据库有:Postgres,MySQL,Adabas,DB2,Oracle与有JDBC驱动的数据库.它可以显C?span lang="EN-US">,视图q提供一个语法可高亮昄?span lang="EN-US">SQL~辑?/span>

com.quantum.feature_3.0.1.bin.dist

下栽地址Q?span lang="EN-US">http://sourceforge.net/project/showfiles.php?group_id=7746&package_id=57047



]]>
TMD..........http://www.tkk7.com/iNeo/archive/2006/03/15/35445.html只牵q只?/dc:creator>只牵q只?/author>Wed, 15 Mar 2006 08:54:00 GMThttp://www.tkk7.com/iNeo/archive/2006/03/15/35445.htmlhttp://www.tkk7.com/iNeo/comments/35445.htmlhttp://www.tkk7.com/iNeo/archive/2006/03/15/35445.html#Feedback0http://www.tkk7.com/iNeo/comments/commentRss/35445.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/35445.htmlTMD..........



]]>
M人都可以重构[来自IBM]http://www.tkk7.com/iNeo/archive/2006/01/17/28305.html只牵q只?/dc:creator>只牵q只?/author>Tue, 17 Jan 2006 07:28:00 GMThttp://www.tkk7.com/iNeo/archive/2006/01/17/28305.htmlhttp://www.tkk7.com/iNeo/comments/28305.htmlhttp://www.tkk7.com/iNeo/archive/2006/01/17/28305.html#Feedback0http://www.tkk7.com/iNeo/comments/commentRss/28305.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/28305.html

M人都可以重构

使用 Eclipse 自动重构Ҏ的Ҏ与原?/P>
 

 

未显C需?JavaScript 的文档选项


Ҏ늚评h

 


U别: 初

David Gallardo, 独立软gN和作?BR>

2003 q?11 ?10 ?/P>

Eclipse 提供了一l强大的自动重构QrefactoringQ功能,q些功能I插在其他功能当中,使您能够重命?Java元素Q移动类和包Q从具体的类中创建接口,嵌套的cd成顶U类Q以及从旧方法的代码片断中析取出新的Ҏ。您熟悉?Eclipse 的重构工具之后,掌握了一U提高生产率的好Ҏ。本文综览Eclipse 的重构特性,q过例子阐明了用这些特性的Ҏ与原因?/BLOCKQUOTE>

Z么重?

重构是指在不改变E序功能的前提下改变其结构。重构是一功能强大的技术,但是执行h需要倍加心才行。主要的危险在于可能在不l意中引入一些错误,其是在q行手工重构的时候更是如此。这U危险引发了寚w构技术的普遍批评Q当代码不会崩溃的时候ؓ什么要修改它呢Q?

您需要进行代码重构的原因可能有以下几个:传说中的W一个原因是Q需要承ؓ某个古老品而开发的q代久远的代码,或者突然碰到这些代码。最初的开发团队已l不在了。我们必d建增加了新特性的新版本YӞ但是q些代码已经无法理解了。新的开发队伍夜以日地工作Q破译代码然后映代码,l过大量的规划与设计之后Qh们将q些代码分割成碎片。历l重重磨难之后,所有这些东襉K按照新版本的要求归位了。这是英雄般的重构故事,几乎没有在经历了q些之后zȝ讲述q样的故事?/P>

q有一U现实一些的情况是项目中加入了新的需求,需要对设计q行修改。至于是因ؓ在最初的规划q程中失察,q是׃采用了P代式的开发过E(比如敏捷开发,或者是试驱动的开发)而在开发过E中有意引入需求,q两者ƈ没有实质性的区别。这L重构的规模要得多,其内容一般涉及通过引入接口或者抽象类来更改类的承关p,以及对类q行分割和重新组l,{等?/P>

重构的最后一个原因是Q当存在可用的自动重构工hQ可以有一个用来预先生成代码的快捷方式——就好比在您无法定如何拼写某个单词的时候,可以用某U拼写检查工兯入这个单词。比如说Q您可以用这U^淡无奇的重构Ҏ生成 getter ?setter ҎQ一旦熟悉了q样的工P它就可以为您节省很多的时间?/P>

Eclipse 的重构工h意进行英雄的重构——适合q种规模的工具几乎没有——但是不论是否用到敏捷开发技术,Eclipse 的工具对于一般程序员修改代码的工作都h无法衡量的h倹{毕竟Q何复杂的操作只要能够自动q行Q就可以不那么烦闷了。只要您知道 Eclipse 实现了什么样的重构工Pq理解了它们的适用情况Q您的生产力׃得到极大的提高?/P>

要降低对代码造成破坏的风险,有两U重要的Ҏ。第一U方法是对代码进行一套完全彻底的单元试Q在重构之前和之后都必须通过q样的测试。第二种Ҏ是用自动化的工hq行重构Q比如说 Eclipse 的重构特性?/P>

彻底的试与自动化重构l合h׃更加有效了,q样重构也就从一U神U的艺术变成了有用的日常工具。ؓ了增加新的功能或者改q代码的可维护性,我们可以在不影响原有代码功能的基上迅速且安全地改变其l构。这U能力会Ҏ设计和开发代码的方式产生极大的媄响,即便是您没有其l合到正式的敏捷Ҏ中也没有关系?/P>

回页?/FONT>


Eclipse 中重构的cd

Eclipse 的重构工具可以分Z大类Q下面的序也就是这些工具在 Refactoring 菜单中出现的序Q:

  1. 对代码进行重命名以及改变代码的物理结构,包括对属性、变量、类以及接口重新命名Q还有移动包和类{?
  2. 改变cMU的代码逻辑l构Q包括将匿名c{变ؓ嵌套c,嵌套类转变为顶U类、根据具体的cd建接口,以及从一个类中将Ҏ或者属性移到子cL者父cM?
  3. 改变一个类内部的代码,包括局部变量变成类的属性、将某个Ҏ中选中部分的代码变成一个独立的Ҏ、以及ؓ属性生?getter ?setter Ҏ?

q有几个重构工具q不能完全归入这三个U类Q特别是 Change Method SignatureQ不q在本文中还是将q个工具归入W三cR除了这U例外情况以外,本文下面几节都是按照上面的顺序来讨论 Eclipse 重构工具的?/P>

回页?/FONT>


物理重组与重命名

昄Q您即便没有特别的工P也可以在文gpȝ中重命名文g或者是Ud文gQ但是如果操作对象是 Java 源代码文Ӟ您就需要编辑很多文Ӟ更新其中?import ?package 语句。与此类|用某U文本编辑器的搜索与替换功能也可以很Ҏ地给cR方法和变量重新命名Q但是这样做的时候必d分小心,因ؓ不同的类可能h名称怼的方法或者变量;要是从头到尾查项目中所有的文gQ来保证每个东西的标识和修改的正性,那可真够乏味的?

Eclipse ?Rename ?Move 工具能够十分聪明地在整个目中完成这L修改Q而不需要用Lq涉。这是因?Eclipse 可以理解代码的语义,从而能够识别出Ҏ个特定方法、变量或者类名称的引用。简化这一d有助于确保方法、变量和cȝ名称能够清晰地指C其用途?/P>

我们l常可以发现代码的名字不恰当或者o人容易误解,q是因ؓ代码与最初设计的功能有所不同。比方说Q某个用来在文g中查扄定单词的E序也许会扩展ؓ?Web 面中通过 URL 获取 InputStream 的操作。如果这一输入最初叫?file Q那么就应该修改它的名字Q以便能反映其新增的更加一般的Ҏ,比方?sourceStream 。开发h员经常无法成功地修改q些名称Q因个过E是十分混ؕ和乏味的。这当然也会把下一个不得不对这些类q行操作的开发h员弄p涂?

要对某个 Java 元素q行重命名,只需要简单地?Package Explorer 视图中点击这个元素,或者从Java 源代码文件中选中q个元素Q然后选择菜单?Refactor > Rename。在对话框中输入新的名称Q然后选择是否需?Eclipse 也改变对q个名称的引用。实际显C出来的切内容与您所选元素的cd有关。比方说Q如果选择的属性具?getter ?setter ҎQ那么也可以同时更新这些方法的名称Q以反映新的属性。图1昄了一个简单的例子?

?1. 重命名一个局部变?/B>
Renaming a local variable

像所有的 Eclipse 重构操作一P当您指定了全部用来执行重构的必要信息之后Q您可以点?Preview 按钮Q然后在一个对话框中对?Eclipse 打算q行哪些变更Q您可以分别否决或者确认每一个受到媄响的文g中的每一变更。如果您对于 Eclipse 正确执行变更的能力有信心的话Q您可以只按?OK按钮。显Ӟ如果您不定重构到底做了什么事情,您就会想先预览一下,但是对于 Rename ?Move q样单的重构而言Q通常没有必要预览?

Move 操作?Rename 十分怼Q您选择某个 Java 元素Q通常是一个类Q,为其指定一个新位置Qƈ定义是否需要更新引用。然后,您可以选择 Preview查变更情况,或者选择 OK 立即执行重构Q如?所C?

?2. 类从一个包Ud另一个包
Moving a class

在某些^CQ特别是 WindowsQ,您还可以?Package Explorer 视图中通过单拖攄Ҏ类从一个包或者文件夹中移到另一个包或文件夹中。所有的引用都会自动更新?/P>

回页?/FONT>


重新定义cȝ关系

Eclipse 中有大量的重构工P使您能够自动改变cȝ关系。这些重构工具ƈ没有 Eclipse 提供的其他工具那么常用,但是很有价|因ؓ它们能够执行非常复杂的Q务。可以说Q当它们用得上的时候,׃非常有用?/P>

提升匿名cM嵌套c?/FONT>

Convert Anonymous ClassQ{换匿名类Q和 Convert Nested TypeQ{换嵌套类Q这两种重构Ҏ比较怼Q它们都某个类从其当前范围Ud到包含这个类的范围上?/P>

匿名cL一U语法速写标记Q您能够在需要实现某个抽象类或者接口的地方创徏一个类的实例,而不需要显式提供类的名U。比如在创徏用户界面中的监听器时Q就l常用到匿名cR在清单1中,假设 Bag 是在其他地方定义的一个接口,其中声明了两个方法, get() ?set() ?


清单 1. Bag c?/B>
 
      public class BagExample
{
   void processMessage(String msg)
   {
      Bag bag = new Bag()
      {
         Object o;
         public Object get()
         {
            return o;
         }
         public void set(Object o)
         {
            this.o = o;
         }
      };
      bag.set(msg);
      MessagePipe pipe = new MessagePipe();
      pipe.send(bag);
   }
}

当匿名类变得很大Q其中的代码难以阅读的时候,您就应该考虑这个匿名类变成严格意义上的c;Z保持装性(换句话说Q就是将它隐藏v来,使得不必知道它的外部cM知道它)Q您应该其变成嵌套c,而不是顶U类。您可以在这个匿名类的内部点击,然后选择 Refactor > Convert Anonymous Class to Nested 可以了。当出现认对话框的时候,个类输入名称Q比?BagImpl Q然后选择 Preview或?OK。这P代码变成了如清?所C的情Ş?


清单 2. l过重构?Bag c?/B>
 

public class BagExample
{
   private final class BagImpl implements Bag
   {
      Object o;
      public Object get()
      {
         return o;
      }
      public void set(Object o)
      {
         this.o = o;
      }
   }
       
   void processMessage(String msg)
   {
     Bag bag = new BagImpl();
     bag.set(msg);
     MessagePipe pipe = new MessagePipe();
     pipe.send(bag);
   }
}

当您惌其他的类使用某个嵌套cLQConvert Nested Type to Top Level 很有用了。比方说Q您可以在一个类中用值对象,像上面?BagImpl c那栗如果您后来又决定应该在多个cM间共享这个数据,那么重构操作p从这个嵌套类中创建新的类文g。您可以在源代码文g中高亮选中cdUͼ或者在 Outline 视图中点ȝ的名UͼQ然后选择 Refactor > Convert Nested Type to Top LevelQ这样就实现了重构?

q种重构要求您ؓ装入实例提供一个名字。重构工具也会提供徏议的名称Q比?example Q您可以接受q个名字。这个名字的意思过一会儿清楚了。点?OK 之后Q外层类 BagExample ׃变成清单3所C的样子?


清单 3. l过重构?Bag c?/B>

public class BagExample
{
   void processMessage(String msg)
   {
      Bag bag = new BagImpl(this);
      bag.set(msg);
      MessagePipe pipe = new MessagePipe();
      pipe.send(bag);
   }
}

h意,当一个类是嵌套类的时候,它可以访问其外层cȝ成员。ؓ了保留这U功能,重构q程一个装入类 BagExample 的实例放在前面那个嵌套类中。这是之前要求您输入名U的实例变量。同时也创徏了用于设|这个实例变量的构造函数。重构过E创建的新类 BagImpl 如清?所C?


清单 4. BagImpl c?/B>
  
final class BagImpl implements Bag
{
   private final BagExample example;
   /**
    * @paramBagExample
    */
  BagImpl(BagExample example)
   {
      this.example = example;
      // TODO Auto-generated constructor stub
   }
   Object o;
   public Object get()
   {
      return o;
   }
   public void set(Object o)
   {
      this.o = o;
   }
}

如果您的情况与这个例子相同,不需要保留对 BagExample 的访问,您也可以很安全地删除q个实例变量与构造函敎ͼ?BagExample cM的代码改成缺省的无参数构造函数?

在类l承关系内移动成?/FONT>

q有两个重构工具QPush Down ?Pull UpQ分别实现将cL法或者属性从一个类Ud到其子类或父cM。假设您有一个名?Vehicle 的抽象类Q其定义如清?所C?


清单 5. 抽象?Vehicle c?/B>

public abstract class Vehicle
{
   protected int passengers;
   protected String motor;
   
   public int getPassengers()
   {
      return passengers;
   }
   public void setPassengers(int i)
   {
      passengers = i;
   }
   public String getMotor()
   {
      return motor;
   }
   public void setMotor(String string)
   {
      motor = string;
   }
}

您还有一?Vehicle 的子c,cd?Automobile Q如清单6所C?


清单6. Automobile c?/B>

public class Automobile extends Vehicle
{
   private String make;
   private String model;
   public String getMake()
   {
      return make;
   }
   public String getModel()
   {
      return model;
   }
   public void setMake(String string)
   {
      make = string;
   }
   public void setModel(String string)
   {
      model = string;
   }
}

h意, Vehicle 有一个属性是 motor 。如果您知道您将永远只处理汽车,那么q样做就好了Q但是如果您也允许出现划艇之cȝ东西Q那么您需要将 motor 属性从 Vehicle cM攑ֈ Automobile cM。ؓ此,您可以在 Outline 视图中选择 motor Q然后选择 Refactor > Push Down?

Eclipse q是明的Q它知道您不可能L单单Ud某个属性本w,因此q提供了 Add Required 按钮Q不q在 Eclipse 2.1 中,q个功能q不L能正地工作。您需要验证一下,看所有依赖于q个属性的Ҏ是否都推C下一层。在本例中,q样的方法有两个Q即?motor 怼?getter ?setter ҎQ如?所C?

?3. 加入所需的成?/B>
Adding required members

在按q?OK按钮之后Q?motor 属性以?getMotor() ?setMotor() Ҏ׃Ud?Automobile cM。清?昄了在q行了这ơ重构之?Automobile cȝ情Ş?


清单 7. l过重构?Automobile c?/B>
public class Automobile extends Vehicle
{
   private String make;
   private String model;
   protected String motor;
   public String getMake()
   {
      return make;
   }
   public String getModel()
   {
      return model;
   }
   public void setMake(String string)
   {
      make = string;
   }
   public void setModel(String string)
   {
      model = string;
   }
   public String getMotor()
   {
      return motor;
   }
   public void setMotor(String string)
   {
      motor = string;
   }
}

Pull Up 重构?Push Down 几乎相同Q当?Pull Up 是将cL员从一个类中移到其父类中,而不是子cM。如果您E后改变LQ决定还是把 motor Ud?Vehicle cMQ那么您也许׃用到q种重构。同样需要提醒您Q一定要认您是否选择了所有必需的成员?

Automobile cMh成员 motorQ这意味着您如果创建另一个子c,比方?Bus Q您p需要将 motor Q及其相x法)加入?Bus cM。有一U方法可以表CU关p,卛_Z个名?Motorized 的接口, Automobile ?Bus 都实现这个接口,但是 RowBoat 不实现?

创徏 Motorized 接口最单的Ҏ是在 Automobile 上?Extract Interface 重构。ؓ此,您可以在 Outline 视图中选择 Automobile Q然后从菜单中选择 Refactor > Extract Interface。您可以在弹出的对话框中选择您希望在接口中包含哪些方法,如图4所C?

?4. 提取 Motorized 接口
Motorized interface

点击 OK 之后Q接口就创徏好了Q如清单8所C?/P>
清单 8. Motorized 接口

public interface Motorized
{
   public abstract String getMotor();
   public abstract void setMotor(String string);
}

同时Q?Automobile 的类声明也变成了下面的样子:


public class Automobile extends Vehicle implements Motorized

使用父类

本重构工L型中最后一个是 User Supertyp Where Possible。想象一个用来管理汽车细帐的应用E序。它自始至终都?Automobile cd的对象。如果您惛_理所有类型的交通工P那么您就可以用这U重构将所有对 Automobile 的引用都变成?Vehicle 的引用(参看?Q。如果您在代码中?instanceof 操作执行了Q何类型检查的话,您将需要决定在q些地方适用的是原先的类q是父类Q然后选中W一个选项“Use the selected supertype in 'instanceof' expressions”?

?5. ?Automobile Ҏ其父c?Vehicle
Supertype

使用父类的需求在 Java 语言中经常出玎ͼ特别是在使用?Factory Method 模式的情况下。这U模式的典型实现方式是创Z个抽象类Q其中具有静态方?create() Q这个方法返回的是实Cq个抽象cȝ一个具体对象。如果需创徏的具体对象的cd依赖于实现的l节Q而调用类对实现细节ƈ不感兴趣的情况下Q可以用这一模式?



回页?/FONT>


改变cd部的代码

最大一c重构是实现了类内部代码重组的重构方法。在所有的重构Ҏ中,只有q类Ҏ允许您引入或者移除中间变量,Ҏ原有Ҏ中的部分代码创徏新方法,以及为属性创?getter ?setter Ҏ?/P>

提取与内?/FONT>

有一些重构方法是?Extract q个词开头的QExtract Method、Extract Local Variable 以及Extract Constants。第一?Extract Method 的意思您可能已经猜到了,它根据您选中的代码创建新的方法。我们以清单8中那个类?main() ҎZ。它首先取得命o行选项的|如果有以 -D 开头的选项Q就其以名-值对的Ş式存储在一?Properties 对象中?


清单 8. main()

import java.util.Properties;
import java.util.StringTokenizer;
public class StartApp
{
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i= 0; i < args.length; i++)
      {
         if(args[i].startsWith("-D"))
         {
           String s = args[i].substring(2);
           StringTokenizer st = new StringTokenizer(s, "=");
            if(st.countTokens() == 2)
            {
              props.setProperty(st.nextToken(), st.nextToken());
            }
         }
      }
      //continue...
   }
}

一部分代码从一个方法中取出q放q另一个方法中的原因主要有两种。第一U原因是q个Ҏ太长Qƈ且完成了两个以上逻辑上截然不同的操作。(我们不知道上面那?main() Ҏq要处理哪些东西Q但是从现在掌握的证据来看,q不是从其中提取Z个方法的理由。)另一U原因是有一D逻辑上清晰的代码Q这D代码可以被其他Ҏ重用。比方说在某些时候,您发现自己在很多不同的方法中都重复编写了相同的几行代码。那有可能是需要重构的原因了,不过除非真的需要重用这部分代码Q否则您很可能ƈ不会执行重构?

假设您还需要在另外一个地方解析名-值对Qƈ其攑֜ Properties 对象中,那么您可以将包含 StringTokenizer 声明和下面的 if 语句的这D代码抽取出来。ؓ此,您可以高亮选中q段代码Q然后从菜单中选择 Refactor > Extract Method。您需要输入方法名Uͼq里输入 addProperty Q然后验证这个方法的两个参数Q?Properties prop ?Strings 。清?昄?Eclipse 提取?addProp() Ҏ之后cȝ情况?


清单 9. 提取出来?addProp()

import java.util.Properties;
import java.util.StringTokenizer;
public class Extract
{
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i = 0; i < args.length; i++)
      {
         if (args[i].startsWith("-D"))
         {
            String s = args[i].substring(2);
            addProp(props, s);
         }
      }
   }
   private static void addProp(Properties props, String s)
   {
      StringTokenizer st = new StringTokenizer(s, "=");
      if (st.countTokens() == 2)
      {
         props.setProperty(st.nextToken(), st.nextToken());
      }
   }
}

Extract Local Variable 重构取出一D被直接使用的表辑ּQ然后将q个表达式首先赋值给一个局部变量。然后在原先使用那个表达式的地方使用q个变量。比方说Q在上面的方法中Q您可以高亮选中?st.nextToken() 的第一ơ调用,然后选择 Refactor > Extract Local Variable。您被提示输入一个变量名Uͼq里输入 key 。请注意Q这里有一个将被选中表达式所有出现的地方都替换成新变量的引用的选项。这个选项通常是适用的,但是对这里的 nextToken() Ҏ不适用Q因个方法(昄Q在每一ơ调用的时候都q回不同的倹{确认这个选项未被选中。参见图6?

?6. 不全部替换所选的表达?/B>
Extract variable

接下来,在第二次调用 st.nextToken() 的地斚w复进行重构,q一ơ调用的是一个新的局部变?value 。清?0昄了这两次重构之后代码的情形?


清单 10. 重构之后的代?/B>

private static void addProp(Properties props, String s)
   {
     StringTokenizer st = new StringTokenizer(s, "=");
      if(st.countTokens() == 2)
      {
         String key = st.nextToken();
         String value = st.nextToken();
        props.setProperty(key, value);
      }
   }

用这U方式引入变量有几点好处。首先,通过辑ּ提供有意义的名称Q可以得代码执行的d更加清晰。第二,代码调试变得更容易,因ؓ我们可以很容易地查表辑ּq回的倹{最后,在可以用一个变量替换同一表达式的多个实例的情况下Q效率将大大提高?/P>

Extract Constant ?Extract Local Variable 怼Q但是您必须选择静态常量表辑ּQ重构工具将会把它{换成静态的 final 帔R。这在将编码的数字和字W串从代码中去除的时候非常有用。比方说Q在上面的代码中我们用?D”这一命o行选项来定义名-值对。先?D”高亮选中Q选择 Refactor > Extract ConstantQ然后输?DEFINE 作ؓ帔R的名U。重构之后的代码如清?1所C:


清单 11. 重构之后的代?/B>

public class Extract
{
   private static final String DEFINE = "-D";
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i = 0; i < args.length; i++)
      {
         if (args[i].startsWith(DEFINE))
         {
            String s = args[i].substring(2);
            addProp(props, s);
         }
      }
   }
   // ...

对于每一U?Extract... cȝ重构Q都存在对应?Inline... 重构Q执行与之相反的操作。比方说Q如果您高亮选中上面代码中的变量 sQ选择 Refactor > Inline...Q然后点?OKQEclipse ׃在调?addProp() 的时候直接?args[i].substring(2) q个表达式,如下所C:

        if(args[i].startsWith(DEFINE))
         {
            addProp(props,args[i].substring(2));
         }

q样比用时变量效率更高,代码也变得更加简要,至于q样的代码是易读q是含؜Q就取决于您的观点了。不q一般说来,q样的内嵌重构没什么值得推荐的地斏V?/P>

您可以按照用内嵌表达式替换变量的相同ҎQ高亮选中Ҏ名,或者静?final 帔RQ然后从菜单中选择 Refactor > Inline...QEclipse ׃用方法的代码替换Ҏ调用Q或者用帔R的值替换对帔R的引用?

装属?/FONT>

通常我们认ؓ对象的内部l构暴露出来是一U不好的做法。这也正?Vehicle cd其子c都h private 或?protected 属性,而用 public setter ?getter Ҏ来访问属性的原因。这些方法可以用两种不同的方式自动生成?

W一U生成这些方法的方式是?Source > Generate Getter and Setter 菜单。这会昄一个对话框Q其中包含所有尚未存在的 getter ?setter Ҏ。不q因U方式没有用新方法更新对q些属性的引用Q所以ƈ不算是重构;必要的时候,您必自己完成更新引用的工作。这U方式可以节U很多时_但是最好是在一开始创建类的时候,或者是向类中加入新属性的时候用,因ؓq些时候还不存在对属性的引用Q所以不需要再修改其他代码?

W二U生?getter ?setter Ҏ的方式是选中某个属性,然后从菜单中选择 Refactor > Encapsulate Field。这U方式一ơ只能ؓ一个属性生?getter ?setter ҎQ不q它?Source > Generate Getter and Setter 相反Q可以将对这个属性的引用改变成对新方法的调用?

例如Q我们可以先创徏一个新的简?Automobile c,如清?2所C?


清单 12. 单的 Automobile c?/B>

public class Automobile extends Vehicle
{
   public String make;
   public String model;
}

接下来,创徏一个类实例化了 Automobile 的类Qƈ直接讉K make 属性,如清?3所C?


清单 13. 实例?Automobile

public class AutomobileTest
{
   public void race()
   {
      Automobilecar1 = new Automobile();
      car1.make= "Austin Healy";
      car1.model= "Sprite";
      // ...
   }
}

现在装 make 属性。先高亮选中属性名Uͼ然后选择 Refactor > Encapsulate Field。在弹出的对话框中输?getter ?setter Ҏ的名U——如您所料,~省的方法名U分别是 getMake() ?setMake()。您也可以选择与这个属性处在同一个类中的Ҏ是l直接访问该属性,q是像其他类那样改用q些讉KҎ。(有一些h非常們֐于用这两种方式的某一U,不过y在这U情况下您选择哪一U方式都没有区别Q因?Automobile 中没有对 make 属性的引用。)

?. 装属?/B>
Encapsulating a field

点击 OK之后Q?Automobile cM?make 属性就变成了私有属性,也同时具有了 getMake() ?setMake() Ҏ?

>
清单 14. l过重构?Automobile c?/B>
public class Automobile extends Vehicle
{
   private String make;
   public String model;

   public void setMake(String make)
   {
      this.make = make;
   }

   public String getMake()
   {
      return make;
   }
}

AutomobileTest cM要进行更斎ͼ以便使用新的讉KҎQ如清单15所C?


>清单 15. AutomobileTest c?/B>

public class AutomobileTest
{
   public void race()
   {
      Automobilecar1 = new Automobile();
      car1.setMake("Austin Healy");
      car1.model= "Sprite";
      // ...
   }
}

改变Ҏ的签?/FONT>

本文介绍的最后一个重构方法也是最难以使用的方法:Change Method SignatureQ改变方法的{֐Q。这U方法的功能显而易见——改变方法的参数、可见性以及返回值的cd。而进行这L改变对于调用q个Ҏ的其他方法或者代码会产生什么媄响,׃是那么显而易见了。这么也没有什么魔斏V如果代码的改变在被重构的方法内部引发了问题——变量未定义Q或者类型不匚w——重构操作将对这些问题进行标记。您可以选择是接受重构,E后Ҏq些问题Q还是取消重构。如果这U重构在其他的方法中引发问题Q就直接忽略q些问题Q您必须在重构之后亲自修攏V?/P>

为澄清这一点,考虑清单16中列出的cdҎ?/P>
清单 16. MethodSigExample c?/B>

public class MethodSigExample
{
   public int test(String s, int i)
   {
      int x = i + s.length();
      return x;
   }
}

上面q个cM?test() Ҏ被另一个类中的Ҏ调用Q如清单17所C?


清单 17. callTest Ҏ

public void callTest()
   {
     MethodSigExample eg = new MethodSigExample();
     int r = eg.test("hello", 10);
   }

在第一个类中高亮选中 test Q然后选择 Refactor > Change Method Signature。您看到如?所C的对话框?

?8. Change Method Signature 选项
Change Method Signature options

W一个选项是改变该Ҏ的可见性。在本例中,其改变?protected 或?privateQ这L二个cȝ callTest() Ҏ׃能访问这个方法了。(如果q两个类在不同的包中Q将讉KҎ设ؓ~省g会引赯L问题。) Eclipse 在进行重构的时候不会将q些问题标出Q您只有自己选择适当的倹{?

下面一个选项是改变返回值类型。如果将q回值改?float Q这不会被标记成错误Q因?test() Ҏq回语句中的 int 会自动{换成 float 。即便如此,在第二个cȝ callTest() Ҏ中也会引起问题,因ؓ float 不能转换?int 。您需要将 test() 的返回值改?int Q或者是?callTest() 中的 r 改ؓ float ?

如果第一个参数的cd?String 变成 int Q那么也得考虑相同的问题。在重构的过E中q些问题会被标出,因ؓ它们会在被重构的Ҏ内部引v问题Q?int 不具有方?length() 。然而如果将其变?StringBuffer Q问题就不会标记出来Q因?StringBuffer 的确hҎ length() 。当然这会在 callTest() Ҏ中引起问题,因ؓ它在调用 test() 的时候还是把一?String 传递进M?

前面提到q,在重构引发了问题的情况下Q不问题是否被标出Q您都可以一个一个地修正q些问题Q以l箋下去。还有一U方法,是先行修改q些错误。如果您打算删除不再需要的参数 i Q那么可以先从要q行重构的方法中删除对它的引用。这样删除参数的q程更加顺利了?

最后一仉要解释的事情?Default Value 选项。这一选项g适用于将参数加入Ҏ{֐中的情况。比方说Q如果我们加入了一个类型ؓ String 的参敎ͼ参数名ؓ n Q其~省gؓ world Q那么在 callTest() Ҏ中调?test() 的代码就变成下面的样子:

      
         public void callTest()
   {
      MethodSigExample eg = new MethodSigExample();
      int r = eg.test("hello", 10, "world");
   }

在这场有?Change Method Signature 重构的看似可怕的讨论中,我们q没有隐藏其中的问题Q但却一直没有提刎ͼq种重构其实是非常强大的工具Q它可以节约很多旉Q通常您必进行仔l的计划才能成功C用它?/P>

回页?/FONT>


l束?/FONT>

Eclipse 提供的工具重构变得单,熟悉q些工具有助于您提高效率。敏捷开发方法采用P代方式增加程序特性,因此需要依赖于重构技术来改变和扩展程序的设计。但即便您ƈ没有使用要求q行正式重构的方法,Eclipse 的重构工兯是可以在q行一般的代码修改时提供节U时间的Ҏ。如果您׃旉熟悉q些工具Q那么当出现可以利用它们的情冉|Q您p意识到所p的时间是值得的?/P>

回页?/FONT>


参考资?

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • 有关重构的核心著作是 Refactoring: Improving the Design of Existing CodeQ?/I> 作?Martin Fowler、Kent Beck、John Brant、William Opdyke ?Don RobertsQAddison-WesleyQ?999q_?

  • 重构是一U正在发展的ҎQ在 Eclipse In Action: A Guide for Java Developers QManningQ?2003q_一书中Q作?David GallardoQEd Burnette 以及 Robert McGovern 从在 Eclipse 中设计和开发项目的角度讨论了这一话题?

  • 模式Q如本文中提到的 Factory Method 模式Q是理解和讨论面向对象设计的重要工具。这斚w的经典著作是 Design Patterns: Elements of Reusable Object-Oriented SoftwareQ作者ؓ Erich Gamma、Richard Helm、Ralph Johnson ?John Vlissides QAddison-WesleyQ?995q_?

  • Design Patterns 中的例子是用 C++ 写成的,q对?Java E序员是不小的障;Mark Grand 所著的 Patterns in Java, Volume One: A Catalog of Reusable Design Patterns Illustrated with UMLQWileyQ?998q_模式翻译成?Java 语言?

  • 有关敏捷~程的一个变U,请参?Kent Beck 所著的 Extreme Programming Explained: Embrace ChangeQAddison-WesleyQ?999q_
Web 站点 developerWorks 上的文章与教E?

回页?/FONT>


关于作?/FONT>

David Gallardo ?Studio B 上的一名作Ӟ他是一名独立Y仉问和作家Q专长ؓ软g国际化、Java Web 应用E序和数据库开发。他成ؓ专业软g工程师已l有十五q了Q他拥有许多操作pȝ、编E语a和网l协议的l验。他最q在一?BtoB 电子商务公司 TradeAccess, Inc 领导数据库和国际化开发。在q之前,他是 Lotus Development Corporation ?International Product Development l中的高U工E师Q负责ؓ Lotus 产品Q包?DominoQ提?Unicode 和国际语a支持的跨q_库的开发。David ?Eclipse In Action: A Guide for Java DevelopersQ?003q_一书的合著者。可以通过 david@gallardo.org ?David 联系?



]]>
原来自己的生日已l过?/title><link>http://www.tkk7.com/iNeo/archive/2006/01/10/27337.html</link><dc:creator>只牵q只?/dc:creator><author>只牵q只?/author><pubDate>Tue, 10 Jan 2006 01:29:00 GMT</pubDate><guid>http://www.tkk7.com/iNeo/archive/2006/01/10/27337.html</guid><wfw:comment>http://www.tkk7.com/iNeo/comments/27337.html</wfw:comment><comments>http://www.tkk7.com/iNeo/archive/2006/01/10/27337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/iNeo/comments/commentRss/27337.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/iNeo/services/trackbacks/27337.html</trackback:ping><description><![CDATA[原来自己的生日已l过?.....不知不觉的过?..........<img src ="http://www.tkk7.com/iNeo/aggbug/27337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/iNeo/" target="_blank">只牵q只?/a> 2006-01-10 09:29 <a href="http://www.tkk7.com/iNeo/archive/2006/01/10/27337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>男h25岁前不会明白的道?/title><link>http://www.tkk7.com/iNeo/archive/2006/01/10/27335.html</link><dc:creator>只牵q只?/dc:creator><author>只牵q只?/author><pubDate>Tue, 10 Jan 2006 01:12:00 GMT</pubDate><guid>http://www.tkk7.com/iNeo/archive/2006/01/10/27335.html</guid><wfw:comment>http://www.tkk7.com/iNeo/comments/27335.html</wfw:comment><comments>http://www.tkk7.com/iNeo/archive/2006/01/10/27335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/iNeo/comments/commentRss/27335.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/iNeo/services/trackbacks/27335.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=3 width="95%" align=center border=0> <TBODY> <TR> <TD style="FONT-SIZE: 14px" align=middle><B>男h25岁前不会明白的道?/B></TD></TR> <TR> <TD align=right></TD></TR></TR> <TR> <TD> <HR color=#1d9bb4 SIZE=1>     <BR> <P>  1、男人是C会的主体,不管你信或不信。所以男人应该有U责L?BR>   <BR>  2?5岁之前,误得,爱情通常是假的,或者不是你所惌的那Lz和永远。如果你q了25岁,那么你应该懂得这个道理?BR>   <BR>  3、吃?成饱最舒服。对待女友最多也请你保持?成?BR>   <BR>  4?0岁之前请爱惜自己的n体,?0q你扄Q后30q病找你。如果你q了30岁,你自然也会懂得这个道理?BR>   <BR>  5、事业远比爱情重要。如果说事业都不能永恒,那么爱情只能是昙花一现?BR>   <BR>  6、不要轻易接受追求你的女孩。女q男隔层U,如果你很Ҏ陷q去Q你会发C会错q很多东西,失去很多东西?BR>   <BR>  7、请你相信,能用p决的问题Q都不是问题。如果你认ؓq王道Q有钱有女hQ没钱没女hQ那么,女h不是问题?BR>   <BR>  8、请永远U极向上。每个男人都有他可爱的地方,但是不可q地方只有Q不U极面对生活?BR>   <BR>  9、不要连l?ơ让同一个女人受C実뀂好马不吃回头草是有道理的。如果认真考虑q该分手Q那么请不要做Q何舍不得的行动?BR>   <BR>  10、如果你和你前女友能做朋友,那么你要问自己:Z么?如果分手后还是朋友,那么只有2个可能:你们当初都只是玩玩而已Q没付出彼此最真的感情Q或者:必定有个人是在默默的付出无怨无悔!<BR>   <BR>  11、永q不要太怿女h在恋爱时的甜a蜜语。都说女人爱听甜a蜜语Q其实,男h更喜Ƣ?BR>   <BR>  12、请不要q相貌或者n高过分担心和自卑。h是动物,但是区别于动物。先天条件ƈ不是L你好好生zȝ借口。h的心灵远胜于相貌Q请怿q点。如果有Z相貌取hQ那么你也没必要太在意。因Z从某U意义来Ԍ只是只动物,你会跟动物怄气吗?<BR>   <BR>  13、失恋时Q只?U可能,要么你爱她她不爱你,或者相反。那么,当你qZ再爱你,或者从来没p你时Q你没有遗憾Q因Z失去的只是一个不׃的h?BR>   <BR>  14、请不要ƺ骗善良的女孩。这个世界上善良的女孩太?BR>   <BR>  15、不能偏Ȁ的认为金׃能,臛_Q金钱治不好艾滋病?BR>   <BR>  16、请一定要有自信。你是一道风景,没必要在别h风景里面仰视?BR>   <BR>  17、受到再大的打击Q只要生命还在,L信每天的太阳都是新的?BR>   <BR>  18、爱情永q不可能是天q뀂你惛_爱情里幸就要舍得伤心?BR>   <BR>  19、如果你喜欢一个她认ؓ别h应该对她好的MMQ请早攑ּ。没有h是应该对一个h好的。如果她不明白这个道理,也就是她Ҏ不懂得珍惜?BR>   <BR>  20、不要因为寂寞而“找”GFQ寂寞的男h误学会品味寂寞。请CQ即使寂寞,q方黑暗的夜IZQ一定有人和你一P寂寞的h不同QԒ望的星空却是唯一?BR>   <BR>  21、Q何事没有永远Q也别问怎样才能永远。生zL很多无奈Q请量充实自己Q充实生zR请善待生活?BR>   <BR>  End、男人有很多无奈Q生zd累,但是因ؓ生活才有意义。当你以Z一无所有时Q你臛_q有旉Q时间能抚^一切创伤。所以请不要泪?/P></TD></TR></TBODY></TABLE><img src ="http://www.tkk7.com/iNeo/aggbug/27335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/iNeo/" target="_blank">只牵q只?/a> 2006-01-10 09:12 <a href="http://www.tkk7.com/iNeo/archive/2006/01/10/27335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也许明天会更?......http://www.tkk7.com/iNeo/archive/2006/01/10/27330.html只牵q只?/dc:creator>只牵q只?/author>Tue, 10 Jan 2006 00:51:00 GMThttp://www.tkk7.com/iNeo/archive/2006/01/10/27330.htmlhttp://www.tkk7.com/iNeo/comments/27330.htmlhttp://www.tkk7.com/iNeo/archive/2006/01/10/27330.html#Feedback0http://www.tkk7.com/iNeo/comments/commentRss/27330.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/27330.html也许明天会更?......



]]>
AJAXQ开发者新的一天[转]http://www.tkk7.com/iNeo/archive/2006/01/04/26524.html只牵q只?/dc:creator>只牵q只?/author>Wed, 04 Jan 2006 02:53:00 GMThttp://www.tkk7.com/iNeo/archive/2006/01/04/26524.htmlhttp://www.tkk7.com/iNeo/comments/26524.htmlhttp://www.tkk7.com/iNeo/archive/2006/01/04/26524.html#Feedback0http://www.tkk7.com/iNeo/comments/commentRss/26524.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/26524.html摘要:

虽然大部分开发h员在q去使用qXMLHttp或者用Iframe来加载数据,但仅到现在我们才看到传统的开发h员和公司开始采用这些技术。就像新的编E语a或模型伴随着更多的痛苦,开发h员需要学习新的技巧及如何最好利用这些新技术。这文章讲qC开发h员用AJAX需要用的工具和技术?

文章工具

作?Andrew Thompson;xMatrix (他的blogQ?A >http://blog.matrix.org.cn/page/xMatrix)
原文地址:http://www.javaworld.com/javaworld/jw-10-2005/jw-1017-ajax.html
中文地址:http://www.matrix.org.cn/resource/article/44/44116_AJAX.html
关键词: AJAX

AJAX开发者的最新工具和技?/STRONG>

ZXML的异步JavaScriptQ简UAJAXQ是当前Web创新Q称为Web2.0Q中的一个王冠。感谢组成AJAX的各U技术,Web应用的交互如Flickr, Backpack和Google在这斚w已经有质的飞跃。这个术语源自描qCZ|页的Web应用到基于数据的应用的{换。在Z数据的应用中Q用户需求的数据如联pMh列表Q可以从独立于实际网늚服务端取得ƈ且可以被动态地写入|页中,l缓慢的Web应用体验着色之像桌面应用一栗?BR>
虽然大部分开发h员在q去使用qXMLHttp或者用Iframe来加载数据,但仅到现在我们才看到传统的开发h员和公司开始采用这些技术。就像新的编E语a或模型伴随着更多的痛苦,开发h员需要学习新的技巧及如何最好利用这些新技术。这文章讲qC开发h员用AJAX枰褂玫墓ぞ吆N?lt;br />
AJAX模式
许多重要的技术和AJAX开发模式可以从现有的知识中获取。例如,在一个发送请求到服务端的应用中,必须包含h序、优先、超时响应、错误处理及回调Q其中许多元素已l在Web服务中包含了Q就像现在的SOA。AJAX开发h员拥有一个完整的pȝ架构知识。同Ӟ随着技术的成熟q会有许多地斚w要改q,特别是UI部分的易用性?BR>
AJAX开发与传统的CS开发有很大的不同。这些不同引入了新的~程问题Q最大的问题在于易用性。由于AJAX依赖览器的JavaScript和XMLQ浏览器的兼Ҏ和支持的标准也变得和JavaScript的运行时性能一样重要了。这些问题中的大部分来源于浏览器、服务器和技术的l合Q因此必ȝ解如何才能最好的使用q些技术?BR>
l合各种变化的技术和合的客h务端环境QAJAX提出了一U新的开发方式。AJAX开发h员必ȝ解传l的MVC架构Q这限制了应用层ơ之间的边界。同Ӟ开发h员还需要考虑CS环境的外部和使用AJAX技术来重定型MVC边界。最重要的是QAJAX开发h员必ȝ止以面集合的方式来考虑Web应用而需要将其认为是单个面。一旦UI设计与服务架构之间的范围被严格区分开来后Q开发h员就需要更新和变化的技术集合了?BR>

时刻想着用户
AJAX的最大机遇在于用户体验。在使应用更快响应和创新的过E中Q定义Web应用的规则正在被重写Q因此开发h员必L注重用户。现在用户已l逐渐习惯如何使用Web应用了。例如用户通常希望每一ơ按钮点MD几秒的gq和屏幕hQ但AJAX正在打破q种长时间的状况。因此用户需要重C验按钮点ȝ响应了?BR>
可用性是AJAX另hȀ动的地方而且已经产生了几U新颖的技术。其中最引h注目的是一U称为“黄色隐出”的技术,他在数据更新之前时将用户界面变ؓ黄色Q更新完成后立刻恢复原来的颜艌ӀAJAX开发h员将用户从Web应用的负载中解放出来Q小心地利用AJAX提供的丰富接口,不久桌面开发h员会发现AJAX是他们的方向?BR>

几种工具和技?/STRONG>
随着AJAXq速地引h注目hQ我惛_发h员对q种技术的期待也迅速地增加。就像Q何新技术,AJAX的兴Z需要一整个开发工?~程语言及相x术系l来支撑?BR>
JavaScript
如名字所CAJAX的概念中最重要而最被忽视的是他也是一UJavaScript~程语言。JavaScript是一U粘合剂使AJAX应用的各部分集成在一赗在大部分时_JavaScript通常被服务端开发h员认为是一U企业应用不需要用的东西应该力避免。这U观Ҏ来自以前~写JavaScript代码的经历:J杂而又易出错的语言。类似的Q他也被认ؓ应用逻辑L地散布在服务端和客户端中Q这使得问题很难被发现而且代码很难重用。在AJAX中JavaScript主要被用来传递用L面上的数据到服务端ƈq回l果。XMLHttpRequest对象用来响应通过HTTP传递的数据Q一旦数据返回到客户端就可以立刻使用DOM数据放到网面上?BR>
XMLHttpRequest
XMLHttpRequest对象在大部分览器上已经实现而且拥有一个简单的接口允许数据从客L传递到服务端,但ƈ不会打断用户当前的操作。用XMLHttpRequest传送的数据可以是Q何格式,虽然从名字上是XML格式的数据?BR>
开发h员应该已l熟悉了许多其他XML相关的技术。XPath可以讉KXML文档中的数据Q但理解XML DOM是必ȝ。类似的QXSLT是最单而快速的从XML数据生成HTML或XML的方式。许多开发h员已l熟悉Xpath和XSLTQ因此AJAX选择XML作ؓ数据交换格式有意义的。XSLT可以被用在客L和服务端Q他能够减少大量的用JavaScript~写的应用逻辑?BR>
CSS
Z正确的浏览AJAX应用QCSS是一UAJAX开发h员所需要的重要武器。CSS提供了从内容中分d用样式和设计的机制。虽然CSS在AJAX应用中扮演至关重要的角色Q但他也是构建创览器应用的一大阻,因ؓ不同的浏览器厂商支持各种不同的CSSU别?BR>
服务器端
但不像在客户端,在服务端AJAX应用q是使用建立在如Java,.Net和PHP语言基础上机Ӟq没有改变这个领域中的主要方式?BR>既然如此Q我们对Ruby on Rails框架的兴也p速增加了。在一q多前,Ruby on Rails已经吸引了大量开发h员基于其强大功能来构建Web和AJAX应用。虽然目前还有很多快速应用开发工具存在,Ruby on Rails看v来已l储备了化构建AJAX应用的能力?BR>
开发工?BR>在实际构建AJAX应用中,你需要的不只是文本编辑器。既然是JavaScript非编译的Q他可以Ҏ地编写和q行在浏览器中;然而,许多工具提供了有用的扩展如语法高亮和完成?BR>
不同的IDE提供了对JavaScript支持的不同等U。来自JetBrains的IntelliJ IDEA是一个用来JavaScript开发的更好的IDEQ虽然许多开发h员也喜欢Microsoft’s Visual Studio产品Q允Z在最新的版本中改善对AJAX的支持)。Eclipse包含了两个免费的JavaScript~辑器插件和一个商业的来自ActiveStat的Komodo IDE?BR>
另一个JavaScript和AJAX开发中的问题是调试困难。不同的览器提供不同的通常是隐藏的q行旉误信息,而JavaScript的缺陷如双重变量赋|通常是由于缺数据类型)使得调试更加困难。在AJAX的开发中Q调试就更复杂了Q因为其需要标识究竟是客户端还是服务端产生的错误。在q去QJavaScript调试的方法是删除所有代码然后一行行的增加直到错误出现。现在,更多开发h员回CؓIE准备的Microsoft Script Debugger和ؓMozilla览器准备的Venkman?BR>

览器兼Ҏ?/STRONG>
JavaScript~程的最大问题来自不同的览器对各种技术和标准的支持。构Z个运行在不同览器(如IE和火狐)是一个困隄d。因此几UAJAX JavaScript框架或者生成基于服务端逻辑或标记库的JavaScriptQ或者提供符合跨览器AJAX开发的客户端JavaScript库。一些流行的框架包括QAJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.

q些框架l开发h员更多的I间使得他们不需要担心跨览器的问题。虽然这些框架提升了开发h员构建应用的能力Q但׃厂商已经开发了更细节的用户界面的打包组件解x案,因此在AJAXlg市场中需要考虑一些其他因素。例如提供通用用户界面的组件如l合框和数据栅格的几个厂商,都可以被用来在应用中创徏良好的通过cM电子数据表方式来查看和编辑数据的体验。但q些lg不仅是封装了lg的用L面而且包括与服务端数据的通讯方式Q这些组仉常使用Z标记方式来实现如ASP.Net或JSF控g?/P>


展望
最qIE和火狐之间的览器之争变得火热v来,因此AJAX开发h员需要够敏L作出反应。关键点在一些问题如CSS或XMLQ虽然各U浏览器形成采用最新标准的不同阵营Q如Mozilla拥抱SVG和E4X标准及在最新火狐BETA版本中用XULQ而微软用自qXAML技术)。所有这些技术代表当前AJAXLJavaScript和XML的市场方向改变?BR>ȝ来说QAJAX开发h员必d快地跟进最新的技术ƈ利用高的工具集。成功的AJAX开发h员还需要留心他们的使用者以避免Q何问题扩大化。ƈ且AJAX开发h员还需要持l地创新来创建增强Web应用易用性的新方法?/P>


作?/STRONG>
Dave Johnson是加拿大Vancouver一家Y件咨询公司eBusiness Applications创始人和传道者,拥有七年以上的XML相关工作l验?/P>


Resources
?nbsp;AJAX开发h员的~译模式:http://www.ajaxpatterns.org
?nbsp; XMLHttpRequest教程Q“动态网|口?http://www.xml.com/pub/a/2005/02/09/xml-http-request.html
?nbsp;JavaScript性能基准:http://blogs.ebusiness-apps.com/dave/?p=14
?nbsp;AJAX资源:http://www.ajaxmatters.com
?nbsp;JavaScript规范:http://www.ecma-international.org/publications/standards/Ecma-262.htm
?nbsp;介绍JavaScript对象标识:http://www.crockford.com/JSON/index.html
?nbsp; Mozilla 的Venkman JavaScript调试?http://www.mozilla.org/projects/venkman/
?nbsp; XML DOM参?http://msdn.microsoft.com/library/default.asp?url=/library/en-us/
xmlsdk/html/e9da2722-7879-4e48-869c-7f16714e2824.asp
?nbsp;Microsoft Dynamic HTML reference: http://msdn.microsoft.com/library/default.asp?url=/
workshop/author/dhtml/reference/dhtml_reference_entry.asp
?nbsp;Gecko DOM Reference: http://www.mozilla.org/docs/dom/domref/
?nbsp;"“移植IE应用到Mozilla?BR>http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/
?nbsp;Mozilla XUL reference:
http://www.xulplanet.com/
?nbsp;Microsoft XAML reference:
http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/
en-us/wcp_conceptual/html/0ff5f36e-dd84-44d1-aa3e-5bb4f147b169.asp?frame=true
?nbsp;James Jesses Garret introduced the term AJAX in his article "AJAX: A New Approach to Web Applications," (Adaptive Path, February 2005): “AJAXQ新的网应用开发方式?BR>http://www.adaptivepath.com/publications/essays/archives/000385.php
?nbsp;JetBrains IntelliJ IDEA:
http://www.jetbrains.com/
?nbsp;Microsoft Visual Studio:
http://msdn.microsoft.com/vstudio/
?nbsp;JSEditor:
http://jseditor.sourceforge.net/
?nbsp;JSEclipse:
http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview/
?nbsp;ActiveState Komodo:
http://www.activestate.com/Products/Komodo/
?nbsp;XHTML:
http://www.w3.org/TR/xhtml1/
?nbsp;Document Object Model:
http://www.w3.org/DOM/
?nbsp;Cascading Style Sheets:
http://www.w3.org/Style/CSS/
?nbsp;Extensible Stylesheet Language:
http://www.w3.org/Style/XSL/
?nbsp;XForms:
http://www.w3.org/MarkUp/Forms/
?nbsp;Scaling Vector Graphics:
http://www.w3.org/Graphics/SVG/
?nbsp;XPath:
http://www.w3.org/TR/xpath
?nbsp;AJAX.Net:
http://ajax.schwarz-interactive.de/csharpsample/default.aspx
?nbsp;Backbase:
http://www.backbase.com
?nbsp;Bitkraft:
http://www.tiggrbitz.com/
?nbsp;Django:
http://www.djangoproject.com/
?nbsp;Dojo:
http://www.dojotoolkit.org/
?nbsp;DWR (Direct Web Reporting):
http://getahead.ltd.uk/dwr/
?nbsp;MochiKit:
http://mochikit.com/
?nbsp;Prototype:
http://prototype.conio.net/
?nbsp;Rico:
http://openrico.org/rico/home.page
?nbsp;Sajax:
http://www.modernmethod.com/sajax/
?nbsp;Sarissa:
http://sarissa.sourceforge.net/doc/
?nbsp;Script.aculo.us:
http://script.aculo.us/
?nbsp;Ruby on Rails:
http://www.rubyonrails.org/
?nbsp;For more on AJAX and DWR, read "AJAX Made Simple with DWR," Cloves Carneiro Jr. (JavaWorld, June 2005): 关于AJAX和DWRQ请阅读“AJAX使用DWR更简单?BR>http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html
?nbsp;For more articles on Java development tools, browse the Development Tools section of JavaWorld’s Topical Index: 更多Java开发工L文章Q请览JavaWorld的开发工具部分烦引页
http://www.javaworld.com/channel_content/jw-tools-index.shtml
?nbsp;For more articles on XML, browse the Java and XML section of JavaWorld’s Topical Index: 更多XML的文章,h览JavaWorld的Java和XML部分索引?BR>http://www.javaworld.com/channel_content/jw-xml-index.shtml
?nbsp;For more articles on UI design, browse the User Interface Design section of JavaWorld’s Topical Index: 更多UI设计的文章,h览JavaWorld的UI设计部分索引?BR>http://www.javaworld.com/channel_content/jw-ui-index.shtml


原文地址:


]]>
ZAJAX的动态树型结构的设计与实??[转] http://www.tkk7.com/iNeo/archive/2005/12/30/25981.html只牵q只?/dc:creator>只牵q只?/author>Fri, 30 Dec 2005 00:32:00 GMThttp://www.tkk7.com/iNeo/archive/2005/12/30/25981.htmlhttp://www.tkk7.com/iNeo/comments/25981.htmlhttp://www.tkk7.com/iNeo/archive/2005/12/30/25981.html#Feedback0http://www.tkk7.com/iNeo/comments/commentRss/25981.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/25981.html  2.3.1 动态加载技?/P>

  如果一ơ性获取完整的先序树,构造成xml提供lJavaScript解析Q数据量大Q消耗的资源多Q客L响应延迟旉p长,因此对于大数据量的树Q采用动态加载方式,xơ单几Z?”图片时Q判断是否已加蝲子节Ҏ据,如果未加载则通过Ajax的XMLHTTPlgXMLHTTPRequest对象异步发送请求,q接服务器执行SQL 语句“select * from tree_class where parent = Qorder by classcode ”获取节Ҏ据。相关JavaScript 代码如下Q?/P>

/*判断是否已经加蝲数据Q未加蝲则访问服务器加蝲数据*/

dhtmlTree.prototype.Loading=function(pObject){
 if(((pObject.XMLload==0)&&(this.XMLsource))&&(!this.XMLloading)){
  pObject.XMLload=1;
  this.loadXML(this.XMLsource+getUrlSymbol(this.XMLsource)+"id="+escape(pObject.id));
 }
}
dtmlXMLObject.prototype.loadXML=function(url){//加蝲数据
 try {
  this.xmlDoc = new XMLHttpRequest();
  /*通过GETҎ异步q接?url 加蝲数据*/
  this.xmlDoc.open("GET", url,true);//trueQ异步;falseQ同?BR>  this.xmlDoc.send(null);
 } catch(e){
  this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");//使用IE
  this.xmlDoc.open("GET", url,true);//trueQ异步;falseQ同?BR>  this.xmlDoc.send(null);
 }
 return this.xmlDoc.responseXML;
}

  每次只取同一个父节点ParentId的子节点序列Q按XML格式装成树的文档结构,例如Q?/P>

Qtree id="0"Q?BR>Qleaf child=?" name="国防U技大学" id="1" im0="leaf.gif" im1="folderOpen.gif" im2=" folderClosed.gif"/Q?BR>Q?treeQ?/P>

  提供lJavaScript的dhtmlTreeObject.prototype.insertItemQ)解析q组l好html输出节点Q其?childQ?表示有子节点Q?表示没有子节点;im0表示没有子节Ҏ的图标;im1表示有子节点q且打开节点时的图标Qim2表示有子节点q且关闭时的图标Q所以还可以在构造XML时自定义图标?/P>

  2.3.2 树型l构的构?/P>

  从数据库中返回的是有序的先序树,而XML是完整的树型l构文档Q所以将树型数据构造成预定义的XML格式Q只需从根节点开始,遍历一遍树Q即可将树全部生成。相关JavaScript代码如下Q?/P>

/*动态加载树的构造方?/

dtmlXMLObject.prototype.constructTree=function(){

//采用动态加载时获取的xml数据Q解析树型数?BR>
var node=this.XMLLoader.getXMLTopNode("tree");

var parentId=node.getAttribute("id");

for(var i=0;iQnode.childNodes.length;i++) { //逐个解析xml文g的leaf节点

 if((node.childNodes[i].nodeType==1)&&(node.childNodes[i].tagName == "leaf")){
  var name=node.childNodes[i].getAttribute("text");
  ………?BR>  var temp=dhtmlObject.a0Find(parentId);//获取父节点对?BR>  temp.XMLload=1;//已加?BR>  //构造html输出节点
  dhtmlObject.insertItem(parentId,cId,name,im0,im1,im2,chd);
  dhtmlObject.addDragger = this;//讄可拖攄对象
 };
}

  2.3.3 树型l构的维?/P>

  在维护树型结构表?删除节点较ؓ单,SQL 语句? "delete from tree_class where classcode like?+ classcode +"%?,卛_其节点和孩子一q删除;增加节点?分ؓ前插、后插、和插入子节点三U情况,前两U情况需要更新递归更新cd代码Q后者只需扑ֈ父节点的孩子的最大类别代码加1 ?作ؓ增加节点的类别代码;通过拖放来改变树的结构时Q只需拖动节点的parentId更新为目标节点的Classid卛_Q对应的SQL语句为:"update tree_class set parentId = "+ classidTo+" where classid = "+ classidFrom?/P>

  3、效率分?/STRONG>

  对于树的存储一般有两种形式Q二l表和链表,遍历方式一般也有深度遍历和q度遍历两种方式Q遍历的旉复杂度都是O( n )。用二维表存储时Q在内存中用数组的下标能准确定位节点的父节点、兄弟节Ҏ在的数组下标。数据库中节点的定位也是准确的,但是节点信息从数据库中d内存中时Q如果无法通过内存数组下标定位节点信息Q那么就必须遍历一遍寻找一个节点,n 个节点中L一个节点的旉是O(n/2)Qn 个节Ҏ序的旉复杂度将是O( n 2/2)Q这也是一般实现的B/S 模式的树l构效率低下的原因。本Ҏ采用字典序编h案,使得从数据库中取得的树是已经排序的,直接遍历生成客户面E序Q时间复杂度为O( n )?/P>

  4、结 ?/STRONG>

  本文讨论了基于Ajax的动态树型结构的实现ҎQ支持无h动态维护树的节点信息,支持拖放节点改变树的节点l构以及ơ序Q同旉用数据库存储节点信息Q保证了该方案有一定的通用性,此外l合XML描述树的节点信息Q得Q何按本方案预定的xml文档描述的信息都可以通过树来展现。本Ҏ已经应用在我校的数字q新pȝ以及老百姓大药房信息pȝ中?/P>

]]>
ZAJAX的动态树型结构的设计与实??[转]http://www.tkk7.com/iNeo/archive/2005/12/30/25980.html只牵q只?/dc:creator>只牵q只?/author>Fri, 30 Dec 2005 00:31:00 GMThttp://www.tkk7.com/iNeo/archive/2005/12/30/25980.htmlhttp://www.tkk7.com/iNeo/comments/25980.htmlhttp://www.tkk7.com/iNeo/archive/2005/12/30/25980.html#Feedback0http://www.tkk7.com/iNeo/comments/commentRss/25980.htmlhttp://www.tkk7.com/iNeo/services/trackbacks/25980.html
  cMWindows资源理器的文gҎ式,节点的图片样式如?所C。对于每个节点的DHTML 代码Q需要包含节点的位置、前导图片、样式、针对该节点的其他操作等。同时ؓ了节ҎC的q诏性,q需一些前导图片?BR>
  ? 树节点的前的囄样式?

 对于树的非叶子节点,囄和节点信息等Q采用一个DIV ( division) 容器包含。DIV {容器是DHTML 的基Q用它可以通过脚本E序对其属性进行操作,如设|其style 样式的display 属性来控制子节点的展开和隐藏。节点的位置、前导图片、样式、针对该节点的其他的操作{都攑օ容器中,例:

Q?DIV id =mParentIDQ?BR>Q?IMG align = center border = 0 onclick =″nodeExpand (‘leafid??name = m1Tree src =′Tplus.gifԌ
Q?IMG align = center border = 0 name = m1Folder src =′folderClosed. gifԌ 计算机学?Q?pQ?/P>

  叶子节点无需容器直接输出卛_?BR>
  当点L节点前的?+ ”、?- ”图片时通过DIV 的style 样式的display 属性控制子节点的展开和隐藏。displayQ“none?隐藏,不可?QdisplayQ“block?昄) 。相关JavaScript 代码如下Q?/P>

if (expandChild.style.display = =″none?{
 // 当前为隐藏状?执行展开动作
 this.Loading(parentObject);//判断该分支的数据是否已经加蝲
 expandChild.style.display =″block?
if (para2 = =″last?
 parentObject.src =″Lminus. gif? // 最后一个节?BR>else
 parentObject.src = ″Tminus. gif? // 昄?BR> expandFolder.src = ″folderOpen. gif?
}else {
 // 当前节点的子节点全部隐?BR> expandChild.style.display = ″none?
 if (para2 = = ″last?
  parentObject.src = ″Lplus. gif?
 else
  parentObject.src = ″Tplus. gif?
  expandFolder.src = ″folderClosed. gif?
}

  2.2 树型表结构设?BR>
  我们以数据库体记录节点的变化Q树型表l构臛_要有以下字段Q节点的~号(CLASSID) ,对节点的描述(ClassName)Q父节点的编?ParentId)Q这些是构徏树结构所必须的信息。同时引入节点的cd代码QClassCodeQ,节点的别(ClassLevelQ,是否叶子节点 (Terminated){辅助字D,记录节点ơ序Q实体关pd如图3所C?


?3 树型表结构示意图

  树遍历的旉复杂度是O( n )Q但是将树信息存攑ֈ数据库后Q就不能按传l的方式遍历树,必须使用SQL 语句讉K数据库表的内容,而一ơ性取的数据量多Q消耗的资源也越多,用户{待的时间就长。如果将无序的数据从数据库中dQ在服务器端Q必d排序后的树送到客户端显C。因此,最好从数据库读出已排好序的树?BR>
  我们知道Q字W串排序是按照字典序形式。结合SQL 语句的特点和树结构特点,数据库表中,节点的类别代码采用多U字W串形式Q如AAABBBCCCQ从树根节点开始,每向下一U字W串增加一U,q且子节点类别代码以父节点类别代码开始,再开始本U的cd代码。同U的节点按照生成的顺序编P如节点类别代码ؓAAA 的下一U孩子类别代码ؓAAAAAAQAAAAAB {,AAAAAB 的孩子节点ؓAAAAABAAA、AAAAABAAB{。每一U编号字W的宽度与实际的应用兌Q如AAA~ZZZ 一U则?63 个节点,如果不够用再增加一个字W用于编码。该巧妙的编h式。得在执行SQL 语句select * from tree_class order by classcode 后,一ơ获得完整的先序.

原文链接:http://www.7dspace.com/doc/44/0512/2005122906292220003.htm



]]>
վ֩ģ壺 պӰ߹ۿĻ | ޹avŮվ| ޸һ| Ӳֳִˬѿ| 99þ޾Ʒһ| Ļ߾ƷӰ| ޾ñĻ| Ƶѹۿ| Ƶ| AV˾Ʒ| þþ97ɫ| ޸߾Ʒ| 99߾ƷƵѹۿ9| ѹ߹ۿӰԺ| Ƶ| Ƶ| Ůվ߿| AVպƷþþþþþ | Ѹվ߹ۿ| ݺۺϾþۺ88| ɫwwwվ| þѹƵ| ޾Ʒ˾þþ| mv| þþþþAVվ| ѹԺ߹ۿ| ޹˾Ʒ| պƵ߹ۿ| ޾ƷƷþ99| һ߲Ʒ߲Ʒ| ѲƵ| ޳AVƬ߹ۿ| һëƬƵվ| Ļѹۿַ| ޾ƷŮþþþ| ˮƵ߹ۿѲŸ| 91| ĻþþƷVA | ˾ƷƵ| ޾ƷƬ߹ۿƷĻ| AVһþþƷ|