SlideShare 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

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 3ArBing Xie
 
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言
鍾誠 陳鍾誠
 
Erlang培训
Erlang培训Erlang培训
Erlang培训liu qiang
 
第三章
第三章第三章
第三章
贺 利华
 
基礎語法
基礎語法基礎語法
基礎語法
Justin Lin
 

What's hot (12)

Java SE 8 技術手冊第 3 章 - 基礎語法
Java SE 8 技術手冊第 3 章 - 基礎語法Java SE 8 技術手冊第 3 章 - 基礎語法
Java SE 8 技術手冊第 3 章 - 基礎語法
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
 
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件
 
Dev307
Dev307Dev307
Dev307
 
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用API
 
Ch10
Ch10Ch10
Ch10
 
Ch03
Ch03Ch03
Ch03
 
[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3[圣思园][Java SE]Io 3
[圣思园][Java SE]Io 3
 
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言
 
Erlang培训
Erlang培训Erlang培训
Erlang培训
 
第三章
第三章第三章
第三章
 
基礎語法
基礎語法基礎語法
基礎語法
 

Similar to 3. java basics

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
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
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
 
为什么要学Python
为什么要学Python为什么要学Python
为什么要学PythonDepeng Cong
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
Xcode开发员入门导引(简体中文版)
Xcode开发员入门导引(简体中文版)Xcode开发员入门导引(简体中文版)
Xcode开发员入门导引(简体中文版)babyyellow li
 
Xcode开发员入门导引
Xcode开发员入门导引Xcode开发员入门导引
Xcode开发员入门导引Sophia Lindsey
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
ted-xu
 
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点thinkinlamp
 

Similar to 3. java basics (20)

9, interfaces
9, interfaces9, interfaces
9, interfaces
 
SCJP ch16
SCJP ch16SCJP ch16
SCJP ch16
 
12, string
12, string12, string
12, string
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
 
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
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
第9章 Shell 編程
第9章 Shell 編程第9章 Shell 編程
第9章 Shell 編程
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
 
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
 
为什么要学Python
为什么要学Python为什么要学Python
为什么要学Python
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
Xcode开发员入门导引(简体中文版)
Xcode开发员入门导引(简体中文版)Xcode开发员入门导引(简体中文版)
Xcode开发员入门导引(简体中文版)
 
Xcode开发员入门导引
Xcode开发员入门导引Xcode开发员入门导引
Xcode开发员入门导引
 
2, object oriented programming
2, object oriented programming2, object oriented programming
2, object oriented programming
 
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点
 
SCJP ch02
SCJP ch02SCJP ch02
SCJP ch02
 

More from netdbncku

Jenkins hand in hand
Jenkins  hand in handJenkins  hand in hand
Jenkins hand in hand
netdbncku
 
Continuous integration
Continuous integrationContinuous integration
Continuous integrationnetdbncku
 
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-ktchuangnetdbncku
 
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 contestnetdbncku
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2netdbncku
 
Tutorial of eclipse
Tutorial of eclipseTutorial of eclipse
Tutorial of eclipsenetdbncku
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
2. java introduction
2. java introduction2. java introduction
2. java introductionnetdbncku
 

More from netdbncku (11)

Jenkins hand in hand
Jenkins  hand in handJenkins  hand in hand
Jenkins hand in hand
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
 
20121213 qa introduction smileryang
20121213 qa introduction smileryang20121213 qa introduction smileryang
20121213 qa introduction smileryang
 
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
 
Software development lifecycle_release_management
Software development lifecycle_release_managementSoftware development lifecycle_release_management
Software development lifecycle_release_management
 
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
 
Intoduction of programming contest
Intoduction of programming contestIntoduction of programming contest
Intoduction of programming contest
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
 
Tutorial of eclipse
Tutorial of eclipseTutorial of eclipse
Tutorial of eclipse
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
2. java introduction
2. java introduction2. java introduction
2. java introduction
 

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