SlideShare a Scribd company logo
1 of 78
Teddy Chen
teddy@teddysoft.tw
http://teddy-chen-tw.blogspot.tw/
March 10 2016
Teddy Chen
teddy@teddysoft.tw
http://teddy-chen-tw.blogspot.tw/
March 10 2016
Rename
Copyright@2012-2016 Teddysoft
撒嬌
蓋布袋 舔手
玩襪子
2015年1月領養Eiffel
每天看到好多
需要幫助的貓
謝謝鈦坦科技的 Kevin
Kevin
無等待贊助
節育之貓
由
由泰迪軟體代捐
謝謝各位哥哥、姐姐,
讓更多貓咪獲得幸福
Copyright@2012-2016 Teddysoft
http://goo.gl/6uqzes
B
A
• Refactoring (Noun )
– A change made to the internal structure of
software to make it easier to understand and
cheaper to modify without changing its observable
behavior. (對軟體內部結構的一種改變,目的在不改動軟體可察覺行
為的前提之下,提高其可理解性並降低修改成本。)
• Refactor (Verb)
– To restructure software by applying a series of
refactoring without changing its observable
behavior. (在不改變軟體可察覺行為的前提之下使用一系列重構方法
調整軟體結構 。)
Copyright@2012-2016 Teddysoft Source:《Refactoring》
在不改變程式外在行為的前提之下,
改變程式內部結構以提升設計品質
Copyright@2012-2016 Teddysoft
Before refactoring After refactoring
All programming is maintenance
programming, Dave Thomas
Copyright@2012-2016 Teddysoft
http://www.artima.com/intv/dry.html
菩
提
本
無
樹
明
鏡
亦
非
台
本
來
無
一
物
何
處
惹
塵
埃
神界
Code
是
菩
提
樹
CI
如
明
鏡
台
時
時
跑
測
試
勿
使
客
戶
哀
人界
Copyright@2012-2016 Teddysoft Source http://goo.gl/roc09w
Copyright@2012-2016 Teddysoft
3
2
4
在不改變程式外在行為的前提之下,
改變程式內部結構以提升設計品質
1
5
如何確認? 如何定義?
怎麼改? 哪些結構可以改? 品質的提升目標為何?
6 為什麼要以不改變程
式外在行為當作前提?
Copyright@2012-2016 Teddysoft
3
2
4
在不改變程式外在行為的前提之下,
改變程式內部結構以提升設計品質
1
5
如何確認? 如何定義?
怎麼改? 哪些結構可以改? 品質的提升目標為何?
6 為什麼要以不改變程
式外在行為當作前提?
if 1 == 1 then S1 else S2
Copyright@2012-2016 Teddysoft
開什麼玩笑!
太難
Ref. : https://goo.gl/sBYyAg
1
• Denotational semantics
• Operational semantics
• Axiomatic semantics
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
Replace semantics proven
with scenario-based tests
聊天話題1:
用測試定義行為有何優缺點?有無替代方案?
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
Package
Class
Method
Block
Statement
Variable
作用在不同結構上的重構,
產生不同層次的設計改善
Common program
constructs to be
coded & refactored
• Rename
• Introduce Assertion
• Extract Method
• Move Method
• Extract Class
• Form Template Method
• Separate Domain from Presentation
2
Copyright@2012-2016 Teddysoft
程式結構有大有小,
重構亦然
A change made to the internal structure
of software to make it easier to
understand and cheaper to modify
without changing its observable behavior.
較易理解,較低修改成本
Copyright@2012-2016 Teddysoft
3
Copyright@2012-2016 Teddysoft
只有「easier to understand and
cheaper to modify」這兩個目標,
會不會太小、太一般化了?
Understandability
Modifiability
Low Coupling
High Cohesion
OO Concept
OO Principle
Design Pattern
Architecture
 Abstraction
 Information hiding
 Polymorphism
 Responsibility
assignment
 Indirection
 Separation of concerns
 Program to an interface,
not an implementation
 Favor object composition
over class inheritance
 Single-responsibility
 Open-closed
 Liskov substitution
 Interface-segregation
 Dependency-inversion
 Don't repeat yourself,
Single choice, One and
only once
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
重構有大有小,
重構目標亦然
民意調查:
重構是一種模式(Pattern)嗎?
Copyright@2012-2016 Teddysoft
• 設計模式
– Singleton, Command, Proxy, Adapter, Model-
View-Controller, etc.
• 重構
– Rename, Introduce Assertion, Extract
Method, Move Method, Extract Class, Form
Template Method, Separate Domain from
Presentation, etc.
Copyright@2012-2016 Teddysoft
• 名詞片語 (Noun-phrase)
– 描述模式所建立或產生的結果
– 例子:Singleton, Command, Model-View-
Controller
• 動詞片語 (Verb-phrase)
– 給定一個指令,描述如何達到模式解決方案所要
求的狀態
– 例子:Don’t Talk to Strangers, Separate
Material Preparation from Integration
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft Source:《The Timeless Way of Building》
http://goo.gl/tS13cE
聊天話題2:
如果重構是一種模式,為什麼重構用動詞而
不像大部份設計模式採用名詞?
Copyright@2012-2016 Teddysoft
• Make you instant expert
• Eliminate the need for intelligence and
taste
• Eliminate the need to think
• Tell you how exactly how to adapt the
solution to your context
Copyright@2012-2016 Teddysoft
Source: Asian PLoP 2016 by Joseph
Yoder and Rebecca Wirfs-Brock
Copyright@2012-2016 Teddysoft
重構 相反重構
Extract Method Inline Method
Add Parameter Remove Parameter
Collapse Hierarchy Extract Superclass, Extract Subclass
Extract Class Inline Class
Hide Delegate Remove Middle Man
Pull Up Field Push Down Field
Replace Inheritance with Delegation Replace Delegation with Inheritance
Copyright@2012-2016 Teddysoft Source: 電影《星際大戰第四集》
Use the Smell, Luke
Copyright@2012-2016 Teddysoft
重構是一種模式,套
用模式要觀察Force
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
Top-down
Bottom-up
• OOAD (傳統模式)
– Code-First
– Top-down
• TDD (原始模式)
– Test-First
– Bottom-up
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
Domain Model
Design Model
Implementation
Model
Refactoring
After
ImplementationUse Case
Model
Copyright@2012-2016 Teddysoft
Design Model
Implementation
Model
After
Implementation
Refactoring
Test & Code
OOAD
TDD
Domain Model
Use Case
Model
Most design
happens here
Refactoring
https://goo.gl/8AZQUQ
Copyright@2012-2016 Teddysoft
https://goo.gl/8AZQUQ
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft Source:《Test-Driven Development》
聊天話題3:
哪些原因可能造成學了TDD之後測試能力變
好但卻在落實TDD上遭遇困難?
Copyright@2012-2016 Teddysoft
Design Model
Copyright@2012-2016 Teddysoft
Implementation
Model
After
Implementation
Refactoring
Test & Code
OOAD
BDD + TDD
Test cases as
specification
Domain Model
Use Case
Model
Most design
happens here
Refactoring
Design Model
Copyright@2012-2016 Teddysoft
Implementation
Model
After
Implementation
Refactoring
Test & Code
OOAD
TDD
Test cases as
specification
Domain Model
Use Case
Model
Domain Model
Could DDD help?
Most design
happens here
Refactoring
聊天話題4:
DDD+BDD+TDD之後,傳統bottom-up
形式的test-first開發,還算是bottom-up
嗎?
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
Source:《禪的世界01--冥想》
Copyright@2012-2016 Teddysoft Source:《禪的世界01--冥想》
Copyright@2012-2016 Teddysoft Source:《The Timeless Way of Building》
Copyright@2012-2016 Teddysoft
部分的加總不等於
全部,體驗整體的
感覺有其必要性
• 軟體開發是一種團隊活動,只有自己會,隊
友不會,這樣的團隊無法長久。
• 自己會相對簡單,讓別人也會,很難。
• 多了解全局,比較有機會與有能力,讓原本
不懂且覺得某個東西很難的人,在你的協助
之下學會並且作出改變。
Copyright@2012-2016 Teddysoft
培養定位「新觀念」,以及建立它和既有知識
之間關係的能力,可以讓你綜觀全局。
Copyright@2012-2016 Teddysoft
Copyright@2012-2016 Teddysoft
Kent Beck叔叔認為:「厲害的
人不是自己很強不管別人死活,
而是能幫助別人,使別人原本
認為很難的事情,在他的幫助
之下變得很簡單。」
• 程式結構有大有小,重構亦然。
• 重構有大有小,重構目標亦然。
• 重構是一種模式,套用模式要觀察Force。
• 部分的加總不等於全部,先體驗整體的感覺
有其必要性。
• 培養一種能力:「在你的幫助之下讓別人原
本覺得很難事變得簡單。」
Copyright@2012-2016 Teddysoft
• 搞笑談軟工部落格
– http://teddy-chen-tw.blogspot.com
• 搞笑談軟工Facebook
– https://www.facebook.com/groups/teddy.tw
• 泰迪軟體官方網站
– http://teddysoft.tw
Copyright@2012-2016 Teddysoft

More Related Content

What's hot

みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)
Noriyuki Mizuno
 
今日から使おうSmalltalk
今日から使おうSmalltalk今日から使おうSmalltalk
今日から使おうSmalltalk
Sho Yoshida
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdb
Naotoshi Seo
 
005 өгөгдлийн нөөцийн удирдлага
005 өгөгдлийн нөөцийн удирдлага005 өгөгдлийн нөөцийн удирдлага
005 өгөгдлийн нөөцийн удирдлага
Bobby Wang
 

What's hot (20)

DigdagはなぜYAMLなのか?
DigdagはなぜYAMLなのか?DigdagはなぜYAMLなのか?
DigdagはなぜYAMLなのか?
 
Windows Server 2019 で Container を使ってみる
Windows Server 2019 で Container を使ってみるWindows Server 2019 で Container を使ってみる
Windows Server 2019 で Container を使ってみる
 
実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方実践!DBベンチマークツールの使い方
実践!DBベンチマークツールの使い方
 
早わかりSmalltalk
早わかりSmalltalk早わかりSmalltalk
早わかりSmalltalk
 
みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)みんなに役立つ「テスト」を学んでみよう!(20140105版)
みんなに役立つ「テスト」を学んでみよう!(20140105版)
 
Tableau Japan セミナー用資料
Tableau Japan セミナー用資料Tableau Japan セミナー用資料
Tableau Japan セミナー用資料
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
事例から探る、Redmineの機能とよりよい運用
事例から探る、Redmineの機能とよりよい運用事例から探る、Redmineの機能とよりよい運用
事例から探る、Redmineの機能とよりよい運用
 
伝わるチラシの作りかた講座:2日目「レイアウト・デザインのコツ」
伝わるチラシの作りかた講座:2日目「レイアウト・デザインのコツ」伝わるチラシの作りかた講座:2日目「レイアウト・デザインのコツ」
伝わるチラシの作りかた講座:2日目「レイアウト・デザインのコツ」
 
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころ
 
今日から使おうSmalltalk
今日から使おうSmalltalk今日から使おうSmalltalk
今日から使おうSmalltalk
 
JavaScript 研修
JavaScript 研修JavaScript 研修
JavaScript 研修
 
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
【15-E-7】セキュアな環境でDevOpsを実現する厳選ツール
 
InfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdbInfluxDB の概要 - sonots #tokyoinfluxdb
InfluxDB の概要 - sonots #tokyoinfluxdb
 
「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」
「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」
「Redmineの運用パターン集~私に聞くな、チケットシステムに聞け」
 
005 өгөгдлийн нөөцийн удирдлага
005 өгөгдлийн нөөцийн удирдлага005 өгөгдлийн нөөцийн удирдлага
005 өгөгдлийн нөөцийн удирдлага
 
Lec02 structures (2)
Lec02 structures (2)Lec02 structures (2)
Lec02 structures (2)
 
H2O Waveを使ったAIアプリケーション作成入門
H2O Waveを使ったAIアプリケーション作成入門H2O Waveを使ったAIアプリケーション作成入門
H2O Waveを使ったAIアプリケーション作成入門
 
OSI Model
OSI ModelOSI Model
OSI Model
 

Similar to 重構三兩事

Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)
Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)
Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)
LetAgileFly
 
[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談
[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談
[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談
Drupal Taiwan
 
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Chui-Wen Chiu
 
Agile changes in liba
Agile changes in libaAgile changes in liba
Agile changes in liba
topgeek
 

Similar to 重構三兩事 (20)

漫談重構
漫談重構漫談重構
漫談重構
 
DevOps program 導入經驗談
DevOps program 導入經驗談DevOps program 導入經驗談
DevOps program 導入經驗談
 
Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)
Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)
Scrum gathering 2012 shanghai 产品管理及用户体验 分会场:敏捷的hard模式 产品经理视角(窦涵之)
 
軟體開發成功的秘訣
軟體開發成功的秘訣軟體開發成功的秘訣
軟體開發成功的秘訣
 
twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧twMVC#42 讓我們用一種方式來開發吧
twMVC#42 讓我們用一種方式來開發吧
 
從研發團隊管理及產品發展的角度看 DevOps
從研發團隊管理及產品發展的角度看 DevOps從研發團隊管理及產品發展的角度看 DevOps
從研發團隊管理及產品發展的角度看 DevOps
 
42qu thrift1
42qu thrift142qu thrift1
42qu thrift1
 
Effective DevOps:一場文化與技術的轉型運動 (陳正瑋)
Effective DevOps:一場文化與技術的轉型運動  (陳正瑋)Effective DevOps:一場文化與技術的轉型運動  (陳正瑋)
Effective DevOps:一場文化與技術的轉型運動 (陳正瑋)
 
Effective DevOps (Agile Tour HsinChu 2017)
Effective DevOps (Agile Tour HsinChu 2017)Effective DevOps (Agile Tour HsinChu 2017)
Effective DevOps (Agile Tour HsinChu 2017)
 
專案分層架構 twMVC#18
專案分層架構 twMVC#18專案分層架構 twMVC#18
專案分層架構 twMVC#18
 
twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構
 
[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談
[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談
[DCTPE2011] 11) Drupal 是好的生財工具嗎? 2. 中小型網站製作公司/工作室座談
 
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
 
啟動自組織團隊
啟動自組織團隊啟動自組織團隊
啟動自組織團隊
 
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
Drupal 是好的生財工具嗎?網站標案經驗分享 台灣i運動資訊平台(Drupal as a Cash Cow for Prodution House? ...
 
Agile changes in liba
Agile changes in libaAgile changes in liba
Agile changes in liba
 
「所知有雲」:維基百科雲端運算中文條目編輯行動發起說明
「所知有雲」:維基百科雲端運算中文條目編輯行動發起說明「所知有雲」:維基百科雲端運算中文條目編輯行動發起說明
「所知有雲」:維基百科雲端運算中文條目編輯行動發起說明
 
课件开发工具整体解决方案(知行堂)【zxt123.com】
课件开发工具整体解决方案(知行堂)【zxt123.com】课件开发工具整体解决方案(知行堂)【zxt123.com】
课件开发工具整体解决方案(知行堂)【zxt123.com】
 
twMVC#24 | 開發團隊的敏捷之路(未完成)
twMVC#24 | 開發團隊的敏捷之路(未完成)twMVC#24 | 開發團隊的敏捷之路(未完成)
twMVC#24 | 開發團隊的敏捷之路(未完成)
 
201206 myway 成长和经验分享
201206 myway 成长和经验分享201206 myway 成长和经验分享
201206 myway 成长和经验分享
 

More from teddysoft

從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神
teddysoft
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材
teddysoft
 

More from teddysoft (20)

Dci vs aggregate_dddtw_2021-0.3-16-9
Dci vs aggregate_dddtw_2021-0.3-16-9Dci vs aggregate_dddtw_2021-0.3-16-9
Dci vs aggregate_dddtw_2021-0.3-16-9
 
Dci vs aggregate_dddtw_2021-0.3-preview
Dci vs aggregate_dddtw_2021-0.3-previewDci vs aggregate_dddtw_2021-0.3-preview
Dci vs aggregate_dddtw_2021-0.3-preview
 
DDD + Clean Architecture: 從需求到實作
DDD + Clean Architecture: 從需求到實作DDD + Clean Architecture: 從需求到實作
DDD + Clean Architecture: 從需求到實作
 
Pattern based problem solving-published
Pattern based problem solving-publishedPattern based problem solving-published
Pattern based problem solving-published
 
Agile the timeless way of software development-2019-05-17-v1.2-published
Agile the timeless way of software development-2019-05-17-v1.2-publishedAgile the timeless way of software development-2019-05-17-v1.2-published
Agile the timeless way of software development-2019-05-17-v1.2-published
 
從Bowling Game Kata看敏捷開發
從Bowling Game Kata看敏捷開發從Bowling Game Kata看敏捷開發
從Bowling Game Kata看敏捷開發
 
當Scrum遇到Pattern
當Scrum遇到Pattern當Scrum遇到Pattern
當Scrum遇到Pattern
 
說出一嘴好設計 1.1
說出一嘴好設計 1.1說出一嘴好設計 1.1
說出一嘴好設計 1.1
 
跟著Teddy讀Pattern
跟著Teddy讀Pattern跟著Teddy讀Pattern
跟著Teddy讀Pattern
 
洗白你的軟體架構
洗白你的軟體架構洗白你的軟體架構
洗白你的軟體架構
 
如何學好設計模式
如何學好設計模式如何學好設計模式
如何學好設計模式
 
Bdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_publishedBdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_published
 
了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)
 
從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神
 
[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享
 
那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-published那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-published
 
好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14
 
[教材] 例外處理設計與重構實作班201309
[教材] 例外處理設計與重構實作班201309[教材] 例外處理設計與重構實作班201309
[教材] 例外處理設計與重構實作班201309
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材
 
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
 

重構三兩事