SlideShare una empresa de Scribd logo
1 de 112
Teddy Chen
Sept. 14 2013
例外處理設計與重構實作班
Copyright@2013 Teddysoft
我是誰
• 2012年7月成立泰迪軟體,從事敏捷開發顧問、教
育訓練、軟體工具導入等服務。
• 2012年6月,出版暢銷書「笑談軟體工程:敏捷方
法的逆襲」。
• 2012年4月起,多次講授Scrum課程,與學員互動氣
氛佳,滿意度高。
• 超過17年design pattern實務經驗,曾在pattern領域
最著名的PLoP國際研討會發表論文。
– PLoP 2004:A Pattern Language for Personal Authoring
in E-Learning.
– Asia PLoP 2011:Emerging Patterns of Continuous
Integration for Cross-Platform Software Development.
• 2009年取得Certified ScrumMaster。
• 2008年4月起迄今,5年以上Scrum業界導入經驗。
• 2008年取得台北科技大學資工博士。
• 2007年起經營「搞笑談軟工」部落格。
Copyright@2013 Teddysoft
課程內容
• 例外處理基本觀念
• 例外處理的4+1觀點
• 建立例外處理中心思想—Staged Robustness
Model
• EH Bad Smells and Refactoring's
Copyright@2013 Teddysoft
例外處理基本觀念
一個軟體開發專案存在著很多互相競爭
且衝突的非功能需求
Copyright@2013 Teddysoft
robustness
(exception handling)
time-to-market, iterative &
incremental design,
maintainability, etc.誰贏、誰輸?
Robustness輸了之後會造成系統不穩定
Copyright@2013 Teddysoft
系統不穩定會有什麼問題?
Copyright@2013 Teddysoft
輕則損失時間、金錢與商譽,
重則可能危害生命安全。
SPECIFICATION
Correctness
Robustness
提升軟體可靠度需同時考慮
Correctness與Robustness這兩個因素
• Correctness
– 軟體產品可以執行規格中所規範的工作或行為
– 可透過Contract Specification來達成
• Robustness
– 軟體系統應付異常狀況的能力
– 可透過Exception Handling來達成
Copyright@2013 Teddysoft
本課程介紹如何透過例外處理
來增加系統的強健度
練習:請分享一個因為例外
處理不良而造成金錢上、時
間上、精神上損失的經驗
例外處理機制—Exception
Handling Mechanism (EHM)
問題: 請說出一個你熟知的程
式語言的例外處理機制
例外處理機制(EHM)是程式語言用來
支援例外處理的方法
• Representation
• Definition
• Signaling
• Propagation
• Resolution
• Continuation
Copyright@2013 Teddysoft
1. Representation
• 程式語言表達例外的方法
– Symbol
• strings or numbers
– Data object
• Used to hold error and failure information only.
• Raised by a language keyword.
– Full object
• Encapsulate signaling, propagation, and continuation
behaviors of exceptions in the class definition.
Copyright@2013 Teddysoft
2. Definition
• 程式設計師如何定義一個例外
–Symbols
• new exceptions are defined as strings or
numbers.
–Data objects and full objects
• a class is used to define an exception.
Copyright@2013 Teddysoft
3. Signaling
• 產生一個例外(的實例),並且將例外傳給
接收者的指令稱之為:
– throwing, signaling, raising, or triggering
• 例外產生方式有兩種:
– Synchronous exception
• A direct result of performing the instruction.
– Asynchronous exception
• Produced by the runtime environment upon encountering
an internal error or by stopping or suspending a thread.
Copyright@2013 Teddysoft
4. Propagation
• If an exception is signaled and not coped
with locally, the exception can be propagated
to the caller of the signaling method.
• Exception propagation can be explicit or
implicit (or automatic).
– Explicit: a receiver must explicitly re-throw an
unhandled received exception for further propagation
– Implicit: an unhandled exception is automatically
propagated.
Copyright@2013 Teddysoft
5. Resolution
• Exception resolution or handler binding is a process
of finding a suitable handler in the target, which is
resolved by static scoping at compiler-time, dynamic
invocation chain at runtime, or both.
• There are two methods to dynamically find a handler:
stack unwinding and stack cutting.
– Stack unwinding pops the stack frames to search for the
matching exception handler
– Stack cutting maintains a list of registered exception handlers
and looks up the list for a suitable exception handler.
Copyright@2013 Teddysoft
6. Continuation
• An exception continuation or exception
model specifies the execution flow after
an exception handler returns its control.
–Termination model
–Retry model
–Resumption model
Copyright@2013 Teddysoft
容易搞混且重要的觀念:Fault, Error,
Failure, Exception彼此的關係
fault error failure
exception
(1) design
(2) component
cause of failure a state may lead to
failure
service departs from
specification
represented by
Copyright@2013 Teddysoft
以下何者是design fault,何者是component
fault?
1. 除以零 (division by zero)
2. Index Out of Bound
3. 網路斷線
4. 硬碟空間已滿
5. 檔案不存在
24
Copyright@2013 Teddysoft
為什麼要區分design fault與
component fault?
Exception Handling vs. Fault-Tolerant
Programming
• Exception handling deals with component faults
(anticipated exceptions)
• Fault-tolerant programming deals with both
component and design faults (anticipated and
unanticipated exceptions)
26
Copyright@2013 Teddysoft
範圍不同、成本不同!
Java例外處理機制
Java Exception Handling: The try
Statement (before JDK 7)
28Copyright@2013 Teddysoft
Java Exception Handling: The
try_multi_catch in JDK 7
29Copyright@2013 Teddysoft
Java Exception Handling: The
try_with_resources in JDK 7
30Copyright@2013 Teddysoft
Java Exception Class Hierarchy
31
checked
unchecked
IOException
NullPointerException
Throwable
Exception
RuntimeException
Error
IndexOutOfBoundsException
SQLException
Copyright@2013 Teddysoft
Use checked exceptions for
recoverable conditions and
run-time exceptions for
programming errors
使用Checked Exception須遵循Handle-or-Declare Rule
Copyright@2013 Teddysoft
handle
declare
程式如果違反Handle-or-
Declare Rule將被Java Compiler
視為語法錯誤
例外處理的4+1觀點
Usage (用途)
Design (設計)
Handling (處理)
Tool-Support (工具支援)
Process (流程)
為什麼例外處理這麼難?
Usage View (例外用途觀點)
Exception, 真的只是用來代表
「例外狀況」嗎?
練習:分組討論要如何處理
EOFException與
InterruptedException?
EOFException範例
public void readDataFromFile(String aFileName){
try (DataInputStream input = new DataInputStream
(new FileInputStream(aFileName))) {
while (true) {
System.out.print(input.readChar());
}
}
catch (EOFException e) {
// How to "handle" this exception?
}
catch (IOException e) {
e.printStackTrace();
}
} Copyright@2013 Teddysoft
InterruptedException範例
public void sleepMillisecond(int ms){
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
// How to "handle" this exception?
}
}
Copyright@2013 Teddysoft
Usage View
• Failure
• Notification
– EOFException
– InterruptedException
Copyright@2013 Teddysoft
案情沒有那麼單純,請看另一個
EOFException範例
Copyright@2013 Teddysoft
public void fetchRawBytesAndSetupMessage(DataInputStream aIS)
throws IOException, InvalidPacketException {
int length = aIS.readInt();
setMessageLength(length);
byte[] messageBody = new byte[length];
try {
aIS.readFully(messageBody);
} catch (EOFException e) {
throw new InvalidPacketException("Data Underflow");
}
setMessage(new String(messageBody));
}
Context 決定 exception的用途
Design View
(例外設計觀點)
Design View
• Declared:
– 例外有宣告在元件的介面規範中
– 又稱為anticipated或expected例外
– 代表component fault
• Undeclared:
– 例外沒有宣告在元件的介面規範中
– 又稱為unanticipated或unexpected例外
– 代表design fault
Copyright@2013 Teddysoft
Declared Exception
Copyright@2013 Teddysoft
public void fetchRawBytesAndSetupMessage(DataInputStream aIS)
throws IOException, InvalidPacketException {
int length = aIS.readInt();
setMessageLength(length);
byte[] messageBody = new byte[length];
try {
aIS.readFully(messageBody);
} catch (EOFException e) {
throw new InvalidPacketException("Data Underflow");
}
setMessage(new String(messageBody));
}
Undeclared Exception (1/2)
Copyright@2013 Teddysoft
public Hamburg createHamburger(String type) {
Hamburg ham = null;
switch (type) {
case "pork":
ham = new SweetPorkHamburger();
break;
case "beef":
ham = new SweetBeefHamburger();
break;
default:
throw new RuntimeException
("Unsupported hamburger type:" +
type);
}
return ham;
}
Undeclared Exception (2/2)
Copyright@2013 Teddysoft
public void deposit(int value) {
if (value < 0 ) {
throw new IllegalArgumentException
("存款金額不得為負數.");
}
// doing normal deposit logic
}
你在做例外處理還是容錯設計? (1/2)
Copyright@2013 Teddysoft
public void deposit(int value) throws
llegalArgumentException {
if (value < 0 ) {
throw new IllegalArgumentException
("存款金額不得為負數.");
}
// doing normal deposit logic
}
public void deposit(int value) {
if (value < 0 ) {
throw new IllegalArgumentException
("存款金額不得為負數.");
}
// doing normal deposit logic
}
D
UC
UCUD
你在做例外處理還是容錯設計? (2/2)
public String execute(String cmd) throws
IOException,
NullPointerException,
IllegalArgumentException;
Copyright@2013 Teddysoft
UCD
CD
Design View小結
撇開程式語言是否區分checked與
unchecked例外,唯有將例外宣告在介面
上(或以某種形式存在程式或文件中),
在設計階段程式設計師才有機會知道要
如何來因應可能會遭遇到的異常狀況。
Copyright@2013 Teddysoft
Handling View
(例外處理觀點)
Handling View
• Recoverability (可恢復性)
– recoverable, unrecoverable(irrecoverable)
• Exception handling constructs in
languages and utilities
– Roles, responsibilities, and collaborations (e.g., try,
catch, finally in Java)
Copyright@2013 Teddysoft
Handling View之
Recoverability
Recoverability:爽到你,艱苦到我
Copyright@2013 Teddysoft
Thanks Linda
Recoverability:Callee與Caller都要負責任
Copyright@2013 Teddysoft
Thanks Linda
public void sleepMillisecond(int ms){
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
// How to "handle" this exception?
}
}
Recoverability思考練習1
Copyright@2013 Teddysoft
Callee
Caller: InterruptedException是一
個可以被修復的例外狀況嗎?
public void readDataFromFile(String aFileName){
try (DataInputStream input = new DataInputStream
(new FileInputStream(aFileName))) {
while (true) {
System.out.print(input.readChar());
}
}
catch (EOFException e) {
// How to "handle" this exception?
}
catch (IOException e) {
e.printStackTrace();
}
}
Recoverability思考練習2
Copyright@2013 Teddysoft
Callee
Caller: EOFException與
IOException的recoverability?
public void fetchRawBytesAndSetupMessage(DataInputStream aIS)
throws IOException, InvalidPacketException {
int length = aIS.readInt();
setMessageLength(length);
byte[] messageBody = new byte[length];
try {
aIS.readFully(messageBody);
} catch (EOFException e) {
throw new InvalidPacketException("Data Underflow");
}
setMessage(new String(messageBody));
}
Recoverability思考練習3
Copyright@2013 Teddysoft
Callee
Caller: EOFException與
IOException的recoverability?
Handling View之
Exception Handling Constructs
and Utilities
不同的程式語言有不同的例外處理構件
• Java/C#
– try-catch-finally
• C++
– try-catch
– destructor
• Eiffel
– Exception handlers in Eiffel are attached at the method
level and all exceptions are caught by one handler.
61
Copyright@2013 Teddysoft
重新思考try-catch-finally的責任與分工
• Try
– Implement requirements (can have alternatives)
– Prepare state recovery (e.g., make a check point)
• Catch
– Perform error and fault handling
– Report exceptional conditions
– Control retry flow
• Finally
– Release resources
– Drop check points if any
62
Copyright@2013 Teddysoft
例外處理也是一種程式設計,需要程式
設計能力與軟體元件支援
• 設計技巧
– Memento、Smart pointer、Check point、etc.
– Exception hierarchy
– EH best practices and patterns
• 工具
– Logging (e.g., Log4j)
– Common error formats and dialogs
– EH smell detection
– Marker & resolution
63
Copyright@2013 Teddysoft
Handling View小結
要判斷一個例外是否為一個可修復的狀
況,是例外處理「設計」的第一個步驟,
但這個判斷依據並不是一件容易的事。
確定了例外的recoverability之後,接著
可利用程式語言構件與軟體元件的協助
來實作例外處理程式碼。
Copyright@2013 Teddysoft
Tool-Support View
(例外工具支援觀點)
Tool-Support View
• Java語言的tool-support
– 區分Checked與unchecked例外
Copyright@2013 Teddysoft
Java與C#程式比較
Copyright@2013 Teddysoft
Java語言的Tool-Support所造成的後遺症
• Interface evolution problem
• Ignored checked exception
68
Copyright@2013 Teddysoft
Tool-Support View小結
為了提高軟體的強健度,開發人員
需要一個提醒機制,告知那些操作
有可能產生例外,否則開發人員更
容易忽略例外處理,只能等runtime
發生錯誤時再回頭修補。
Copyright@2013 Teddysoft
Process View
(開發流程觀點)
Process View
• Waterfall VS. IID (iterative and
incremental development)
• 如何在IID流程中規劃例外處理?
– I will handle this exception when I have time. 
Never happens!
Copyright@2013 Teddysoft
以Scrum為例
• Story
– Normal scenarios
– Failure scenarios
• 這個sprint先做normal scenarios,下個
sprint再做failure scenarios
Copyright@2013 Teddysoft
敏捷開發讓例外處理變得好簡單啊! 才怪
「先做normal scenarios,再做failure
scenarios」實務上有何問題?
Copyright@2013 Teddysoft
做normal scenarios的時候遇到例外
怎麼辦?
Copyright@2013 Teddysoft
public void fetchRawBytesAndSetupMessage(DataInputStream aIS)
throws IOException, InvalidPacketException {
int length = aIS.readInt();
setMessageLength(length);
byte[] messageBody = new byte[length];
try {
aIS.readFully(messageBody);
} catch (EOFException e) {
throw new InvalidPacketException("Data Underflow");
}
setMessage(new String(messageBody));
}
Process View小結
IID或敏捷開發法不會讓例外處理變
得更簡單。若團隊沒有一套例外處
理設計規範,則很有可能反而會降
低系統的強健度。
Copyright@2013 Teddysoft
例外處理的4+1種觀點結論
例外處理…好難…Orz
建立例外處理中心思想—
Staged Robustness Model
例外處理的目標
例外處理的目標
Robustness Levels (強健度等級)
80
Undefined
Error-
Reporting
State-
Recovery
Behavior-
Recovery
0
1
2
3
Robustness
unpredictable
All exceptions are
reported
State is correct under the
presence of exceptions
Service is delivered under the
presence of exceptions
Copyright@2013 Teddysoft
Robustness levels of components
Element RL G0 RL G1 RL G2 RL G3
name undefined error-reporting state-recovery behavior-recovery
service
failing implicitly or
explicitly
failing explicitly failing explicitly delivered
state unknown or incorrect
unknown or
incorrect
correct correct
lifetime
terminated or
continued
terminated continued continued
how-
achieved
NA
(1) propagating all
unhandled
exceptions, and
(2) catching and
reporting them in
the main program
(1) error
recovery
and
(2) cleanup
(1) retry, and/or
(2) design
diversity, data
diversity, and
functional diversity
also known
as
NA failing-fast
weakly tolerant
and organized
panic
strongly tolerant,
self-repair, self-
healing, resilience,
and retry
Copyright@2013 Teddysoft
Upgrading and degrading
exception handling goals
82
fail-fast; keep
user informed
G0 G1 G2
restore state, clean up,
and keep programs alive
G3
attempt retries
all retries fail
state restoration
or cleanup fail
Copyright@2013 Teddysoft
Applicability for the robustness levels
83
RL Applicability
G1
 In the early stage of system development
 Prototyping
 Applying an evolutionary development methodology
 Time-to-market
G2
 Outsourcing
 Designing utility components used in different application domains
 Behavior-recovery actions should be administered by the user
G3
 Developing mission critical systems
 Designing components having sufficient application context to
recover from behavioral failures, e.g., application controllers
 Behavior-recovery actions are inappropriate to be administered by
the user
Copyright@2013 Teddysoft
強健度等級小結
Consequences
• Robustness without costly up-front design
• Guiding exception handling implementation
• Independent of languages
Copyright@2013 Teddysoft
Bad Smells and Refactorings
Refactoring基本觀念
Bad Smells and Refactorings
Refactoring基本觀念
What is Refactoring
• Improving the internal structure of a
software system without altering its
external behavior [fowler]
• Steps to perform refactoring:
– Identifying code smells
– Applying refactorings to remove the smells
– Verifying satisfaction
Copyright@2013 Teddysoft
Refactoring and EH Refactoring
89
Normal
Behavior
Exceptional
Behavior
Refactoring EH Refactoring
Behavior
Copyright@2013 Teddysoft
EH Smells, Refactorings, and RL
90
EH smell Refactoring RL
Return code Replace Error Code with Exception G1
Ignored checked
exception
Replace Ignored Checked Exception with
Unchecked Exception
G1
Unprotected main
program
Avoid Unexpected Termination with Big
Outer Try Block
G1
Dummy handler Replace Dummy Handler with Rethrow G1
Nested try block Replace Nested Try Block with Method G2
Careless Cleanup
Replace Careless Cleanup with Guaranteed
Cleanup
G2
Ignored checked
exception
Dummy handler
Introduce Checkpoint Class G2
Spare handler Introduce Resourceful Try Clause G3Copyright@2013 Teddysoft
Smell: Return Code
91
Copyright@2013 Teddysoft
public int withdraw(int amount) {
if (amount > this.balance)
return -1;
else {
this.balance = this.balance – amount;
return this.balance;
}
}
Refactoring: Replace Error Code with
Exception
92
Copyright@2013 Teddysoft
public int withdraw(int amount) throws
NotEnoughMoneyException {
if (amount > this.balance)
throw new NotEnoughMoneyException ();
this.balance = this.balance – amount;
}
Smell: Ignored Checked Exception
93
Copyright@2013 Teddysoft
public void writeFile(String fileName, String data) {
Writer writer = null;
try {
writer = new FileWriter(fileName);
// may throw IOException
writer.write(data); // may throw IOException
}
catch (IOException e) { // ignoring the exception }
finally { // code for cleanup }
}
Replace Ignored Checked Exception
with Unchecked Exception
public void writeFile(String fileName, String data) {
Writer writer = null;
try {
writer = new FileWriter(fileName); /* may throw an IOException */
writer.write(data); /* may throw an IOException */
}
catch (IOException e) {
/* ignoring the exception */
}
}
↓
public void writeFile(String fileName, String data) {
Writer writer = null;
try {
writer = new FileWriter(fileName); /* may throw an IOException */
writer.write(data); /* may throw an IOException */
}
catch (IOException e) {
throw new UnhandledException(e, “message”);
}
}
94
Copyright@2013 Teddysoft
Smell: Unprotected Main Program
95
Copyright@2013 Teddysoft
static public void main(String[] args) {
MyApp myapp = new MyApp();
myapp.start();
}
Avoid Unexpected Termination with
Big Outer Try Block
96
static public void main(String[] args) {
MyApp myapp = new MyApp();
myapp.start();
}
↓
static public void main(String[] args) {
try {
MyApp myapp = new MyApp();
myapp.start();
}
catch (Throwable e) {
/* displaying and/or logging the exception */
}
}
Copyright@2013 Teddysoft
Smell: Dummy Handler
97
Copyright@2013 Teddysoft
public void m(String aFileName) {
try{
FileInputStream fis = new FileInputStream(new
File(aFileName));
}
catch(IOException e){
e.printStackTrace();
}
finally{ // cleanup }
}
Replace Dummy Handler with Rethrow
98
Copyright@2013 Teddysoft
public void m(String aFileName)
{
try{
FileInputStream fis = new
FileInputStream(new
File(aFileName));
}
catch(IOException e){
e.printStackTrace();
}
finally{ // cleanup }
}
public void m(String aFileName) {
try{
FileInputStream fis = new
FileInputStream(new
File(aFileName));
}
catch(IOException e){
throw new UnhandledException
(e, “message”);
}
finally{ // cleanup }
}
Smell: Nested Try Statement
99
Copyright@2013 Teddysoft
FileInputStream in = null;
try {
in = new FileInputStream(…);
}
finally {
try {
if (in != null)
in.close ();
}
catch (IOException e) {
/* log the exception */
}
}
Replace Nested Try Statement with
Method
100
FileInputStream in = null;
try {
in = new FileInputStream(…);
}
finally {
try {
if (in != null)
in.close ();
}
catch (IOException e) {
/* log the exception */
}
}
Copyright@2013 Teddysoft
FileInputStream in = null;
try {
in = new FileInputStream(…);
} finally { closeIO (in); }
private void closeIO (Closeable c) {
try {
if (c != null) c.close ();
}
catch (IOException e) {
/* log the exception */
}
}
Smell: Careless Cleanup
101
Copyright@2013 Teddysoft
public void cleanup String aFileName) {
try{
FileInputStream fis = new
FileInputStream(new
File(aFileName));
fis.close();
}
catch(IOException e){
throw new RuntimeException(e);
}
}
Replace Careless Cleanup with Guaranteed
Cleanup
102
Copyright@2013 Teddysoft
public void cleanup String aFileName) {
try{
FileInputStream fis = new
FileInputStream(new
File(aFileName));
fis.close();
}
catch(IOException e){
throw new RuntimeException(e);
}
}
public void cleanup String aFileName) {
FileInputStream fis = null;
try{
fis = new FileInputStream(new
File(aFileName));
}
catch(IOException e){
throw new RuntimeException(e);
}
finally { closeIO(fis); }
}
練習:尋找 Smells
練習:EH Refactoring
Advanced Refactoring
Introduce Checkpoint Class
106
public void foo () throws FailureException {
try {
/* code that may change the state of the object */
}
catch (AnException e) {
throw new FailureException(e);
} finally {/* code for cleanup */}
}
↓
public void foo () throws FailureException {
Checkpoint cp = new Checkpoint (/* parameters */);
try {
cp. establish (); /* establish a checkpoint */
/* code that may change the state of the object */ }
catch (AnException e) {
cp.restore (); /* restore the checkpoint */
throw new FailureException(e); }
finally { cp.drop(); }
} Copyright@2013 Teddysoft
Smell: Spare handler
107
Copyright@2013 Teddysoft
try { /* primary */ }
catch (SomeException e) {
try {/* alternative */}
catch(AnotherException e) {
throw new FailureException(e);
}
}
Introduce Resourceful Try Clause
108
try { /* primary */ }
catch (SomeException e) {
try {/* alternative */}
catch(AnotherException e) {
throw new FailureException(e);
}
}
↓
int attempt = 0; int maxAttempt = 2; boolean retry = false;
do {
try { retry = false;
if (attempt == 0) { /* primary */ }
else { /* alternative */ }
} catch (SomeException e) {
attempt++; retry = true;
if (attempt > maxAttempt) throw new FailureException (e);
}
} while (attempt<= maxAttempt && retry)
Copyright@2013 Teddysoft
參考資料
Copyright@2013 Teddysoft
複習
• 例外處理基本觀念
– EHM、fault、error、failure、exception
• 例外處理的4+1觀點
• 建立例外處理中心思想—Staged Robustness
Model
• EH Bad Smells and Refactorings
泰迪軟體敏捷開發訓練藍圖
Copyright@2013 Teddysoft
謝謝,再見 XD

Más contenido relacionado

La actualidad más candente

磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!Ra Zon
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
Spring andspringboot training
Spring andspringboot trainingSpring andspringboot training
Spring andspringboot trainingMallikarjuna G D
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材teddysoft
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台Shengyou Fan
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringJustin Lin
 
The Online Tech of Titanfall
The Online Tech of TitanfallThe Online Tech of Titanfall
The Online Tech of Titanfallvtslothy
 
Lightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT WidgetsLightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT Widgetsmeysholdt
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform初探 Kotlin Multiplatform
初探 Kotlin MultiplatformShengyou Fan
 
Rustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミングRustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミングyoshrc
 
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門tamtam180
 
「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日
「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日
「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日Masashi Imano
 
拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)
拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)
拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)Fong Liou
 
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-84年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8Yusuke Mori
 
twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀Shengyou Fan
 

La actualidad más candente (20)

磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
Spring andspringboot training
Spring andspringboot trainingSpring andspringboot training
Spring andspringboot training
 
Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材Design Patterns這樣學就會了:入門班 Day1 教材
Design Patterns這樣學就會了:入門班 Day1 教材
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 Spring
 
The Online Tech of Titanfall
The Online Tech of TitanfallThe Online Tech of Titanfall
The Online Tech of Titanfall
 
Lightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT WidgetsLightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT Widgets
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform初探 Kotlin Multiplatform
初探 Kotlin Multiplatform
 
JUnit Presentation
JUnit PresentationJUnit Presentation
JUnit Presentation
 
Rustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミングRustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミング
 
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
Introduction httpClient on Java11 / Java11時代のHTTPアクセス再入門
 
「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日
「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日
「輸送方程式のソース項の実装 Ver-2.1の新機能Field sources」OpenFOAM勉強会 for beginner@関東,2012年04月21日
 
09. Java Methods
09. Java Methods09. Java Methods
09. Java Methods
 
Flutter
FlutterFlutter
Flutter
 
拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)
拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)
拒絕再寫無效規格,來學學實例化需求! (Agile Summit TW 2023)
 
Spring tools4
Spring tools4Spring tools4
Spring tools4
 
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-84年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
4年前にRustで新規プロダクトを?!枯れてない技術の採択にまつわるエトセトラ:developers summit 2023 10-d-8
 
twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
 

Destacado

重構三兩事
重構三兩事重構三兩事
重構三兩事teddysoft
 
模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式teddysoft
 
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題teddysoft
 
Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術teddysoft
 
好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14teddysoft
 
那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-published那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-publishedteddysoft
 
了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)teddysoft
 
從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神teddysoft
 
[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享teddysoft
 
軟體開發成功的秘訣
軟體開發成功的秘訣軟體開發成功的秘訣
軟體開發成功的秘訣teddysoft
 
Bdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_publishedBdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_publishedteddysoft
 
Behavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.AgileBehavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.AgileSam Huang
 
Seeing system patterns in organizational coaching
Seeing system patterns in organizational coachingSeeing system patterns in organizational coaching
Seeing system patterns in organizational coachingJen-Chieh Ko
 
Specification by Example
Specification by ExampleSpecification by Example
Specification by ExampleDeclan Whelan
 
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)Chen Cheng-Wei
 
C.C. Agile#30 – Coding Dojo – Prepared Kata
C.C. Agile#30 – Coding Dojo – Prepared KataC.C. Agile#30 – Coding Dojo – Prepared Kata
C.C. Agile#30 – Coding Dojo – Prepared KataCCAgile
 
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習台灣資料科學年會
 

Destacado (17)

重構三兩事
重構三兩事重構三兩事
重構三兩事
 
模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式模式入門第一堂課: 30分鐘寫出一個模式
模式入門第一堂課: 30分鐘寫出一個模式
 
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
搞懂Java例外處理的難題:Checked與Unchecked Exceptions不再是問題
 
Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術
 
好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14好設計如何好 @ C.C. Agile #14
好設計如何好 @ C.C. Agile #14
 
那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-published那一夜我們說Pattern design patterns 20周年-published
那一夜我們說Pattern design patterns 20周年-published
 
了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)了解模式讓你更敏捷 (C C Agile 活動分享)
了解模式讓你更敏捷 (C C Agile 活動分享)
 
從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神從五個小故事看敏捷開發精神
從五個小故事看敏捷開發精神
 
[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享[演講] Scrum導入經驗分享
[演講] Scrum導入經驗分享
 
軟體開發成功的秘訣
軟體開發成功的秘訣軟體開發成功的秘訣
軟體開發成功的秘訣
 
Bdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_publishedBdd atdd sbe_tdd_ddd_published
Bdd atdd sbe_tdd_ddd_published
 
Behavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.AgileBehavior Driven Development on C.C.Agile
Behavior Driven Development on C.C.Agile
 
Seeing system patterns in organizational coaching
Seeing system patterns in organizational coachingSeeing system patterns in organizational coaching
Seeing system patterns in organizational coaching
 
Specification by Example
Specification by ExampleSpecification by Example
Specification by Example
 
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
DevOps:建造開發維運的跨界之橋 (@ C.C. Agile #37)
 
C.C. Agile#30 – Coding Dojo – Prepared Kata
C.C. Agile#30 – Coding Dojo – Prepared KataC.C. Agile#30 – Coding Dojo – Prepared Kata
C.C. Agile#30 – Coding Dojo – Prepared Kata
 
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
[DSC 2016] 系列活動:李宏毅 / 一天搞懂深度學習
 

Similar a Exception Handling Design and Refactoring Workshop

201309 130917200320-phpapp01
201309 130917200320-phpapp01201309 130917200320-phpapp01
201309 130917200320-phpapp01Simon Lin
 
Mark asoi ppt
Mark asoi pptMark asoi ppt
Mark asoi pptmark-asoi
 
A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)Thierry Gayet
 
Essential Test-Driven Development
Essential Test-Driven DevelopmentEssential Test-Driven Development
Essential Test-Driven DevelopmentTechWell
 
Battle of The Mocking Frameworks
Battle of The Mocking FrameworksBattle of The Mocking Frameworks
Battle of The Mocking FrameworksDror Helper
 
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven PignataroJoomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven PignataroSteven Pignataro
 
ITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons LearnedITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons LearnedJoão Pedro Martins
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Codeeddiehaber
 
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...7mind
 
Tdd is not about testing (OOP)
Tdd is not about testing (OOP)Tdd is not about testing (OOP)
Tdd is not about testing (OOP)Gianluca Padovani
 
TDD and Simple Design Workshop - Session 1 - March 2019
TDD and Simple Design Workshop - Session 1 - March 2019TDD and Simple Design Workshop - Session 1 - March 2019
TDD and Simple Design Workshop - Session 1 - March 2019Paulo Clavijo
 
Martin Chapman: Research Overview, 2017
Martin Chapman: Research Overview, 2017Martin Chapman: Research Overview, 2017
Martin Chapman: Research Overview, 2017Martin Chapman
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - GreachHamletDRC
 
Testing Experience - Evolution of Test Automation Frameworks
Testing Experience - Evolution of Test Automation FrameworksTesting Experience - Evolution of Test Automation Frameworks
Testing Experience - Evolution of Test Automation FrameworksŁukasz Morawski
 
Lessons Learned in a Continuously Developing Service-Oriented Architecture
Lessons Learned in a Continuously Developing Service-Oriented ArchitectureLessons Learned in a Continuously Developing Service-Oriented Architecture
Lessons Learned in a Continuously Developing Service-Oriented Architecturemdwheele
 
Getting started-php unit
Getting started-php unitGetting started-php unit
Getting started-php unitmfrost503
 
Server Side Template Injection by Mandeep Jadon
Server Side Template Injection by Mandeep JadonServer Side Template Injection by Mandeep Jadon
Server Side Template Injection by Mandeep JadonMandeep Jadon
 
PVS-Studio and static code analysis technique
PVS-Studio and static code analysis techniquePVS-Studio and static code analysis technique
PVS-Studio and static code analysis techniqueAndrey Karpov
 

Similar a Exception Handling Design and Refactoring Workshop (20)

201309 130917200320-phpapp01
201309 130917200320-phpapp01201309 130917200320-phpapp01
201309 130917200320-phpapp01
 
Mark asoi ppt
Mark asoi pptMark asoi ppt
Mark asoi ppt
 
A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)A la découverte des google/mock (aka gmock)
A la découverte des google/mock (aka gmock)
 
Essential Test-Driven Development
Essential Test-Driven DevelopmentEssential Test-Driven Development
Essential Test-Driven Development
 
Battle of The Mocking Frameworks
Battle of The Mocking FrameworksBattle of The Mocking Frameworks
Battle of The Mocking Frameworks
 
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven PignataroJoomla! Day Chicago 2011 Presentation - Steven Pignataro
Joomla! Day Chicago 2011 Presentation - Steven Pignataro
 
ITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons LearnedITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Code
 
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
distage: Purely Functional Staged Dependency Injection; bonus: Faking Kind Po...
 
Tdd is not about testing (OOP)
Tdd is not about testing (OOP)Tdd is not about testing (OOP)
Tdd is not about testing (OOP)
 
TDD and Simple Design Workshop - Session 1 - March 2019
TDD and Simple Design Workshop - Session 1 - March 2019TDD and Simple Design Workshop - Session 1 - March 2019
TDD and Simple Design Workshop - Session 1 - March 2019
 
Martin Chapman: Research Overview, 2017
Martin Chapman: Research Overview, 2017Martin Chapman: Research Overview, 2017
Martin Chapman: Research Overview, 2017
 
Clean Code 2
Clean Code 2Clean Code 2
Clean Code 2
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
 
Testing Experience - Evolution of Test Automation Frameworks
Testing Experience - Evolution of Test Automation FrameworksTesting Experience - Evolution of Test Automation Frameworks
Testing Experience - Evolution of Test Automation Frameworks
 
Lessons Learned in a Continuously Developing Service-Oriented Architecture
Lessons Learned in a Continuously Developing Service-Oriented ArchitectureLessons Learned in a Continuously Developing Service-Oriented Architecture
Lessons Learned in a Continuously Developing Service-Oriented Architecture
 
Switch case looping
Switch case loopingSwitch case looping
Switch case looping
 
Getting started-php unit
Getting started-php unitGetting started-php unit
Getting started-php unit
 
Server Side Template Injection by Mandeep Jadon
Server Side Template Injection by Mandeep JadonServer Side Template Injection by Mandeep Jadon
Server Side Template Injection by Mandeep Jadon
 
PVS-Studio and static code analysis technique
PVS-Studio and static code analysis techniquePVS-Studio and static code analysis technique
PVS-Studio and static code analysis technique
 

Más de teddysoft

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-9teddysoft
 
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-previewteddysoft
 
漫談重構
漫談重構漫談重構
漫談重構teddysoft
 
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-publishedteddysoft
 
從Bowling Game Kata看敏捷開發
從Bowling Game Kata看敏捷開發從Bowling Game Kata看敏捷開發
從Bowling Game Kata看敏捷開發teddysoft
 
當Scrum遇到Pattern
當Scrum遇到Pattern當Scrum遇到Pattern
當Scrum遇到Patternteddysoft
 
說出一嘴好設計 1.1
說出一嘴好設計 1.1說出一嘴好設計 1.1
說出一嘴好設計 1.1teddysoft
 
跟著Teddy讀Pattern
跟著Teddy讀Pattern跟著Teddy讀Pattern
跟著Teddy讀Patternteddysoft
 
洗白你的軟體架構
洗白你的軟體架構洗白你的軟體架構
洗白你的軟體架構teddysoft
 
如何學好設計模式
如何學好設計模式如何學好設計模式
如何學好設計模式teddysoft
 

Más de teddysoft (10)

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
 
漫談重構
漫談重構漫談重構
漫談重構
 
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
 
洗白你的軟體架構
洗白你的軟體架構洗白你的軟體架構
洗白你的軟體架構
 
如何學好設計模式
如何學好設計模式如何學好設計模式
如何學好設計模式
 

Último

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 

Último (20)

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 

Exception Handling Design and Refactoring Workshop