企業應用開發架構談(三) (轉)

amyz發表於2007-08-14
企業應用開發架構談(三) (轉)[@more@]

作為一個開發人員,很多年以來我都夢想有一個可以
寫出許多的程式,這樣在開發中過程中可以
節省多少時間呀。


我一向是一個很懶惰的人,編寫程式生成器讓我感到
許多樂趣,透過他我省去了許多的重複性的勞動,大大
加快了開發程式。程式生成器的很高,在開發
的許多環節都可以大顯生手:資料持久化、介面、中間
件等等。



$:為什麼需要程式生成器?


我沒有深入的研究過這個問題,所以關於這個問題我無法
講的很全面。不過從我的來講,歸納起來有以下幾點


1:抽象層次規範系統。
想象以下透過生成程式碼,你可以將實現技術,演算法,資料
結構等程式碼細節規範化,並對上層開發人員完全遮蔽。如
果需要修改實現,只需要簡單的修改定義的規範即可。


2:工作分工
在叫大規模的中,開發人員彼此間往往需要共同
維護程式碼,造成個人獨立地從事工作變的不可能。而透過
程式生成器為開發人員提供了一種工作分工的有效解決手
段。


3:可以生成系列產品
你可以透過程式生成器生成一系列的相關產品如:測試用
例、文件、圖表、其他相關程式碼等等。


4:程式族
透過成成,你可以針對同一問題,產生不同的實現,而成
為一個程式族,而不只是單一的特定系統。譬如:你可以
使用同一介面規範(xul)生成不同平臺(,)的
實現。


5:正確性和一致性
即便是你一個有多年開發經驗的開發人員,你對自己編寫
的程式碼有幾分信心?透過生成方式,可以大大減少錯誤。
軟體開發重構是免不了的,但是這往往會引發新的錯誤,
程式生成器,使的修改也變的方便許多,修改抽象的規範
即可,從而減少修改所引發的錯誤。


6:你
可以這麼說程式生成器,讓你有更多的時間不必浪費在重
復的編碼中,從而有時間去關注系統的效能。


 


$:理解程式的三中可變性。


可變性有三種:1.執行時可變性;編譯時可變性;生成時可變性。



執行時可變性


執行時可變性的資訊儲存在一個外部中並透過程式讀入。
在castor jdo中就是透過將儲存在檔案中的關係映
射資訊讀入來實現持資料久化的。前一篇文章中所講的配置
既是這種方式。


 


編譯時可可變性


編譯時將資訊合併到程式中。透過類與類的協作實現。


 


生成時可變性


將資訊透過一個定製程式的生成器讀入。SUN的JDO規範既是
這種方式。將配置資訊透過程式碼增強器讀入到程式中。生成
新的程式碼。



$:程式碼風格


世界上沒有兩片完全相同的葉子,同樣的開發人員編寫的代
碼在細節和結構上是不同的,而生成器生成的代應該是易維
護,容易理解,便於修改的。因而我們需要明白的是生成和
手寫需要遵循不同的規則。


規則1:為修改而設計。生成的程式本生不重要,重要的是
規範,沒人會去讀你生成的程式,他應該是對上遮蔽的。
規則2:注意程式的正確性。
規則3:更多的關注效能而不是可讀性和結構。


 


程式生成器生成的程式碼嚴格來講有三種風格:
1:物件導向的
  以物件導向技術來組織程式的結構。功能上進行分解。便於
  理解。
 

...............................................
 
 
 
 
 

<BR>&nbsp; <call-method target="Juggler" name="stop"/><BR>&nbsp;

 
 
 
  ........................................



public class TopFrame  extends JFrame implemetns
ActionListner{
...............................



public void actionPerformed(ActionEvent e){
 new Juggler().stop();
}
.............................. 


}



public class Juggler {
 
  public synchronized void stop() {
  }
 
  }
 
 
2:面向程式碼的驅動
  直觀,簡單的輸出程式碼需要做增加從需要的規範處獲取的資訊,
  程式碼結構緊湊,從手寫觀點來看,不便於修改,但動態輸出無妨。
 
  class  Afrmae extneds Frame{
 
  ............................
 
  public void entry(){
 
  if(prop==start){
  start();
  }else if(prop==end){
  end();
  }else if(prop==suspend){
  suspend();
  }else{
  System.exit(0);
  } 
  }
 
  ............................
  }



3:面向表格的驅動
  資料與程式碼分離,規範資訊在專門的資料結構中,程式碼在適
  當時候參照資料結構恢復資料。


class Employee{


  private int id ;
  public void setId(int newId){
  this.id =  newId;
  }
  public int getId(){
  return id;
  }
 
  private String name;
  public void setName(String newName){
  this.name = newName;
  }
  public Stirng getName(){
  return name;
  }
 
}




 
 
 
  int
  id
  ID
 
  String
  name 
  NAME
 
 

 

 
 
===>


class Data{
 //表資料。。。。
  public String[] field={"ID","NAME"};
  public String key = "ID";
  public String tableName = "EMPLOYEE";
 
}


class Employee implements Persistence{
 
 class Data{
 //表資料。。。。
  public final static String[] field={"ID","NAME"};
  public final static String key = "ID";
  public final static String tableName = "EMPLOYEE";
 
  }
  //........................


  private int id ;
  public void setId(int newId){
  this.id =  newId;
  }
  public int getId(){
  return id;
  }
 
  private String name;
  public void setName(String newName){
  this.name = newName;
  }
  public Stirng getName(){
  return name;
  }
 
  public String getTableName(){
  Data.tablename;
  }
 
  public String[] getField(){
  ....................
  }
 
  .............................
}



class DAO{


 public makePersistence( o){
  .....
 
  start= "INSERT INTO "+getTableName( ";
 
  int count = o.getField().length();


  for(int i=0;i  pr= prxP+o.getField()[i]+","; 
  prxQ = prxQ+"?";
  }
 
  sqlend= " )  VALUES ( "+  prxQ  +" )";
 
  sql = sqlstart+prxP+startend;
  ....
 
 }
}



$:作用方式


 程式碼生成有兩種作用方式:和位元組碼。前者生成的程式碼
 為原始碼,後者是在位元組嗎基礎上進行程式碼增強。我把前者
 稱為白盒方式,因為對於開發者來說可以看到生成碼內部的
 結構,好處是便於實現,不好處是對外透明,不便於遮蔽;
 後者成為黑盒方式,生成碼對外不透明,對開發人員完全屏
 蔽實現,不容易實現,需要掌握額外的(BCEL 庫).



本章完。


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956557/,如需轉載,請註明出處,否則將追究法律責任。

相關文章