SlideShare a Scribd company logo
1 of 33
Download to read offline
Aspect Oriented
Programming
楊維中 a.k.a zonble
zonble@gmail.com
Thursday, September 12,
zonble
愛羅武勇
Thursday, September 12,
羅馬不是一天造成的
Unmaintainable 的 code 也是
Thursday, September 12,
⼀一開始,程式邏輯就只有插
⼊入資料⽽而已…
-	 (void)appendData:(NSData	 *)inData	 {
	  [_data	 appendData:inData];
}
Thursday, September 12,
後來,我們想確定傳⼊入的不
是 nil 或空資料
-	 (void)appendData:(NSData	 *)inData	 {
	  NSParameterAssert(inData	 !=	 nil);
	  NSParameterAssert([inData	 length]);
	  length	 =	 [_data	 length];
	  [_data	 appendData:inData];
	  NSAssert(length	 !=	 [_data	 length]);
}
Thursday, September 12,
後來,我們覺得 Release Build
也應該防⽌止輸⼊入空資料…
-	 (void)appendData:(NSData	 *)inData	 {
	  NSParameterAssert(inData	 !=	 nil);
	  NSParameterAssert([inData	 length]);
	  if	 (!inData)	 {	 return;	 }
	  if	 (![inData	 length])	 {	 return;	 }
	  length	 =	 [_data	 length];
	  [_data	 appendData:inData];
	  NSAssert(length	 !=	 [_data	 length]);
}
Thursday, September 12,
後來,我們發現這個 method
可能會在很多 thread 呼叫…
-	 (void)appendData:(NSData	 *)inData	 {
	  NSParameterAssert(inData	 !=	 nil);
	  NSParameterAssert([inData	 length]);
	  if	 (!inData)	 {
	  	  NSLog(@"inData	 is	 nil!");
	  	  return;	 
	  }
	  if	 (![inData	 length])	 {	 
	  	  NSLog(@"Length	 of	 inData	 is	 0!");
	  	  return;
	  }
	  length	 =	 [_data	 length];
	  [_lock	 lock];
	  [_data	 appendData:inData];
	  [_lock	 unlock];
	  NSAssert(length	 !=	 [_data	 length]);
}
Thursday, September 12,
後來,在 Debug Build 裡頭要
加上 TestFlight CheckPoint
-	 (void)appendData:(NSData	 
*)inData	 {
	  NSParameterAssert(inData	 !=	 
nil);
	  NSParameterAssert([inData	 
length]);
	  if	 (!inData)	 {
	  	  NSLog(@"inData	 is	 nil!");
	  	  return;	 
	  }
	  if	 (![inData	 length])	 {	 
	  	  NSLog(@"Length	 of	 inData	 
is	 0!");
	  	  return;
	  }
	  length	 =	 [_data	 length];
	  [_lock	 lock];
	  [_data	 appendData:inData];
	  [_lock	 unlock];
	  NSAssert(length	 !=	 [_data	 
length]);
#if	 DEBUG
	  [TestFlight	 
passCheckpoint:@"APPEND_DATA"];
#endif
}
Thursday, September 12,
Release Build 則要加上 Flurry
Event Log…
-	 (void)appendData:(NSData	 
*)inData	 {
	  NSParameterAssert(inData	 !=	 
nil);
	  NSParameterAssert([inData	 
length]);
	  if	 (!inData)	 {
	  	  NSLog(@"inData	 is	 nil!");
	  	  return;	 
	  }
	  if	 (![inData	 length])	 {	 
	  	  NSLog(@"Length	 of	 inData	 
is	 0!");
	  	  return;
	  }
	  length	 =	 [_data	 length];
	  [_lock	 lock];
	  [_data	 appendData:inData];
	  [_lock	 unlock];
	  NSAssert(length	 !=	 [_data	 
length]);
#if	 DEBUG
	  [TestFlight	 
passCheckpoint:@"APPEND_DATA"];
#else
	  	 [Flurry	 
logEvent:@"APPEND_DATA"];
#endif
}
Thursday, September 12,
還有 Google Analytics…
-	 (void)appendData:(NSData	 
*)inData	 {
	  NSParameterAssert(inData	 !=	 
nil);
	  NSParameterAssert([inData	 
length]);
	  if	 (!inData)	 {
	  	  NSLog(@"inData	 is	 nil!");
	  	  return;	 
	  }
	  if	 (![inData	 length])	 {	 
	  	  NSLog(@"Length	 of	 inData	 
is	 0!");
	  	  return;
	  }
	  length	 =	 [_data	 length];
	  [_lock	 lock];
	  [_data	 appendData:inData];
	  [_lock	 unlock];
	  NSAssert(length	 !=	 [_data	 
length]);
#if	 DEBUG
	  [TestFlight	 
passCheckpoint:@"APPEND_DATA"];
#else
	  	 [Flurry	 
logEvent:@"APPEND_DATA"];
	  	 id<GAITracker>tracker	 =	 [[GAI	 
sharedInstance]	 defaultTracker];
	  	 [tracker	 send:
[[GAIDictionaryBuilder	 
createEventWithCategory:@"data"	 
withAction:@"append"	 
withLabel:@"user_data"	 
withValue:nil]	 build]];	 	 
#endif
}
Thursday, September 12,
每件事情都很重要
• 確定傳⼊入參數的型態與內容
• 確定真的有插⼊入資料
• 加 Lock
• 加 Debug Log
• 加 TestFlight Log、Flurry Log…
Thursday, September 12,
23 ⾏行 code 中,
做正事的只有一行。
這還不是最糟的…
Thursday, September 12,
更糟的是…
不只⼀一個 method 這樣
Thursday, September 12,
還會破壞程式的重用
Thursday, September 12,
上個世紀末,就有⼈人覺得…
這樣不行
接下來的故事請⾃自⼰己查 Wikipedia
Thursday, September 12,
AOP 的基本想法:
把各種硬插進來的
Code 抽離並封裝
⽅方法很多
Thursday, September 12,
Cross-cutting concerns
…就是這些
• 確定傳⼊入參數的型態與內容
• 確定真的有插⼊入資料
• 加 Lock
• 加 Debug Log
• 加 TestFlight Log、Flurry Log…
Thursday, September 12,
Advice
在原本程式前後
插⼊入的程式碼
Thursday, September 12,
Decorator
Syntax
…Objective C 不⽀支援
Thursday, September 12,
Decorator Syntax
def	 add(x):
	 	 	 	 print	 "x:"	 +	 str(x)
	 	 	 	 result	 =	 x	 +	 1
	 	 	 	 print	 "result:"	 +	 str(result)
	 	 	 	 return	 result
Thursday, September 12,
Decorator Syntax
def	 log(func):
	 	 	 	 def	 inner_func(*a):
	 	 	 	 	 	 	 	 print	 "args:"	 +	 str(a)
	 	 	 	 	 	 	 	 result	 =	 func(*a)
	 	 	 	 	 	 	 	 print	 "result:"	 +	 str(result)
	 	 	 	 return	 inner_func
@log
def	 add(x):
	 	 	 	 return	 x	 +	 1
Thursday, September 12,
Objective-C 特性
Message
Forwarding
當⼀一個物件不⽀支援某個 Selector 的時
候,這個物件可以決定把 Selector 交給
其他的物件。
Thursday, September 12,
Message Forwarding
-	 (void)forwardInvocation:(NSInvocation	 *)anInvocation	 {
	 	 	 	 if	 ([someOtherObject	 respondsToSelector:
	 	 	 	 	 	 	 	 	 	 	 	 [anInvocation	 selector]])
//	 Advice	 here
	 	 	 	 	 	 	 	 [anInvocation	 invokeWithTarget:someOtherObject];
//	 Advice	 here
	 	 	 	 else
	 	 	 	 	 	 	 	 [super	 forwardInvocation:anInvocation];
}
See: Objective-C Runtime Programming Guide
Thursday, September 12,
AOP-in-Objective-C
https://github.com/moszi/AOP-in-
Objective-C
Thursday, September 12,
Method
Swizzling
Thursday, September 12,
Objective-C 第⼀一課
• ObjC 物件都是 C Structure
• ObjC method 都是 C function pointer
• 系統有⼀一個動態的索引表格,決定執⾏行
某個 selector 時,要對應到哪個 C
function
• Selector 就是索引表中的 key,型態為 C
字串
Thursday, September 12,
Objective-C 第⼆二課
• ⼀一個 Class 有哪些 method,都是在
runtime 的時候建⽴立的
• 所以可以在 runtime 新增新的 method,
例如使⽤用 category 語法
• 也可以直接使⽤用 runtime API 把已經存在
的 method 換掉
Thursday, September 12,
<objc/runtime.h>
BOOL	 class_addMethod(Class	 cls,	 SEL	 name,	 
IMP	 imp,	 const	 char	 *types);
IMP	 method_setImplementation(Method	 method,	 
IMP	 imp);
Thursday, September 12,
Thursday, September 12,
Thursday, September 12,
Thursday, September 12,
AOP-for-Objective-C
https://github.com/ndcube/AOP-for-
Objective-C/
在繼承關係的部份有些 bug,我⾃自⼰己有
先修,但是還沒有送 pull request…
Thursday, September 12,
Thank you!
Thursday, September 12,

More Related Content

What's hot

Data structures cs301 power point slides lecture 03
Data structures   cs301 power point slides lecture 03Data structures   cs301 power point slides lecture 03
Data structures cs301 power point slides lecture 03Nasir Mehmood
 
Data structure programs in c++
Data structure programs in c++Data structure programs in c++
Data structure programs in c++mmirfan
 
20100712-OTcl Command -- Getting Started
20100712-OTcl Command -- Getting Started20100712-OTcl Command -- Getting Started
20100712-OTcl Command -- Getting StartedTeerawat Issariyakul
 
Ns2: OTCL - PArt II
Ns2: OTCL - PArt IINs2: OTCL - PArt II
Ns2: OTCL - PArt IIAjit Nayak
 
Ns2: Introduction - Part I
Ns2: Introduction - Part INs2: Introduction - Part I
Ns2: Introduction - Part IAjit Nayak
 
Bartosz Milewski, “Re-discovering Monads in C++”
Bartosz Milewski, “Re-discovering Monads in C++”Bartosz Milewski, “Re-discovering Monads in C++”
Bartosz Milewski, “Re-discovering Monads in C++”Platonov Sergey
 
Racing To Win: Using Race Conditions to Build Correct and Concurrent Software
Racing To Win: Using Race Conditions to Build Correct and Concurrent SoftwareRacing To Win: Using Race Conditions to Build Correct and Concurrent Software
Racing To Win: Using Race Conditions to Build Correct and Concurrent SoftwareFastly
 
WAP to store 10 numbers in an array and find out the largest and the smallest...
WAP to store 10 numbers in an array and find out the largest and the smallest...WAP to store 10 numbers in an array and find out the largest and the smallest...
WAP to store 10 numbers in an array and find out the largest and the smallest...One97 Communications Limited
 
Fisica ii codigo
Fisica ii codigoFisica ii codigo
Fisica ii codigoeaceved5
 
Aaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security TeamsAaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security Teamscentralohioissa
 
First Steps. (db4o - Object Oriented Database)
First Steps. (db4o - Object Oriented Database)First Steps. (db4o - Object Oriented Database)
First Steps. (db4o - Object Oriented Database)Wildan Maulana
 
Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"
Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"
Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"OdessaJS Conf
 
Swift Sequences & Collections
Swift Sequences & CollectionsSwift Sequences & Collections
Swift Sequences & CollectionsCocoaHeads France
 
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash courseCodepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash courseSages
 
Constructor in c++
Constructor in c++Constructor in c++
Constructor in c++Jay Patel
 
Explaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to ComeExplaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to ComeCory Forsyth
 
Google App Engine Developer - Day3
Google App Engine Developer - Day3Google App Engine Developer - Day3
Google App Engine Developer - Day3Simon Su
 

What's hot (20)

Typelevel summit
Typelevel summitTypelevel summit
Typelevel summit
 
Data structures cs301 power point slides lecture 03
Data structures   cs301 power point slides lecture 03Data structures   cs301 power point slides lecture 03
Data structures cs301 power point slides lecture 03
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
 
Data structure programs in c++
Data structure programs in c++Data structure programs in c++
Data structure programs in c++
 
20100712-OTcl Command -- Getting Started
20100712-OTcl Command -- Getting Started20100712-OTcl Command -- Getting Started
20100712-OTcl Command -- Getting Started
 
Ns2: OTCL - PArt II
Ns2: OTCL - PArt IINs2: OTCL - PArt II
Ns2: OTCL - PArt II
 
Ns2: Introduction - Part I
Ns2: Introduction - Part INs2: Introduction - Part I
Ns2: Introduction - Part I
 
Bartosz Milewski, “Re-discovering Monads in C++”
Bartosz Milewski, “Re-discovering Monads in C++”Bartosz Milewski, “Re-discovering Monads in C++”
Bartosz Milewski, “Re-discovering Monads in C++”
 
Racing To Win: Using Race Conditions to Build Correct and Concurrent Software
Racing To Win: Using Race Conditions to Build Correct and Concurrent SoftwareRacing To Win: Using Race Conditions to Build Correct and Concurrent Software
Racing To Win: Using Race Conditions to Build Correct and Concurrent Software
 
WAP to store 10 numbers in an array and find out the largest and the smallest...
WAP to store 10 numbers in an array and find out the largest and the smallest...WAP to store 10 numbers in an array and find out the largest and the smallest...
WAP to store 10 numbers in an array and find out the largest and the smallest...
 
Fisica ii codigo
Fisica ii codigoFisica ii codigo
Fisica ii codigo
 
Aaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security TeamsAaron Bedra - Effective Software Security Teams
Aaron Bedra - Effective Software Security Teams
 
First Steps. (db4o - Object Oriented Database)
First Steps. (db4o - Object Oriented Database)First Steps. (db4o - Object Oriented Database)
First Steps. (db4o - Object Oriented Database)
 
Arp
ArpArp
Arp
 
Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"
Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"
Timur Shemsedinov "Пишу на колбеках, а что... (Асинхронное программирование)"
 
Swift Sequences & Collections
Swift Sequences & CollectionsSwift Sequences & Collections
Swift Sequences & Collections
 
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash courseCodepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
 
Constructor in c++
Constructor in c++Constructor in c++
Constructor in c++
 
Explaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to ComeExplaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to Come
 
Google App Engine Developer - Day3
Google App Engine Developer - Day3Google App Engine Developer - Day3
Google App Engine Developer - Day3
 

Viewers also liked

怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 CodeWeizhong Yang
 
reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)Chonpin HSU
 
高效能執行緒
高效能執行緒高效能執行緒
高效能執行緒Rick Wu
 
COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)
COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)
COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)Jen Yee Hong
 
用十分鐘學會 《微積分、工程數學》及其應用
用十分鐘學會  《微積分、工程數學》及其應用用十分鐘學會  《微積分、工程數學》及其應用
用十分鐘學會 《微積分、工程數學》及其應用鍾誠 陳鍾誠
 
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016Yuki Anzai
 
TPET8演講: 非典型程式教育
TPET8演講: 非典型程式教育TPET8演講: 非典型程式教育
TPET8演講: 非典型程式教育Jen Yee Hong
 

Viewers also liked (9)

貪食蛇
貪食蛇貪食蛇
貪食蛇
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code
 
reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)
 
高效能執行緒
高效能執行緒高效能執行緒
高效能執行緒
 
COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)
COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)
COSCUP 2016: 開源軟硬體實做全套電子鼓(python + RPi)
 
Jira 教學
Jira 教學Jira 教學
Jira 教學
 
用十分鐘學會 《微積分、工程數學》及其應用
用十分鐘學會  《微積分、工程數學》及其應用用十分鐘學會  《微積分、工程數學》及其應用
用十分鐘學會 《微積分、工程數學》及其應用
 
Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016Customizing Theme and Style for Material Design : Droid Kaigi 2016
Customizing Theme and Style for Material Design : Droid Kaigi 2016
 
TPET8演講: 非典型程式教育
TPET8演講: 非典型程式教育TPET8演講: 非典型程式教育
TPET8演講: 非典型程式教育
 

Similar to Aspect Oriented Programming

Dynamic C++ Silicon Valley Code Camp 2012
Dynamic C++ Silicon Valley Code Camp 2012Dynamic C++ Silicon Valley Code Camp 2012
Dynamic C++ Silicon Valley Code Camp 2012aleks-f
 
Securing Client Side Data
 Securing Client Side Data Securing Client Side Data
Securing Client Side DataGrgur Grisogono
 
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsBartosz Kosarzycki
 
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016STX Next
 
solving little problems
solving little problemssolving little problems
solving little problemsAustin Ziegler
 
Scala in hulu's data platform
Scala in hulu's data platformScala in hulu's data platform
Scala in hulu's data platformPrasan Samtani
 
XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.岡諭 李
 
Encrypt all transports
Encrypt all transportsEncrypt all transports
Encrypt all transportsEleanor McHugh
 
Cnam azure 2014 mobile services
Cnam azure 2014   mobile servicesCnam azure 2014   mobile services
Cnam azure 2014 mobile servicesAymeric Weinbach
 
იოსებ ძმანაშვილი Node.js
იოსებ ძმანაშვილი   Node.jsიოსებ ძმანაშვილი   Node.js
იოსებ ძმანაშვილი Node.jsunihack
 
All I know about rsc.io/c2go
All I know about rsc.io/c2goAll I know about rsc.io/c2go
All I know about rsc.io/c2goMoriyoshi Koizumi
 
Database By Salman Mushtaq
Database By Salman MushtaqDatabase By Salman Mushtaq
Database By Salman MushtaqSalman Mushtaq
 
Typescript - why it's awesome
Typescript - why it's awesomeTypescript - why it's awesome
Typescript - why it's awesomePiotr Miazga
 

Similar to Aspect Oriented Programming (20)

Mongo db for C# Developers
Mongo db for C# DevelopersMongo db for C# Developers
Mongo db for C# Developers
 
Dynamic C++ Silicon Valley Code Camp 2012
Dynamic C++ Silicon Valley Code Camp 2012Dynamic C++ Silicon Valley Code Camp 2012
Dynamic C++ Silicon Valley Code Camp 2012
 
Data Analysis in Python
Data Analysis in PythonData Analysis in Python
Data Analysis in Python
 
Securing Client Side Data
 Securing Client Side Data Securing Client Side Data
Securing Client Side Data
 
Kotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projects
 
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
Kotlin Developer Starter in Android - STX Next Lightning Talks - Feb 12, 2016
 
solving little problems
solving little problemssolving little problems
solving little problems
 
Clojure night
Clojure nightClojure night
Clojure night
 
Slickdemo
SlickdemoSlickdemo
Slickdemo
 
Scala in hulu's data platform
Scala in hulu's data platformScala in hulu's data platform
Scala in hulu's data platform
 
StORM preview
StORM previewStORM preview
StORM preview
 
XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.XSpect, a lightweight library to make your code reusable and maintainable.
XSpect, a lightweight library to make your code reusable and maintainable.
 
Encrypt all transports
Encrypt all transportsEncrypt all transports
Encrypt all transports
 
Cnam azure 2014 mobile services
Cnam azure 2014   mobile servicesCnam azure 2014   mobile services
Cnam azure 2014 mobile services
 
Wakanday JS201 Best Practices
Wakanday JS201 Best PracticesWakanday JS201 Best Practices
Wakanday JS201 Best Practices
 
იოსებ ძმანაშვილი Node.js
იოსებ ძმანაშვილი   Node.jsიოსებ ძმანაშვილი   Node.js
იოსებ ძმანაშვილი Node.js
 
All I know about rsc.io/c2go
All I know about rsc.io/c2goAll I know about rsc.io/c2go
All I know about rsc.io/c2go
 
Database By Salman Mushtaq
Database By Salman MushtaqDatabase By Salman Mushtaq
Database By Salman Mushtaq
 
Typescript - why it's awesome
Typescript - why it's awesomeTypescript - why it's awesome
Typescript - why it's awesome
 
Dartprogramming
DartprogrammingDartprogramming
Dartprogramming
 

More from Weizhong Yang

怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google MapsWeizhong Yang
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情Weizhong Yang
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事Weizhong Yang
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsWeizhong Yang
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repoWeizhong Yang
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 APIWeizhong Yang
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發Weizhong Yang
 
給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發Weizhong Yang
 
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程Weizhong Yang
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼Weizhong Yang
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIWeizhong Yang
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統Weizhong Yang
 

More from Weizhong Yang (20)

Flutter BLE
Flutter BLEFlutter BLE
Flutter BLE
 
怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情
 
Dart null safety
Dart null safetyDart null safety
Dart null safety
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事
 
Github Actions
Github ActionsGithub Actions
Github Actions
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing Aids
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repo
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 
給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發
 
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程苦集滅道:透過開發客製 Sketch Plug-in  改善產品設計流程
苦集滅道:透過開發客製 Sketch Plug-in 改善產品設計流程
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio API
 
Html 5 native drag
Html 5 native dragHtml 5 native drag
Html 5 native drag
 
Retina mac
Retina macRetina mac
Retina mac
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統
 
Input Method Kit
Input Method KitInput Method Kit
Input Method Kit
 
Refactoring
RefactoringRefactoring
Refactoring
 

Recently uploaded

Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
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
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
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
 
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
 
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
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
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
 

Recently uploaded (20)

Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
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
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
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
 
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
 
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
 
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
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
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!
 

Aspect Oriented Programming