Brian的雜記
  • Introduction
  • Brian's 雜記
    • My Awesome API
    • FB 大頭貼
    • 硬體雜記
    • PHP
    • project
      • 模擬器
      • WAMP
    • WinMerge
    • 雜記
      • LINQ
      • 方法
      • Grid View
      • namespace
      • global
      • 物件導向
      • Excel
      • VS2017
      • single sign on
      • Master
      • Https
      • 憑證
      • 略過憑證不符
      • NLog
      • 團隊開發
      • .NET Core
      • 共用網路上的芳鄰
      • 爬蟲
      • NPOI
      • RSS
      • 多執行緒
      • 記憶體回收
      • 密碼學
        • BCrypt
        • AES
      • 主機環境建置
      • Session
      • Error
      • IIS 相關
      • 無障礙相關
      • 介面
        • 影像地圖
      • telnet
        • smtp
      • nslookup
      • 協助客戶解決問題
      • 驗證欄位
      • 網站管理
      • 工具整理
    • 正規表示法
    • 影像處理
    • IntelliJ Idea
    • 觀念
      • Clean Code
        • 命名
        • 函式
        • 註解
        • 編排
        • 物件及資料結構
        • 錯誤處理
        • 邊界
        • 單元測試
        • 類別
      • Java 程式風格
      • Design Pattern
        • 單例模式
      • 同步
      • 畫圖
        • ER-Model
        • 類別圖
        • Use Case
        • 有限狀態機
      • 資料 API 文件 分析
      • CORS & SSL
      • 利用DISC幫助溝通
      • OAS
    • 檔案上傳
      • FileStore
      • App Engine
      • Google Storage
    • OAuth vs Open ID
    • MIME
    • 虛擬桌面
    • 待看資料
    • Selenium
    • CDN
    • HTTP
    • 編碼
    • 2nd-ML100Days
      • jupyter
    • 微服務
      • 設計
        • 1 ~ 5
        • 6
        • 7
        • 8
        • 9
    • Gradle
    • Maven
    • Error
    • 批次檔 BAT
    • Kurento
    • WebSocket & WebRTC
  • 需求面能力
    • User Story
  • Google Cloud Platform
    • Compute Engine
  • Python
    • 基本語法
    • Pandas
    • 套件
    • Matplotlib
    • Encoder
    • jupyter
  • Java
    • Java
      • File
      • Exception
      • 物件導向觀念
      • 加密
      • HTTP
      • 集合
      • Stream()
      • Web
      • ResultSet
      • JDK6
      • JDK8
    • 讀取、複寫MP3 Tag
    • Log4j2
    • Servlet
      • 容器
    • JSP
    • JBOSS
    • JWT
    • PreparedStatement
    • Error
    • Spring
      • Spring Boot
        • @Value
        • Build
      • RequestParameter
      • Error
      • Autowired
      • JPA
      • FeignClient
      • WebSocket
      • thymeleaf
      • Security
      • Test
      • Scheduled
      • Redirect
    • IntelliJ
  • Linux
    • Linux
    • Shell Script
    • Cygwin(在Windows執行Linux指令)
  • 前端
    • HTML
      • Link
    • CSS
      • Position
      • padding color
      • display
    • JS
      • jQuery
        • Select2
      • fancybox
      • ES6
      • 效能
      • GoogleMap API
        • Marker
        • InfoWindow
      • 事件
      • CKEditor
      • TGOS
      • JSON
      • QRcode
      • 核心概念
        • 物件 變數 型別
          • number
          • String
          • boolean
          • null & undefined
          • Symbol
        • JS 物件概念
        • 深入理解JS 函式物件
        • 更多ES2015/ES6 全新語言特性
      • Promise
    • 效果應用
  • 資料庫
    • 注意事項
    • MariaDB
    • MySQL
      • inner join 和 join
      • 字串比對
      • 倒數資料
    • SQL
      • DDL 資料定義語言
      • DML 資料操縱語言
      • DCL 資料控制語言
      • TCL 交易控制語言
      • T-SQL
      • CTE
      • JOIN
    • Oracle
    • MSSQL 操作
      • 新增使用者
      • SQL 指令
      • Sequence
    • 差異比較
    • MyBatis
    • Workbench 操作
    • SQL Injection
  • 版本控制
    • Gitlab
      • sign up
      • sign in
      • add project
      • add members
    • SourceGit
      • install
    • SmartGit
      • install
      • operate
      • git 操作雜記
    • TortoiseGit
    • Git
    • TFS
    • SVN
  • Test
    • 軟體測試原則
    • 演算法
    • XMind
      • install
    • Jenkins
      • 建置
    • HTTPie
    • Postman
    • 測試驅動開發
    • 撰寫測試的觀念
    • 測試框架
    • IoC & DI
    • 隔絕相依性的方式
    • JUnit
    • NUnit
    • 習慣
    • 虛設常式
  • Angular
    • hello world
    • ng-options
    • ES6
    • Build & Conponect
    • HttpClient
    • 部署
  • ASP.NET Web Form
    • Chapter 2
      • 2-1
        • 小東西
    • 略過請求驗證
  • Go
Powered by GitBook
On this page
  • 使用第三方軟體的程式碼
  • 在使用這樣的介面時,建議放在類別裡,或是放在附近的類別家族裡。避免在公用API裡回傳介面,或將介面當參數傳遞給API。
  • 探索及學習邊界
  • 學習式測試
  • 建置測試案例
  • 學習式測試比不花功夫好
  • 使用尚未存在的程式
  • 簡潔的程式邊界

Was this helpful?

  1. Brian's 雜記
  2. 觀念
  3. Clean Code

邊界

使用第三方軟體的程式碼

在 介面的提供者 & 介面的使用者 之間,存在一股張力。 第三方套件、框架努力讓自己本身更泛用,更能夠建立在不同環境中,吸引更多的使用者。 而另一方面,使用者希望介面專注於需求上。 這種張力會導致問題。

以java.util.Map 為例,它是個有豐富功能的介面,並且可以存放任何型態的內容,但有時我們只想使用部分功能或存放特定的型態。

關於型態的部分,可以利用泛型(generics)去處理。

關於功能的限制,可以另外將Map 封裝起來,只將想提供的功能介面給放出來。

在使用這樣的介面時,建議放在類別裡,或是放在附近的類別家族裡。避免在公用API裡回傳介面,或將介面當參數傳遞給API。

探索及學習邊界

為了使用第三方軟體,我們可能會花很多時間在閱讀文件上,然後才決定要如何使用。 接著我們在原來的程式中,使用第三方的軟體,看是否如預期執行。

但如果換一種方式呢?

學習式測試

雖然測試第三方軟體並不是我們的工作,但為了確認API的功能,和增加對其的了解,撰寫這樣的測試是有幫助的。 利用這樣的測試,去探索、了解第三方軟體,就叫做學習式測試(learning tests)。

在學習式測試裡,我們比照在應用程式裡呼叫的用法,來呼叫第三方的軟體API。 我們實質上是在做控制實驗,以檢驗我們對這個API的了解程度。 測試的重點在於,我們想要利用API獲得怎樣的結果。

建置測試案例

學習式測試比不花功夫好

學習式測試並不花什麼功夫。因為不管怎樣,都必須學會這個API,而寫測試來了解,是一種簡單又沒有壞處的方式。 學習式測試是一種很精準的試驗,可以幫助我們對API的瞭解。

學習式測試不僅沒花什麼功夫,還是個正向投資,當第三方套件有版本更新的時候,可以執行這些學習式測試,來觀察這些套件有沒有行為上的改變。

學習式測試可以幫助我們驗證第三分軟體是否按照預期執行。一旦整合進來,沒有人可以擔保該軟體會一直相容於我們的需求。倘若第三方套件的修改,無法通過我們的測試,我們就能馬上發現出問題了。

不管是否使用學習式測試,還是需要有一套「與生產程式碼採用相同方式的邊界測試」來支援整潔的介面。 如果沒有這些邊界測試,來減輕升級整合帶來的負擔,那會使停留在舊版本的時間,本應該停留的時間還長。

使用尚未存在的程式

還有一種邊界,一種將已知和未知分開的邊界。

例如:要使用還沒開發出來的子系統。

這種狀況,我們就只觀察到已知的邊界就好。

但在工作上,我們可以想像、希望那個邊界的介面長什麼樣子。 為了避免我們因為其他未完成的部分而受困,我們可以定義自己的介面,規劃出我們的主要功能,並規劃出一個拿來介接的接縫(seam)。 採用這樣的設計,也對測試很方便,它可以用一個假的物件,就可以測試我們的東西。當我們獲得完成的介面時,也可以產生邊界測試,確保我們有正常使用。

簡潔的程式邊界

有趣的事情會發生在邊界上,改變 就是其中一項。 好的軟體設計可以適應這些改變,而不需要大規模的投入或重新撰寫。 當使用我們無法控制的程式碼時,要特別花功夫去保護已經投入的心力,確保不用花太多功夫,就能因應未來的改變。

在邊界的程式碼必須分割清楚,並定義預期的測試。最好是依靠在自己可以控制的程式上,去利用第三方套件,將其封裝起來。

Previous錯誤處理Next單元測試

Last updated 4 years ago

Was this helpful?

關於測試的部分,請去看 Test > JUnit 的部分,那邊有教學如何建置測試案例。

https://wujincheng.gitbooks.io/brian/content/junit.html