狠狠撸

狠狠撸Share a Scribd company logo
Software Development for Large
      and Open Source Projects
                    Kun-Ta Chuang
Department of Computer Science and Information Engineering
              National Cheng Kung University



                                                             1
Introduction to Java Coding Style

                    Kun-Ta Chuang
Department of Computer Science and Information Engineering
              National Cheng Kung University



                                                             2
? What is Coding Style?
? Why we need to follow coding standard?
? Java coding standard




                                           3
What is Coding Style?
? Coding時固定的寫法習慣
    – 缩排方式、變數命名方式、註解寫法等等




?   軟體生命週期中,維護就佔了 80%。
?   幾乎沒有任何一個軟體從頭到尾(整個生命週期)都是由原始作者在
    維護。
?   寫碼慣例提高了程式的可讀性,讓程式設計師能更快地了解別人的程
    式碼。
?   如果程式碼是產品的一部分,你得確保它跟其他產品有相同的品質。


                                 4
Java coding standard
? 以Java 原始碼來說,在以下這些部分會有general作法:
  – 註解
  – 命名
  – 宣告
  – 缩排
  – 敘述
  – 空白



                                    5
?   註解要能幫助人們閱讀及了解程式碼
?   如果你的程式不值得寫註解,那你的程式可能也沒多大用處
?   避免過度裝飾,例如:把註解加框,讓它看起來像一幅廣告
?   要簡潔有力
?   先寫註解,才寫 code
?   好的註解要說明 why(為什麼要寫這段,為什麼要這樣寫...等等),
    而不只是說明 what (這段程式碼在做什麼)而已




                                     6
註解
? Java 的註解主要分成兩種:
 – 實作註解(implementation comments),寫法跟 C++ 的註解一樣,
   有 /*...*/ 多行註解和 // 單行註解這兩種型式
 – 文件註解(documentation comments),是 Java 特有的註解型式,寫法
   是 /**...*/,這類註解可以被 javadoc 工具讀取並產生 HTML 說明文件


? 實作註解主要是用來說明程式碼

? 文件註解則用來描述程式碼的規格




                                                    7
實作註解
? 區塊註解(多行註解)
       ? 區塊註解可以用在檔案標頭、每個函式之前、或程式碼中的任
         何地方。區塊註解的前面應該要有一列空白
/*
Description
                                                 不要用很多 * 把註解框起來,像下
                                                 面這樣:
A briefde scription of the class/interface.
                                                 /*
History
                                                  *                    *
yyyy-mm-dd Author
                                                  * 這是個錯誤示範            *
What has been changed.
                                                  *                    *
Copyright notice
                                                  */
*/

? 單行註解
       // Do a double-flip. In general, 前面要空一行




                                                                           8
文件註解
? /**
? * Disposes of this graphics context once it is no longer
? * referenced.
? *
? * @see #dispose()
? * @since 1.0
? */
? public void finalize() { dispose(); }




                                                             9
命名
?   使用完整的、能夠望文生義的英文
?   使用跟該領域相關的術語
?   大小寫混合使用,以增加可讀性
?   名稱盡量不要超過 15 個字元
?   不要只用大小寫的差異來辨別兩個變數名稱,這樣容易造
    成混淆




                            10
项目                命名慣例                             範例
Parameters        使用完整的英文來描述傳遞的變數/物件,可以在前          customer, account 或
參數                面冠上 'a' 或 'an',不管用哪種方式,最重要的是定下   aCustomer, anAccount
                  來以後就要遵守它。
Fields/propertie 使用完整的英文,第一個單字(word)的第一個字          firstName, lastName
s                 母小寫,其餘的單字的第一個字母大寫。
欄位/屬性
傳回布林型態 開頭一律冠上 'is'。                                isDead, isString, isFailed
的 getter 成員
函式
Classes           使用完整的英文,類別名稱的每個單字的第一個字母          Customer, SavingAccount
類別                大寫,其餘字母為小寫。
Compilation       以類別名稱作為主檔名,附屬檔名為小寫的'.java'。      Customer.java,
unit files                                         SavingAccount.java
檔案
Exceptions        通常以小寫字母 'e' 代表異常物件。              e
異常
Final static      全部使用大寫英文字母,每個單字以底線分隔。            MIN_BALANCE,
fields (consants)                                  DEFAULT_DATE
常數



                                                                                11
项目           命名慣例                                     範例
Getter 成員函   把要存取的欄位名稱前面冠上 'get'。                     getFirstName(),
式                                                     getLastName()
Interfaces      跟類別的命名規則相同,使用完整的英文,介面名                Runnable, Contactable,
介面              稱的每個單字的第一個字母都大寫,其餘小寫。如                Singleton
                果可能的話,盡量使用形容詞,也就是 'able','ible'
                等字尾的名稱(不是絕對必要)。
Local variables 使用完整的英文,第一個單字(word)的第一個字 grandTotal, customer,
區域變數            母小寫,其餘的單字的第一個字母大寫。注意:應 newAccount
                避免和類別的欄位名稱相同,以免產生混淆,例如,
                你有一個欄位名稱是 'firstName',那麼在成員函式
                中的區域變數就不要取相同的名稱。
Loop counters 通常以 'i', 'j', 'k' 或 'counter' 來命名。 i, j, k, cnt, counter
迴圈計數器

Packages     使用完整的英文,通常全都小寫。為了避免和其他 java.awt,
套件           套件名稱衝突,一般會將公司或組織的 internet 網 com.company.utility
             域名稱順序顛倒過來,再加上套件名稱,不用把網 com.apple.quicktime.v2
             域名稱的每個部分都加進去,用一個或兩個就行了。
Member       使用完整的英文,第一個單字(word)的第一個字 openFile(), addAccount()
functions    母小寫,其餘的單字的第一個字母大寫,盡可能以
成員函式         動詞開頭。
Setter 成員函   把要存取的欄位名稱前面冠上 'set'。         setFirstName(),
式                                         setLastName()

                                                                               12
宣告
?   一行一個宣告
    –   建議一行只寫一個宣告,這樣有利於撰寫註解,例如下面的寫法:
    –   int level; // Indentation level
?   初始化
    – 盡量在宣告變數時就設定初始值
?   宣告的位置
    – 儘管 Java 允許你在任何地方宣告變數,把宣告集中在程式區塊一開始的地方(由 {...} 包
      住的程式區塊)會比較清楚。參考下面的範例:
         if (condition) {
          int int2 = 0; // 正確 ...
         }
    – 注意不要讓區域變數蓋過外層的變數,例如:
         int count;
          ...
         myMethod() {
           if (condition) {
             int count; // 錯誤!容易讓人混淆,不易除錯
           ...
          }
          ...
         }




                                                    13
類別和介面的宣告
? 在撰寫類別和介面時,應遵守下列規則:
  – 方法名稱和左括號 '(' 之間不要有空白。
  – 左大括號 '{' 出現在同一行程式敘述的後面,而不是獨立一行。
  – 右大括號 '}' 應該是單獨一行,而且要跟它對應的程式區塊對齊。唯一的例外是,
    若程式區塊中沒有任何敘述(空的區塊),'}' 應該緊跟在 '{' 後面。
  – 方法和方法之間要空一行。
? 範例:
  class Sample extends Object {
  int ivar1;
  int ivar2;
  Sample(int i, int j) {
    ivar1 = i;
    ivar2 = j;
  }
  int emptyMethod() {}
  ...
  }

                                              14
缩排
? 每次缩排為 2 個空格,並且使用 Tab 字元來缩排,亦即修改編輯器的
  設定,將 Tab 字元以 2 個空白字元來顯示(大部分的文書編輯器都有
  提供這類功能)
? 邊界
  – 每道敘述不要超過 80 個字元,範例程式則建議在 70 個字元以下
? 折行
  – 程式碼若太長,會超出邊界時,可採取下列方式折行:
  – 在逗號之後折行。
  – 在運算元之前折行。
  – 被折下去的那行敘述,跟前一道敘述中相同階層的表示式對齊。
  – 如果上面的方式會造成程式碼太逼近右邊界(過度深層的缩排),可單純以 8
    個空白字元缩排。
  – 盡量在外層折行。




                                        15
缩排
                  if ... else 的折行規則也是用兩次縮
? Example:        排,若只用一次缩排,if 敘述折行
                   後會跟 if 區塊內的敘述對齊,使
                     得不易辨識區塊主體,例如:




                                            16
敘述
? 簡單敘述
   ? 一行只能寫一個敘述
? 複合敘述
  ?   所謂的複合敘述,指的就是以大括號 '{...}' 包住的敘述
       ?   左大括號 '{' 出現在同一行程式敘述的後面,而不是獨立一行。
       ?   右大括號 '}' 應該是單獨一行,而且要跟它對應的程式區塊對齊。
       ?   當你在寫 if-else, for, while...等敘述時,不管其中的程式只有一行還是多行,一律都要用大括號包住,以
           免日後加入新的程式碼時忘了加括號。

? return 敘述
   – 單純的傳回值不要加括號
   – 若傳回值使用了較複雜的敘述,可以使用括號




                                                                      17
敘述
? if, if-else, if else-if else 敘述    ? for 敘述




                                     ? while 敘述




? switch 敘述
                                     ? try-catch 敘述




                                                      18
空白
? 空白字元
 – 以下情況應該使用空白字元:
   ?   關鍵字和左括弧之間
   ?   參數列中的逗號後面,也就是逗號和參數名稱之間
   ?   所有二元運算子,除了 . 之外,都要用空白字元將運算元隔開
   ?   for 敘述裡面的表示式要以空白隔開
   ?   轉型時 (ex. myMethod((byte) aNum, (Object) x); )

? 空白行
 – 適當地加入空白行可以區分程式段落,提高可讀性。以下情況應該加入一行空白行:
   ?   方法和方法之間
   ?   區域變數和第一行程式敘述之間
   ?   程式區塊之前
   ?   單行註解之前
   ?   在一個方法裡面,可邏輯切割的程式段落之間(增進可讀性)
 – 以下情況應該加入兩行空白行:
   ? 類別/介面之間
   ? 在一個原始碼檔案裡面,可邏輯切割的程式段落之間


                                                       19
其他建議
?   程式中如果要用到很多次字串相加,應改用 StringBuffer,以增加程式執行的
    效能,因為字串相加會需要額外建立 String 物件的時間和記憶體資源。

?   隨時注意可能會引發 null pointer assignment 異常的程式碼,考慮物件參考為
    null 時應如何處理。

?   要使用 String.equals() 來比較某個 String 物件和字串常數時,將字串常數寫在
    左邊,這樣可以避免 String 物件為 null 時所引發的錯誤,例如:
    –   if ("Michael".equals(s))


?   盡量捕捉明確的異常類別,例如:FileNotFoundException,不要全都使用
    Exception。

?   不要用物件參考存取類別的靜態成員。

?   有特殊意義的數值應定義成常數,不要把數值寫死在程式裡。你可以用 final
    static 來定義常數。
                                                    20
Reference
?   http://geosoft.no/development/javastyle.html
?   http://chigo-studio.blogspot.tw/2008/05/coding-style-httpwww.html
?   http://www.javaworld.com.tw/jute/post/view?bid=20&id=27897&sty=1&tpg=1&age=-1
?   http://www.yestrip.com/load_file/unoprj/aaa/aaaaa%E5%B0%88%E6%A1%88%E5%90%8D%
    E7%A8%B1.htm




                                                                               21
Introduction to Java Design Pattern

                    Kun-Ta Chuang
Department of Computer Science and Information Engineering
              National Cheng Kung University



                                                         22
?   System Development Concept
?   Why Design Pattern
?   Simple Factory
?   Abstract Factory
?   Default Adapter
?   Visitor
?   Iterator
?   Strategy
?   Singleton
                                 23
Software Development Concept




                               24
Why Design Patterns
? Pattern是指不斷的重複發生的事,而有其重複性
  – 但重複的不是問題的本身, 而是問題的本質
  – 所以要把不同問題以相同的想法來處理,勢必要擷取其本質--
    也就是『抽象』化
? Examples
  – 第四台廣告中的 Pattern
    原價 ...,現在購買只要 ...,還送你一組 ...,請馬上來電 ...,
    如忙線中請稍後再撥。
  – 利用分割畫面顯示出使用前使用後的差別,來加強說服力。
    例如:由100公斤變為50公斤,媽媽用了之後變妹妹
  – 找人現身說法:「傑瑞!感謝你介紹這套歐萊禮 Java 系列,
    讓我在短短的三個月內成為公司內首屈一指的 Java 專家,
    這實在是太神奇了!」
                       From 蔡學鏞, “Design Pattern 新解”

                                                       25
Why Design Patterns
? 電影 Examples
  – 提高追殺時緊張程度的 Pattern
    壞人追殺好人時,好人躲進車子,卻發現車子發不動,
    引擎嘎嘎作響,一面努力地繼續發動,一面念念有詞
    「Come on, Come one」。
  – 壞人追殺好人時,好人衝進電梯,死命地押著 close 按
    鈕,脫口而出「Come on, Come one」。
  – 電影最後,壞人和好人大對決,最後好人勝利,但是
    好人如果直接把壞人宰了,那好人在觀眾心中的形象
    就會受損,所以好人先饒壞人一條生路,但是壞人卻
    壞到骨子裡了, 偷偷拿出一把槍瞄準好人,說時遲那
    時快,好人機警地察覺,為了自保於是將壞人一槍斃
    命。這個 Pattern 可以讓好人有人性,又讓壞人死有餘
    辜。
                    From 蔡學鏞, “Design Pattern 新解”
                                                    26
Why Design Patterns
? There are still many patterns in your life




? 日本動畫片頭pattern

                                               27
Why Design Patterns
? 基本上,Pattern 就是一種公式化的表現
  – 究竟公式化是不是好事?
  – 以藝術來說,公式化的結果會造成僵化
     ? Pattern is not good
? But for engineering, patterns is good
? Some Patterns are 千錘百鍊
  – 運用這些公式可以確保工程具備一定的品質,並
    加快工程的進行
  – 軟體開發是一項工程

                                          28
? Object-Oriented Analysis
? Object-Oriented Programming
? Object-Oriented Design
  – We use Design Patterns in OOD
  – 對於後續的 OOP、測試、維護,都會有很大的
    幫助
? 站在巨人的肩膀


                                    29
Simple Factory
? 以簡潔的方式,幫助使用者產出物件的實體。
? 主要目的想將所有物件產出的功能,集中在一個class去定
  義,而不是散亂在程式碼各處。
? 範例 :




                             30
Simple Factory
? 程式範例 :
      public class ClothFactory {
        public static Cloth getCloth() { //generate and get a cloth
          Cloth cloth = new Cloth();
          //do something
          return cloth;
        }
        public static Pant getPant() { //generate and get a pant
          Pant pant = new Pant();
          //do something
          return pant;
        }
      }
      public static void main(String args[]) { //main program
        /**only one line, user can get object they want**/
        Cloth myCloth = ClothFactory.getCloth();
      }                                                               31
Abstract Factory
? 當一個工廠必須建立許多不同種類 的產品時,將會用到
  抽象工廠樣式。
? 抽象工廠是屬於多個工廠,多個產品層級結構的設計樣
  式。
? 舉例來說
 – 製作迷宮時,會依據牆壁以及地板的樣式,而會生產出各種不
   同的迷宮(多種產品)。
 – 迷宮的工廠,需要和牆壁、地板的工廠互相結合(多個工廠)。




                              32
Abstract Factory
? 以製作迷宮為例




                          33
Default Adapter
? 在Java中,如果要定義事件處理的方式,必須要實作
  EventListener的介面。
? 以WindowListener為例,其中定義7個介面需要去實做 :

    public interface WindowListener extends EventListener {
      public void windowOpened(WindowEvent e);
      public void windowClosing(WindowEvent e);
      public void windowClosed(WindowEvent e);
      public void windowIconified(WindowEvent e);
      public void windowDeiconified(WindowEvent e);
      public void windowActivated(WindowEvent e);
      public void windowDecativated(WindowEvent e);
    }
                                                              34
Default Adapter
? 如此有一個缺點,實作介面的原則是您必須實作當中定義
  的所有方法,即使使用者只對其中某一方法有興趣而已,
  仍然必須將其他所有方法實做出來。
? 解決法 : 可以透過繼承WindowAdapter類別,並重新定義
  一些您所感興趣的事件,如此一來,就可以避開直接實作
  WindowListener介面的缺點:

   public class WindowEventHandler extends WindowAdapter {
     public void windowClosed(WindowEvent e) {
       System.exit(0);
     }
   }


                                                             35
Visitor
? 範例 : 我們想設計一郵資系統,計算出一系列物件的總郵
  資。但郵資會根據物件種類、重量而有所不同。
? 沒學過Visitor前的想法,設計可能如下 :
   public void addPrice(Item item) { //add price of passing item to total price
       if(item instanceof Book) { //this item is a book
                     totalPrice = totalPrice + ((Book) item).getWeight() * 2 + 100;
       }
       else if(item instanceof CD) { //this item is a CD
                     totalPrice = totalPrice + ((CD) item).getWeight() * 5;
       }
       //a series of else if definition…
     }



 問題 : 一旦物件增加時,會加深程式碼的複雜度
                                                                               36
Visitor
? 為何需要Visitor?
  – 將演算流程與所操作的物件之特定結構分離,針對特定物件的操作
    部份將集中在Visitor中管理,方便隨時修改操作。
  – 主要使用overload的技術。
  – interface Visitor
      ? 定義針對各種物件操作的方法介面。
          public interface Visitor{
            public void visit(Book book); //visit Book item
            public void visit(CD cd); //visit CD item
            //other definition
          }
  – interface Visitable
      ? 定義一個public void accept(Visitor visitor) 的介面。所有要處理的物件將會實做
        visitable,並強制實做accept方法。
             public interface Visitable{
               public void accept(Visitor visitor); //separate varied operation
             }                                                                    37
Visitor
/** 定義Book物件並實作Visitable**/                      /* 實做Visitor */
public class Book implements Visitable {         public class PostageVisitor implements Visitor{
  //variable definition                            //variable definition
  //accept the visitor                             //collect data about the book
  public void accept(Visitor vistor) {              public void visit(Book book) {
    visitor. visit(this); //**overload**               totalPrice = totalPrice + book. getWeight() * 2 + 100;
  }                                                 }
  //other method definition                         //define other visitors
}                                                   public void visit(CD cd){...}
//other definition object with implementation       //other method definition
//of Visitable …                                 }

                              /**主程式**/
                              Public static void main(String args[]) {
                                 //create visitor
                                 PostageVisitor visitor = new PostageVisitor();
                                 //iterate through all items
                                 for(Visitable item: items){
                                   item. accept(visitor);
                                 }
                                 //get total price
                                 double totalPrice = visitor.getTotalPrice();
                                                                                                    38
                              }
Iterator
? 為了能夠逐一取得特定結構內所有資料,將會定義foreach()
  方法。
 – 問題 : 不同資料結構(ex. List、Set),所提供的公開存取方法也不相同,
   因此就必須定義多種foreach()方法。
 – 解決法 : 無論是List或Set,都繼承Collection介面,因此都有個
   iterator()方法可以傳回一個Iterator物件,之後便可透過hasNext()、
   next()方法,逐一取出資料。因此程式可依照以下設計:

     public static void foreach(Collection<String> collection) {
       Iterator<String> iterator = collection.iterator();
       while(iterator.hasNext()) {
          System.out.println(iterator.next());
       }
     }


                                                                   39
Strategy
? 以伺服器程式撰寫為例
 –   Step1. 一開始會進行ServerSocket的建立。
 –   Step2. 呼叫accept()傾聽連線。
 –   Step3. 當偵測到使用者連線時,為使用者執行服務。
 –   由以上步驟來看,真正不同之處為服務的流程。因此可以設計通
     用的伺服器框架,將連線後的服務獨立出來,並封裝成套件,方
     便不同服務的抽換。




                                     40
Strategy
? Strategy模式著重在服務細節或演算流程的封裝,將服務
  與演算法封裝為一個個的Strategy物件,讓使用者可以依
  需求抽換服務或演算法,而不用關心服務或演算法的實作
  方式。
? 優點 : 不會因為策略的改變,而需要去修改程式碼。




                              41
Singleton
? 為design pattrn中架構最簡單的模式。
? 定義 :
  – 類別中只允許定義單一個物件實體。
  – 允許其他物件進行此單一物件的存取(global access)。
? Think1. 一開始我們直覺便會想到的方法,便是於程式執行
  開始,便建立一全域物件實體。
  – 缺點 : 假設物件從頭到尾都沒用到,變造成空間的浪費。




                                       42
Singleton
? Think2. 使用Lazy Initialization觀念,當物件被第一次存取時,
  再建立該物件。
  – 問題: 一旦應用多執行緒程式下,會面臨多個執行緒競爭同一資源
    的,產生兩個以上物件的問題。

         public class Singleton {
           private static Singleton instance = null;
           private Singleton() { … }
           //judge and get instance
           public static Singleton getInstance() {
              /* lazy initialization */
              if (instance == null) { //check object
                 instance = new Singleton();
              }
              return instance;
           }
           //other definition
         }
                                                       43
Singleton
? Think3. 使用同步機制,但為了考慮效能的問題,便使用
  Double-check Locking的方法,僅於物件尚未建立時才進行
  同步以及物件實體判斷。
       public class Singleton {
         private static Singleton instance = null;
         private Singleton(){…}
         //judge and get instance
         public static Singleton getInstance() {
            if (instance == null){ //check object
               synchronized(Singleton.class){ //同步
                  /* lazy initialization */
                  if(instance == null) { //check object again
                      instance = new Singleton();
                  }
               }
            }
            return instance;
         }
       }                                                        44
相關參考來源
? 設計模式筆記
  – http://caterpillar.onlyfun.net/Gossip/DesignPatter
    n/DesignPattern.htm
? Java Papers – Design Patterns
  – http://javapapers.com/category/design-patterns/




                                                      45

More Related Content

What's hot (12)

Java SE 8 技術手冊第 3 章 - 基础语法
Java SE 8 技術手冊第 3 章 - 基础语法Java SE 8 技術手冊第 3 章 - 基础语法
Java SE 8 技術手冊第 3 章 - 基础语法
Justin Lin
?
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
?
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
?
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
?
Ch10
Ch10Ch10
Ch10
jashliao
?
Ch03
Ch03Ch03
Ch03
jashliao
?
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3
ArBing Xie
?
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言
鍾誠 陳鍾誠
?
贰谤濒补苍驳培训
贰谤濒补苍驳培训贰谤濒补苍驳培训
贰谤濒补苍驳培训
liu qiang
?
第叁章
第叁章第叁章
第叁章
贺 利华
?
基础语法
基础语法基础语法
基础语法
Justin Lin
?
Java SE 8 技術手冊第 3 章 - 基础语法
Java SE 8 技術手冊第 3 章 - 基础语法Java SE 8 技術手冊第 3 章 - 基础语法
Java SE 8 技術手冊第 3 章 - 基础语法
Justin Lin
?
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
?
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
?
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
?
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3
ArBing Xie
?
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言
鍾誠 陳鍾誠
?
贰谤濒补苍驳培训
贰谤濒补苍驳培训贰谤濒补苍驳培训
贰谤濒补苍驳培训
liu qiang
?

Similar to 3. java basics (20)

9, interfaces
9, interfaces9, interfaces
9, interfaces
ted-xu
?
12, string
12, string12, string
12, string
ted-xu
?
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
yiditushe
?
模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿
czzz1
?
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Li Hsuan Hung
?
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
Ho Kim
?
第9章 Shell 編程
第9章 Shell 編程第9章 Shell 編程
第9章 Shell 編程
kidmany2001
?
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计
hanmo1988
?
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
建興 王
?
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
Sita Liu
?
为什么要学笔测迟丑辞苍
为什么要学笔测迟丑辞苍为什么要学笔测迟丑辞苍
为什么要学笔测迟丑辞苍
Depeng Cong
?
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
yiditushe
?
齿肠辞诲别开发员入门导引(简体中文版)
齿肠辞诲别开发员入门导引(简体中文版)齿肠辞诲别开发员入门导引(简体中文版)
齿肠辞诲别开发员入门导引(简体中文版)
babyyellow li
?
齿肠辞诲别开发员入门导引
齿肠辞诲别开发员入门导引齿肠辞诲别开发员入门导引
齿肠辞诲别开发员入门导引
Sophia Lindsey
?
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
ted-xu
?
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点
thinkinlamp
?
9, interfaces
9, interfaces9, interfaces
9, interfaces
ted-xu
?
12, string
12, string12, string
12, string
ted-xu
?
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
yiditushe
?
模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿模块一-骋辞语言特性.辫诲蹿
模块一-骋辞语言特性.辫诲蹿
czzz1
?
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Li Hsuan Hung
?
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
Ho Kim
?
第9章 Shell 編程
第9章 Shell 編程第9章 Shell 編程
第9章 Shell 編程
kidmany2001
?
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计
hanmo1988
?
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
建興 王
?
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
Sita Liu
?
为什么要学笔测迟丑辞苍
为什么要学笔测迟丑辞苍为什么要学笔测迟丑辞苍
为什么要学笔测迟丑辞苍
Depeng Cong
?
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
yiditushe
?
齿肠辞诲别开发员入门导引(简体中文版)
齿肠辞诲别开发员入门导引(简体中文版)齿肠辞诲别开发员入门导引(简体中文版)
齿肠辞诲别开发员入门导引(简体中文版)
babyyellow li
?
齿肠辞诲别开发员入门导引
齿肠辞诲别开发员入门导引齿肠辞诲别开发员入门导引
齿肠辞诲别开发员入门导引
Sophia Lindsey
?
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
ted-xu
?
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点
thinkinlamp
?

More from netdbncku (11)

Jenkins hand in hand
Jenkins  hand in handJenkins  hand in hand
Jenkins hand in hand
netdbncku
?
Continuous integration
Continuous integrationContinuous integration
Continuous integration
netdbncku
?
20121213 qa introduction smileryang
20121213 qa introduction smileryang20121213 qa introduction smileryang
20121213 qa introduction smileryang
netdbncku
?
20121213 foundation of software development 2 2-ktchuang
20121213 foundation of software development 2 2-ktchuang20121213 foundation of software development 2 2-ktchuang
20121213 foundation of software development 2 2-ktchuang
netdbncku
?
Software development lifecycle_release_management
Software development lifecycle_release_managementSoftware development lifecycle_release_management
Software development lifecycle_release_management
netdbncku
?
2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su
2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su
2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su
netdbncku
?
Intoduction of programming contest
Intoduction of programming contestIntoduction of programming contest
Intoduction of programming contest
netdbncku
?
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
netdbncku
?
Tutorial of eclipse
Tutorial of eclipseTutorial of eclipse
Tutorial of eclipse
netdbncku
?
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
netdbncku
?
2. java introduction
2. java introduction2. java introduction
2. java introduction
netdbncku
?
Jenkins hand in hand
Jenkins  hand in handJenkins  hand in hand
Jenkins hand in hand
netdbncku
?
Continuous integration
Continuous integrationContinuous integration
Continuous integration
netdbncku
?
20121213 qa introduction smileryang
20121213 qa introduction smileryang20121213 qa introduction smileryang
20121213 qa introduction smileryang
netdbncku
?
20121213 foundation of software development 2 2-ktchuang
20121213 foundation of software development 2 2-ktchuang20121213 foundation of software development 2 2-ktchuang
20121213 foundation of software development 2 2-ktchuang
netdbncku
?
Software development lifecycle_release_management
Software development lifecycle_release_managementSoftware development lifecycle_release_management
Software development lifecycle_release_management
netdbncku
?
2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su
2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su
2012 11-16 cloud practices-in_trend_micro_2012 - chung-tsai su
netdbncku
?
Intoduction of programming contest
Intoduction of programming contestIntoduction of programming contest
Intoduction of programming contest
netdbncku
?
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
netdbncku
?
Tutorial of eclipse
Tutorial of eclipseTutorial of eclipse
Tutorial of eclipse
netdbncku
?
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
netdbncku
?
2. java introduction
2. java introduction2. java introduction
2. java introduction
netdbncku
?

3. java basics

  • 1. Software Development for Large and Open Source Projects Kun-Ta Chuang Department of Computer Science and Information Engineering National Cheng Kung University 1
  • 2. Introduction to Java Coding Style Kun-Ta Chuang Department of Computer Science and Information Engineering National Cheng Kung University 2
  • 3. ? What is Coding Style? ? Why we need to follow coding standard? ? Java coding standard 3
  • 4. What is Coding Style? ? Coding時固定的寫法習慣 – 缩排方式、變數命名方式、註解寫法等等 ? 軟體生命週期中,維護就佔了 80%。 ? 幾乎沒有任何一個軟體從頭到尾(整個生命週期)都是由原始作者在 維護。 ? 寫碼慣例提高了程式的可讀性,讓程式設計師能更快地了解別人的程 式碼。 ? 如果程式碼是產品的一部分,你得確保它跟其他產品有相同的品質。 4
  • 5. Java coding standard ? 以Java 原始碼來說,在以下這些部分會有general作法: – 註解 – 命名 – 宣告 – 缩排 – 敘述 – 空白 5
  • 6. ? 註解要能幫助人們閱讀及了解程式碼 ? 如果你的程式不值得寫註解,那你的程式可能也沒多大用處 ? 避免過度裝飾,例如:把註解加框,讓它看起來像一幅廣告 ? 要簡潔有力 ? 先寫註解,才寫 code ? 好的註解要說明 why(為什麼要寫這段,為什麼要這樣寫...等等), 而不只是說明 what (這段程式碼在做什麼)而已 6
  • 7. 註解 ? Java 的註解主要分成兩種: – 實作註解(implementation comments),寫法跟 C++ 的註解一樣, 有 /*...*/ 多行註解和 // 單行註解這兩種型式 – 文件註解(documentation comments),是 Java 特有的註解型式,寫法 是 /**...*/,這類註解可以被 javadoc 工具讀取並產生 HTML 說明文件 ? 實作註解主要是用來說明程式碼 ? 文件註解則用來描述程式碼的規格 7
  • 8. 實作註解 ? 區塊註解(多行註解) ? 區塊註解可以用在檔案標頭、每個函式之前、或程式碼中的任 何地方。區塊註解的前面應該要有一列空白 /* Description 不要用很多 * 把註解框起來,像下 面這樣: A briefde scription of the class/interface. /* History * * yyyy-mm-dd Author * 這是個錯誤示範 * What has been changed. * * Copyright notice */ */ ? 單行註解 // Do a double-flip. In general, 前面要空一行 8
  • 9. 文件註解 ? /** ? * Disposes of this graphics context once it is no longer ? * referenced. ? * ? * @see #dispose() ? * @since 1.0 ? */ ? public void finalize() { dispose(); } 9
  • 10. 命名 ? 使用完整的、能夠望文生義的英文 ? 使用跟該領域相關的術語 ? 大小寫混合使用,以增加可讀性 ? 名稱盡量不要超過 15 個字元 ? 不要只用大小寫的差異來辨別兩個變數名稱,這樣容易造 成混淆 10
  • 11. 项目 命名慣例 範例 Parameters 使用完整的英文來描述傳遞的變數/物件,可以在前 customer, account 或 參數 面冠上 'a' 或 'an',不管用哪種方式,最重要的是定下 aCustomer, anAccount 來以後就要遵守它。 Fields/propertie 使用完整的英文,第一個單字(word)的第一個字 firstName, lastName s 母小寫,其餘的單字的第一個字母大寫。 欄位/屬性 傳回布林型態 開頭一律冠上 'is'。 isDead, isString, isFailed 的 getter 成員 函式 Classes 使用完整的英文,類別名稱的每個單字的第一個字母 Customer, SavingAccount 類別 大寫,其餘字母為小寫。 Compilation 以類別名稱作為主檔名,附屬檔名為小寫的'.java'。 Customer.java, unit files SavingAccount.java 檔案 Exceptions 通常以小寫字母 'e' 代表異常物件。 e 異常 Final static 全部使用大寫英文字母,每個單字以底線分隔。 MIN_BALANCE, fields (consants) DEFAULT_DATE 常數 11
  • 12. 项目 命名慣例 範例 Getter 成員函 把要存取的欄位名稱前面冠上 'get'。 getFirstName(), 式 getLastName() Interfaces 跟類別的命名規則相同,使用完整的英文,介面名 Runnable, Contactable, 介面 稱的每個單字的第一個字母都大寫,其餘小寫。如 Singleton 果可能的話,盡量使用形容詞,也就是 'able','ible' 等字尾的名稱(不是絕對必要)。 Local variables 使用完整的英文,第一個單字(word)的第一個字 grandTotal, customer, 區域變數 母小寫,其餘的單字的第一個字母大寫。注意:應 newAccount 避免和類別的欄位名稱相同,以免產生混淆,例如, 你有一個欄位名稱是 'firstName',那麼在成員函式 中的區域變數就不要取相同的名稱。 Loop counters 通常以 'i', 'j', 'k' 或 'counter' 來命名。 i, j, k, cnt, counter 迴圈計數器 Packages 使用完整的英文,通常全都小寫。為了避免和其他 java.awt, 套件 套件名稱衝突,一般會將公司或組織的 internet 網 com.company.utility 域名稱順序顛倒過來,再加上套件名稱,不用把網 com.apple.quicktime.v2 域名稱的每個部分都加進去,用一個或兩個就行了。 Member 使用完整的英文,第一個單字(word)的第一個字 openFile(), addAccount() functions 母小寫,其餘的單字的第一個字母大寫,盡可能以 成員函式 動詞開頭。 Setter 成員函 把要存取的欄位名稱前面冠上 'set'。 setFirstName(), 式 setLastName() 12
  • 13. 宣告 ? 一行一個宣告 – 建議一行只寫一個宣告,這樣有利於撰寫註解,例如下面的寫法: – int level; // Indentation level ? 初始化 – 盡量在宣告變數時就設定初始值 ? 宣告的位置 – 儘管 Java 允許你在任何地方宣告變數,把宣告集中在程式區塊一開始的地方(由 {...} 包 住的程式區塊)會比較清楚。參考下面的範例: if (condition) { int int2 = 0; // 正確 ... } – 注意不要讓區域變數蓋過外層的變數,例如: int count; ... myMethod() { if (condition) { int count; // 錯誤!容易讓人混淆,不易除錯 ... } ... } 13
  • 14. 類別和介面的宣告 ? 在撰寫類別和介面時,應遵守下列規則: – 方法名稱和左括號 '(' 之間不要有空白。 – 左大括號 '{' 出現在同一行程式敘述的後面,而不是獨立一行。 – 右大括號 '}' 應該是單獨一行,而且要跟它對應的程式區塊對齊。唯一的例外是, 若程式區塊中沒有任何敘述(空的區塊),'}' 應該緊跟在 '{' 後面。 – 方法和方法之間要空一行。 ? 範例: class Sample extends Object { int ivar1; int ivar2; Sample(int i, int j) { ivar1 = i; ivar2 = j; } int emptyMethod() {} ... } 14
  • 15. 缩排 ? 每次缩排為 2 個空格,並且使用 Tab 字元來缩排,亦即修改編輯器的 設定,將 Tab 字元以 2 個空白字元來顯示(大部分的文書編輯器都有 提供這類功能) ? 邊界 – 每道敘述不要超過 80 個字元,範例程式則建議在 70 個字元以下 ? 折行 – 程式碼若太長,會超出邊界時,可採取下列方式折行: – 在逗號之後折行。 – 在運算元之前折行。 – 被折下去的那行敘述,跟前一道敘述中相同階層的表示式對齊。 – 如果上面的方式會造成程式碼太逼近右邊界(過度深層的缩排),可單純以 8 個空白字元缩排。 – 盡量在外層折行。 15
  • 16. 缩排 if ... else 的折行規則也是用兩次縮 ? Example: 排,若只用一次缩排,if 敘述折行 後會跟 if 區塊內的敘述對齊,使 得不易辨識區塊主體,例如: 16
  • 17. 敘述 ? 簡單敘述 ? 一行只能寫一個敘述 ? 複合敘述 ? 所謂的複合敘述,指的就是以大括號 '{...}' 包住的敘述 ? 左大括號 '{' 出現在同一行程式敘述的後面,而不是獨立一行。 ? 右大括號 '}' 應該是單獨一行,而且要跟它對應的程式區塊對齊。 ? 當你在寫 if-else, for, while...等敘述時,不管其中的程式只有一行還是多行,一律都要用大括號包住,以 免日後加入新的程式碼時忘了加括號。 ? return 敘述 – 單純的傳回值不要加括號 – 若傳回值使用了較複雜的敘述,可以使用括號 17
  • 18. 敘述 ? if, if-else, if else-if else 敘述 ? for 敘述 ? while 敘述 ? switch 敘述 ? try-catch 敘述 18
  • 19. 空白 ? 空白字元 – 以下情況應該使用空白字元: ? 關鍵字和左括弧之間 ? 參數列中的逗號後面,也就是逗號和參數名稱之間 ? 所有二元運算子,除了 . 之外,都要用空白字元將運算元隔開 ? for 敘述裡面的表示式要以空白隔開 ? 轉型時 (ex. myMethod((byte) aNum, (Object) x); ) ? 空白行 – 適當地加入空白行可以區分程式段落,提高可讀性。以下情況應該加入一行空白行: ? 方法和方法之間 ? 區域變數和第一行程式敘述之間 ? 程式區塊之前 ? 單行註解之前 ? 在一個方法裡面,可邏輯切割的程式段落之間(增進可讀性) – 以下情況應該加入兩行空白行: ? 類別/介面之間 ? 在一個原始碼檔案裡面,可邏輯切割的程式段落之間 19
  • 20. 其他建議 ? 程式中如果要用到很多次字串相加,應改用 StringBuffer,以增加程式執行的 效能,因為字串相加會需要額外建立 String 物件的時間和記憶體資源。 ? 隨時注意可能會引發 null pointer assignment 異常的程式碼,考慮物件參考為 null 時應如何處理。 ? 要使用 String.equals() 來比較某個 String 物件和字串常數時,將字串常數寫在 左邊,這樣可以避免 String 物件為 null 時所引發的錯誤,例如: – if ("Michael".equals(s)) ? 盡量捕捉明確的異常類別,例如:FileNotFoundException,不要全都使用 Exception。 ? 不要用物件參考存取類別的靜態成員。 ? 有特殊意義的數值應定義成常數,不要把數值寫死在程式裡。你可以用 final static 來定義常數。 20
  • 21. Reference ? http://geosoft.no/development/javastyle.html ? http://chigo-studio.blogspot.tw/2008/05/coding-style-httpwww.html ? http://www.javaworld.com.tw/jute/post/view?bid=20&id=27897&sty=1&tpg=1&age=-1 ? http://www.yestrip.com/load_file/unoprj/aaa/aaaaa%E5%B0%88%E6%A1%88%E5%90%8D% E7%A8%B1.htm 21
  • 22. Introduction to Java Design Pattern Kun-Ta Chuang Department of Computer Science and Information Engineering National Cheng Kung University 22
  • 23. ? System Development Concept ? Why Design Pattern ? Simple Factory ? Abstract Factory ? Default Adapter ? Visitor ? Iterator ? Strategy ? Singleton 23
  • 25. Why Design Patterns ? Pattern是指不斷的重複發生的事,而有其重複性 – 但重複的不是問題的本身, 而是問題的本質 – 所以要把不同問題以相同的想法來處理,勢必要擷取其本質-- 也就是『抽象』化 ? Examples – 第四台廣告中的 Pattern 原價 ...,現在購買只要 ...,還送你一組 ...,請馬上來電 ..., 如忙線中請稍後再撥。 – 利用分割畫面顯示出使用前使用後的差別,來加強說服力。 例如:由100公斤變為50公斤,媽媽用了之後變妹妹 – 找人現身說法:「傑瑞!感謝你介紹這套歐萊禮 Java 系列, 讓我在短短的三個月內成為公司內首屈一指的 Java 專家, 這實在是太神奇了!」 From 蔡學鏞, “Design Pattern 新解” 25
  • 26. Why Design Patterns ? 電影 Examples – 提高追殺時緊張程度的 Pattern 壞人追殺好人時,好人躲進車子,卻發現車子發不動, 引擎嘎嘎作響,一面努力地繼續發動,一面念念有詞 「Come on, Come one」。 – 壞人追殺好人時,好人衝進電梯,死命地押著 close 按 鈕,脫口而出「Come on, Come one」。 – 電影最後,壞人和好人大對決,最後好人勝利,但是 好人如果直接把壞人宰了,那好人在觀眾心中的形象 就會受損,所以好人先饒壞人一條生路,但是壞人卻 壞到骨子裡了, 偷偷拿出一把槍瞄準好人,說時遲那 時快,好人機警地察覺,為了自保於是將壞人一槍斃 命。這個 Pattern 可以讓好人有人性,又讓壞人死有餘 辜。 From 蔡學鏞, “Design Pattern 新解” 26
  • 27. Why Design Patterns ? There are still many patterns in your life ? 日本動畫片頭pattern 27
  • 28. Why Design Patterns ? 基本上,Pattern 就是一種公式化的表現 – 究竟公式化是不是好事? – 以藝術來說,公式化的結果會造成僵化 ? Pattern is not good ? But for engineering, patterns is good ? Some Patterns are 千錘百鍊 – 運用這些公式可以確保工程具備一定的品質,並 加快工程的進行 – 軟體開發是一項工程 28
  • 29. ? Object-Oriented Analysis ? Object-Oriented Programming ? Object-Oriented Design – We use Design Patterns in OOD – 對於後續的 OOP、測試、維護,都會有很大的 幫助 ? 站在巨人的肩膀 29
  • 30. Simple Factory ? 以簡潔的方式,幫助使用者產出物件的實體。 ? 主要目的想將所有物件產出的功能,集中在一個class去定 義,而不是散亂在程式碼各處。 ? 範例 : 30
  • 31. Simple Factory ? 程式範例 : public class ClothFactory { public static Cloth getCloth() { //generate and get a cloth Cloth cloth = new Cloth(); //do something return cloth; } public static Pant getPant() { //generate and get a pant Pant pant = new Pant(); //do something return pant; } } public static void main(String args[]) { //main program /**only one line, user can get object they want**/ Cloth myCloth = ClothFactory.getCloth(); } 31
  • 32. Abstract Factory ? 當一個工廠必須建立許多不同種類 的產品時,將會用到 抽象工廠樣式。 ? 抽象工廠是屬於多個工廠,多個產品層級結構的設計樣 式。 ? 舉例來說 – 製作迷宮時,會依據牆壁以及地板的樣式,而會生產出各種不 同的迷宮(多種產品)。 – 迷宮的工廠,需要和牆壁、地板的工廠互相結合(多個工廠)。 32
  • 34. Default Adapter ? 在Java中,如果要定義事件處理的方式,必須要實作 EventListener的介面。 ? 以WindowListener為例,其中定義7個介面需要去實做 : public interface WindowListener extends EventListener { public void windowOpened(WindowEvent e); public void windowClosing(WindowEvent e); public void windowClosed(WindowEvent e); public void windowIconified(WindowEvent e); public void windowDeiconified(WindowEvent e); public void windowActivated(WindowEvent e); public void windowDecativated(WindowEvent e); } 34
  • 35. Default Adapter ? 如此有一個缺點,實作介面的原則是您必須實作當中定義 的所有方法,即使使用者只對其中某一方法有興趣而已, 仍然必須將其他所有方法實做出來。 ? 解決法 : 可以透過繼承WindowAdapter類別,並重新定義 一些您所感興趣的事件,如此一來,就可以避開直接實作 WindowListener介面的缺點: public class WindowEventHandler extends WindowAdapter { public void windowClosed(WindowEvent e) { System.exit(0); } } 35
  • 36. Visitor ? 範例 : 我們想設計一郵資系統,計算出一系列物件的總郵 資。但郵資會根據物件種類、重量而有所不同。 ? 沒學過Visitor前的想法,設計可能如下 : public void addPrice(Item item) { //add price of passing item to total price if(item instanceof Book) { //this item is a book totalPrice = totalPrice + ((Book) item).getWeight() * 2 + 100; } else if(item instanceof CD) { //this item is a CD totalPrice = totalPrice + ((CD) item).getWeight() * 5; } //a series of else if definition… } 問題 : 一旦物件增加時,會加深程式碼的複雜度 36
  • 37. Visitor ? 為何需要Visitor? – 將演算流程與所操作的物件之特定結構分離,針對特定物件的操作 部份將集中在Visitor中管理,方便隨時修改操作。 – 主要使用overload的技術。 – interface Visitor ? 定義針對各種物件操作的方法介面。 public interface Visitor{ public void visit(Book book); //visit Book item public void visit(CD cd); //visit CD item //other definition } – interface Visitable ? 定義一個public void accept(Visitor visitor) 的介面。所有要處理的物件將會實做 visitable,並強制實做accept方法。 public interface Visitable{ public void accept(Visitor visitor); //separate varied operation } 37
  • 38. Visitor /** 定義Book物件並實作Visitable**/ /* 實做Visitor */ public class Book implements Visitable { public class PostageVisitor implements Visitor{ //variable definition //variable definition //accept the visitor //collect data about the book public void accept(Visitor vistor) { public void visit(Book book) { visitor. visit(this); //**overload** totalPrice = totalPrice + book. getWeight() * 2 + 100; } } //other method definition //define other visitors } public void visit(CD cd){...} //other definition object with implementation //other method definition //of Visitable … } /**主程式**/ Public static void main(String args[]) { //create visitor PostageVisitor visitor = new PostageVisitor(); //iterate through all items for(Visitable item: items){ item. accept(visitor); } //get total price double totalPrice = visitor.getTotalPrice(); 38 }
  • 39. Iterator ? 為了能夠逐一取得特定結構內所有資料,將會定義foreach() 方法。 – 問題 : 不同資料結構(ex. List、Set),所提供的公開存取方法也不相同, 因此就必須定義多種foreach()方法。 – 解決法 : 無論是List或Set,都繼承Collection介面,因此都有個 iterator()方法可以傳回一個Iterator物件,之後便可透過hasNext()、 next()方法,逐一取出資料。因此程式可依照以下設計: public static void foreach(Collection<String> collection) { Iterator<String> iterator = collection.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } } 39
  • 40. Strategy ? 以伺服器程式撰寫為例 – Step1. 一開始會進行ServerSocket的建立。 – Step2. 呼叫accept()傾聽連線。 – Step3. 當偵測到使用者連線時,為使用者執行服務。 – 由以上步驟來看,真正不同之處為服務的流程。因此可以設計通 用的伺服器框架,將連線後的服務獨立出來,並封裝成套件,方 便不同服務的抽換。 40
  • 41. Strategy ? Strategy模式著重在服務細節或演算流程的封裝,將服務 與演算法封裝為一個個的Strategy物件,讓使用者可以依 需求抽換服務或演算法,而不用關心服務或演算法的實作 方式。 ? 優點 : 不會因為策略的改變,而需要去修改程式碼。 41
  • 42. Singleton ? 為design pattrn中架構最簡單的模式。 ? 定義 : – 類別中只允許定義單一個物件實體。 – 允許其他物件進行此單一物件的存取(global access)。 ? Think1. 一開始我們直覺便會想到的方法,便是於程式執行 開始,便建立一全域物件實體。 – 缺點 : 假設物件從頭到尾都沒用到,變造成空間的浪費。 42
  • 43. Singleton ? Think2. 使用Lazy Initialization觀念,當物件被第一次存取時, 再建立該物件。 – 問題: 一旦應用多執行緒程式下,會面臨多個執行緒競爭同一資源 的,產生兩個以上物件的問題。 public class Singleton { private static Singleton instance = null; private Singleton() { … } //judge and get instance public static Singleton getInstance() { /* lazy initialization */ if (instance == null) { //check object instance = new Singleton(); } return instance; } //other definition } 43
  • 44. Singleton ? Think3. 使用同步機制,但為了考慮效能的問題,便使用 Double-check Locking的方法,僅於物件尚未建立時才進行 同步以及物件實體判斷。 public class Singleton { private static Singleton instance = null; private Singleton(){…} //judge and get instance public static Singleton getInstance() { if (instance == null){ //check object synchronized(Singleton.class){ //同步 /* lazy initialization */ if(instance == null) { //check object again instance = new Singleton(); } } } return instance; } } 44
  • 45. 相關參考來源 ? 設計模式筆記 – http://caterpillar.onlyfun.net/Gossip/DesignPatter n/DesignPattern.htm ? Java Papers – Design Patterns – http://javapapers.com/category/design-patterns/ 45