UpYun體驗之Java SDK

申明:本文只但願作技術探討,無其它意思。

目前個人工做主要使用的仍是Java。因此,我決定使用UpYun官方提供的Java版的SDK體驗下UpYun。java

原SDK存在問題

當使用IDE打開源碼來看時,我發現這個SDK,有不少問題:git

  1. 沒有構建,因此很難自動化測試github

  2. 全部的方法,功能都寫在一個com.UpYun類裏,雖然這些類只有1000多行,但當你看到文件加密,判斷文本是否爲空,上傳文件等不一樣職責的東西混在一塊兒,你的感受如何?編程

  3. 測試文件和src源碼包是在同一級目錄裏併發

    ├── README.md
     ├── sample.jpeg
     ├── src
     │   ├── com
     │   │   └── UpYun.java
     │   └── demo
     │       ├── FileBucketDemo.java
     │       └── PicBucketDemo.java
     └── test.txt
  4. 使用這個SDK時,你仍是必須去官方去查API,由於SDK中的一些方法接受的參數是Map。如下是原來上傳圖片及作縮略圖的代碼demo:maven

    // 設置縮略圖的參數
     		Map<String, String> params = new HashMap<String, String>();
    
     		// 設置縮略圖類型,必須搭配縮略圖參數值(KEY_VALUE)使用,不然無效
     		params.put(PARAMS.KEY_X_GMKERL_TYPE.getValue(),
     		        PARAMS.VALUE_FIX_BOTH.getValue());
    
     		// 設置縮略圖參數值,必須搭配縮略圖類型(KEY_TYPE)使用,不然無效
     		params.put(PARAMS.KEY_X_GMKERL_VALUE.getValue(), "150x150");
    
     		// 設置縮略圖的質量,默認 95
     		params.put(PARAMS.KEY_X_GMKERL_QUALITY.getValue(), "95");
    
     		// 設置縮略圖的銳化,默認銳化(true)
     		params.put(PARAMS.KEY_X_GMKERL_UNSHARP.getValue(), "true");
    
     		// 若在 upyun 後臺配置過縮略圖版本號,則能夠設置縮略圖的版本名稱
     		// 注意:只有存在縮略圖版本名稱,纔會按照配置參數製做縮略圖,不然無效
     		params.put(PARAMS.KEY_X_GMKERL_THUMBNAIL.getValue(), "small");
    
     		// 上傳文件,並自動建立父級目錄(最多10級)
     		boolean result = upyun.writeFile(filePath, file, true, params);

    單看這句: params.put(PARAMS.KEY_X_GMKERL_VALUE.getValue(), "150x150");,你不去官網去查,鬼知道"150x150"是什麼意思。並且,很容易寫錯不是嗎?學習

  5. 沒有異常處理,當發生錯誤時,好比響應返回403時,原做者只返回一個boolean來表現成功與否,而沒有使用者到底錯在哪。測試

  6. API的設計很差。如上傳文件的API爲writeFile,使用uploadFile彷佛更好一些。並且幾個方法參數中使用了boolean類型,你知道upyun.uploadFile(filePath, file4, true);中的true表明什麼嗎?ui

我剛開始試圖在原來的代碼的基礎上重構,可是重構到後面,我發現,我沒法重構下去。只能選擇重寫。加密

說說個人重構過程

剛開始時,我選擇在原有的基礎上重構,方法:

  1. 使用maven構建
  2. while(100%滿意) 一小步重構,一測試

看過《重構》的都就必定理解,我爲何要這麼作了。小步是由於若是重構錯了,能夠很輕鬆的返回,測試是爲了保證你的重構是正確的。

可是,重構到後面,我仍是決定重寫了。我不保證個人寫法是最好的。只求共同窗習,有哪裏很差的,多謝指出。

如下是我實現的上傳圖片並作縮略圖的代碼示例:

PictureItem pictureItem = upYunClient.recursionMkDir()
            .picThumbnail(ThumbnailType.VALUE_FIX_BOTH, 150, 150)
            .picThumbnailQuality(95)
            .picThumbnailSharpen()
            .picThumbnailName("small").uploadPicture(filePath, file);


    assert pictureItem.getHeight() == 150;
    assert pictureItem.getWidth() == 150;

使用鏈式編程,舒服一些;把一些代碼使用者不須要關心的東西封裝起來。

最終項目結構:

├── pom.xml
		├── README.md
		├── src
		│   ├── main
		│   │   └── java
		│   │       └── com
		│   │           └── upyun
		│   │               ├── Crypto.java
		│   │               ├── FileItem.java
		│   │               ├── _.java
		│   │               ├── PictureItem.java
		│   │               ├── PictureRotateAngle.java
		│   │               ├── ThumbnailType.java
		│   │               ├── UpYunAuthenticateException.java
		│   │               ├── UpYunBaseException.java
		│   │               ├── UpYunClient.java
		│   │               ├── UpYunIOException.java
		│   │               ├── UpYunNotFoundException.java
		│   │               └── UpYunServerErrorException.java
		│   └── test
		│       ├── java
		│       │   └── demo
		│       │       ├── FileBucketDemo.java
		│       │       ├── FileBucketTest.java
		│       │       ├── PicBucketDemo.java
		│       │       ├── PicBucketTest.java
		│       │       └── UpYunClientBuilderTest.java
		│       └── resources
		│           ├── sample.jpeg
		│           └── test.txt

事實上,在這裏,我尚未考慮併發的狀況,由於目前,我在這方面還不是很擅長。但願有朋友指出問題。

PS:代碼已經new pull request。github:https://github.com/zacker330/upyun-java-sdk

相關文章
相關標籤/搜索