SlideShare a Scribd company logo
從 Classes 到 Objects:
那些 OOP 教我的事
http://ihower.tw
2013/10/26@ RubyConf China
我是誰
• 張⽂文鈿 a.k.a. ihower
• http://ihower.tw
• 來⾃自台灣
從 Classes 到 Objects: 那些 OOP 教我的事
從 Classes 到 Objects: 那些 OOP 教我的事
Ruby Taiwan
http://ruby.tw
RubyConf Taiwan
2013/4/25-26
Agenda
•
•
•

•

OOP
class-oriented
object-oriented

•
•
•

Role-oriented
Context-oriented
DCI

Conclusion
Object = Identity
+ Behavior
+ State
Identity
a = "foo"
b = "foo"
a.object_id # 70178176631620
b.object_id # 70178176659140
a == b # true
a.equal?(b) # false
Behavior
"foo".methods =>
[:<=>, :==, :===, :eql?, :hash,
:casecmp, :+, :*, :%, :[], :
[]=, :insert, :length, :size,
:bytesize, :empty?, :=~, :match, :succ,
:succ!, :next, :next!, :upto, :index,
:rindex, :replace, :clear, :chr,
:getbyte, :setbyte, :byteslice, :to_i,
:to_f, :to_s, :to_str, :inspect, :dump,
:upcase, :downcase, :capitalize,
:swapcase, :upcase!, :downcase!,
:capitalize!, :swapcase!, :hex, :oct,
State
class Person
def name
@name
end
def name=(name)
@name = name
end
end
State (cont.)
a = Person.new
b = Person.new
a.name = "Foo"
b.name = "Bar"
class Person
attr_accessor :name
end
封裝 Encapsulation
• 物件的 State 狀態被封裝起來
• 必須透過外在的 Behavior,也就是
Method ⽅方法來存取操作
多型 Polymorphism
• Duck-typing in Ruby
• 不管物件的類型,只要有相同的介⾯面,
就可以呼叫使⽤用
class Org
attr_accessor :name
end
[Person.new, Org.new].each do |p|
puts p.name
end
OOP = objects
+ messages
Sending Message
就是呼叫物件的⽅方法

person
呼叫 name ⽅方法

內部狀態
@name
runtime picture
obj
obj

obj

obj
obj
obj

obj
obj
class-oriented design?
class-based OOP
class-based OOP
• 物件需要⼀一種⽅方式可以⽅方便⽣生成
class-based OOP
• 物件需要⼀一種⽅方式可以⽅方便⽣生成
• 絕⼤大部分的 OO 程式語⾔言都⽀支援 class-based
class-based OOP
• 物件需要⼀一種⽅方式可以⽅方便⽣生成
• 絕⼤大部分的 OO 程式語⾔言都⽀支援 class-based
• 是 Object 的 template 樣板
class-based OOP
• 物件需要⼀一種⽅方式可以⽅方便⽣生成
• 絕⼤大部分的 OO 程式語⾔言都⽀支援 class-based
• 是 Object 的 template 樣板
• 是 Object 的 factory ⼯工廠
class-oriented?
class-oriented?
• 使⽤用 class 概念來設計整個系統
class-oriented?
• 使⽤用 class 概念來設計整個系統
• 找出系統的 nouns,以資料為中⼼心,將物
件⽤用類別進⾏行分類 (Data-centric)
class-oriented?
• 使⽤用 class 概念來設計整個系統
• 找出系統的 nouns,以資料為中⼼心,將物
件⽤用類別進⾏行分類 (Data-centric)

• 愛⽤用繼承架構
class-oriented?
• 使⽤用 class 概念來設計整個系統
• 找出系統的 nouns,以資料為中⼼心,將物
件⽤用類別進⾏行分類 (Data-centric)

• 愛⽤用繼承架構
• 最後得到系統的 static representation
A static class diagram
Data-centric
• 例如,⼀一個 e-commerce 系統:
• Product
• Invoice
• User
• 將需要的⽅方法定義在每個類別上
A Product model
class Product
validates_presence_of :name
end
不斷加⽅方法進來
class Product
validates_presence_of :name
def add_to_billing(billing)
billing.items << self
end
end
A fat Product model
class Product
validates_presence_of :name, :price
def add_to_billing(order)
order.items << self
end
def tag(name)
#...
end
def self.export
#...
end
def sales_report
#...
end
你以為很多物件在互動
obj
obj

obj

obj
obj
obj

obj
obj
其實只有少數幾種物件
User

Product

Invoice
三種類型的物件
class Product
def A
def B
def C
...
...
...
...
...
end

class Invoice
def X
def Y
def Z
...
...
...
...
...
end

class User
def Q
def W
def E
...
...
...
...
...
end
最後變成
萬能的 God Object!
What’s more
Object-oriented?
如何能更善⽤用 Object?
是什麼 v.s. 做什麼
是什麼 v.s. 做什麼
• ⼀一個物件”是什麼” (Being) 跟作什麼
(Doing) 是分開的概念
是什麼 v.s. 做什麼
• ⼀一個物件”是什麼” (Being) 跟作什麼
(Doing) 是分開的概念

• ⼀一個物件需要有什麼⽅方法,跟當時的⾓角
⾊色和情境有關係
是什麼 v.s. 做什麼
• ⼀一個物件”是什麼” (Being) 跟作什麼
(Doing) 是分開的概念

• ⼀一個物件需要有什麼⽅方法,跟當時的⾓角
⾊色和情境有關係

• Responsibility-centric 以職責為中⼼心,將
物件進⾏行分類
1. 根據 Roles 來區分
物件可以做什麼
def work
end
def rest
end
def approve
end
def review
end
person
Roles:
Employee

def work
end
def rest
end
def approve
end
def review
end
def work
end
def rest
end

person
Roles:
Manager

def approve
end
def review
end
Role-oriented
• 不同⾓角⾊色有不同責任,需要的⽅方法也就
不同

• ⽤用單⼀一繼承⾏行不通的,⼀一個物件可能同
時有好幾個⾓角⾊色
def buy
end
def complain
end
def approve
end
def review
end

Role:
Customer

Role:
Manager
def buy
end

person
Roles:
Customer
Manager

def complain
end
def approve
end
def review
end

Role:
Customer

Role:
Manager
怎麼實作?
We represent roles as identifiers ... they [roles] may
just be pointers to role-bound object, or macros, or
function or something else.
- Lean Architecture p.240
⽅方法⼀一:
Composition
Object Composition
Object Composition
• ⼀一個物件裡包其他物件
Object Composition
• ⼀一個物件裡包其他物件
• 靜態程式語⾔言的唯⼀一選擇
Object Composition
• ⼀一個物件裡包其他物件
• 靜態程式語⾔言的唯⼀一選擇
• 眾多 Design Pattern
class Person
def initialize(role)
@role_behavior = role
end
def say
@role_behavior.say
end
end
class EmployeeRole
def say
puts "done!"
end
end
class ManagerRole
def say
puts "solid!"
end
end
Strategy Pattern!
p1 = Person.new(ManagerRole.new)
p2 = Person.new(EmployeeRole.new)
person

person

employee
role

manager
role
或是換個
組合⽅方向?
require 'delegate'
class Person
end
class EmployeeRole < SimpleDelegator
def say
puts "done!"
end
end
class ManagerRole < SimpleDelegator
def fly
puts "solid!"
end
end
require 'delegate'
class Person
end
class EmployeeRole < SimpleDelegator
def say
puts "done!"
end
end
class ManagerRole < SimpleDelegator
def fly
puts "solid!"
end
end
Decorator Pattern
p1 = EmployeeRole.new(Person.new)
p2 = ManagerRole.new(Person.new)
employee

manager

person

person
Strategy v.s. Decorator
Strategy v.s. Decorator
• Strategy Pattern
• 相同⽅方法,但是不同⾓角⾊色有不同演算
法時
Strategy v.s. Decorator
• Strategy Pattern
• 相同⽅方法,但是不同⾓角⾊色有不同演算
法時

• Decorator Pattern
• 當你想新增物件的⾓角⾊色⾏行為時
Object Composition
• Composition 很強⼤大
• 但是也可以搞的很複雜,特別是參數和
狀態如何在物件之間流通....
⽅方法⼆二:
Mixin
A Product model
class Product
validates_presence_of :name
def add_to_billing(billing)
billing.items << self
end
end
Orderable Role
module Billingable
def add_to_billing(billing)
billing.items << self
end
end
class Product
validates_presence_of :name
include Billingable
end
class Product
validates_presence_of :name
include
include
include
include
end

Billingable
Taggable
Exporter
Reporter
從 Classes 到 Objects: 那些 OOP 教我的事
Rails4
• app/models/concerns
• app/controllers/concerns
批評
• 只是 copy-paste ⽽而已
• module 本質上還是繼承 inheritance,不
若 composition 容易替換
Poor man’s
role-oriented design
Simple, Quick and Dirty
是什麼 v.s. 做什麼
• ⼀一個物件”是什麼” (Being) 跟作什麼
(Doing) 是分開的概念

• ⼀一個物件需要有什麼⽅方法,跟當時的⾓角
⾊色和情境有關係

• Responsibility-centric 以職責為中⼼心,將
物件進⾏行分類
2. 根據情境來區分
物件可以做什麼
def buy
end
def complain
end
def approve
end
def review
end
def buy
end
def complain
end
def approve
end
def review
end

購物情境
才需要
def buy
end
def complain
end
def approve
end
def review
end

客服情境
才需要
Use case
• 不同的 User case 特定情境,物件需要的
⽅方法不⼀一樣

• 例如註冊流程、購物流程
怎麼實作?
還是 Composition
⽽而且有很多種 Patterns
• Service object
• Query object
• Form object
• View object
• Policy object
• ....根據情境分類....
Service Object
a.k.a. Command Pattern
包裝跨 Data Model 的操作

class BillingControllers < ApplicationController
before_filter :find_current_billing
def add_product
@product = Product.find(params[:product_id])
BillingService.new(@billing, @product).perform!
end
end
Service Object
class BillingService
def initialize(billling, product)
@billling = billling
@product = product
end
def perform!
add_product_to_billling(@billling, @product)
end
private
def add_product_to_billling(billling, product)
billling.items << product
end
end
Query Object
包裝複雜的 SQL 查詢

class ProductQuery
def initialize(relation = Product.scoped)
@relation = relation
end
def by_regions(region_ids = nil)
if region_ids.present?
countrys = RegionCountry.where(:region_id =>
region_ids).pluck(:country_alpha2)
@relation = @relation.where(:country => countrys)
end
self
end
end
@products = ProductQuery.new.by_regions(region_ids)
View Object
包裹給 Rails View 使⽤用

class DashboardView
def initialize(company)
@company = company
end
def arr
#...
end
def mrr
#...
end
def cac
#...
end
end
Form Object
搭配 Rails 的表單

class Signup
include Virtus
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attr_reader :user
attr_reader :company
attribute :name, String
attribute :company_name, String
attribute :email, String
validates :email, presence: true
# … more validations …
# Forms are never themselves persisted
def persisted?
false
end
def save
if valid?
persist!
true
else
false
end
end
class SignupsController < ApplicationController
def create
@signup = Signup.new(params[:signup])
if @signup.save
redirect_to dashboard_path
else
render "new"
end
end
end
從 Classes 到 Objects: 那些 OOP 教我的事
增加物件的多樣性
避免肥⼤大的類別
obj
obj

obj

obj
obj
obj

obj
obj
DCI
⾓角⾊色+情境
將 Behavior 跟 Data model 分開的更徹底
DCI
DCI
• Data: 資料
DCI
• Data: 資料
• 例如 Product
DCI
• Data: 資料
• 例如 Product
• Context: 情境
DCI
• Data: 資料
• 例如 Product
• Context: 情境
• 例如加⼊入購物⾞車這個 Use case
DCI
• Data: 資料
• 例如 Product
• Context: 情境
• 例如加⼊入購物⾞車這個 Use case
• Interaction: ⾏行為
DCI
• Data: 資料
• 例如 Product
• Context: 情境
• 例如加⼊入購物⾞車這個 Use case
• Interaction: ⾏行為
• 例如加⼊入購物⾞車這個⽅方法
呼叫⽅方式
class BillingControllers < ApplicationController
before_filter :find_current_billing
def add_product
@product = Product.find(params[:product_id])
BillingContext.new(@billing, @product).perform!
end
end
情境
class BillingContext
def initialize(billling, product)
@billling = billling
end
def perform!
@product.add_to_billling(@billling)
end
end
class Product < ActiveRecord::Base
# 注意,這裡不放 Behavior 了
end
Billingable Role
class BillingContext
module Billlingable
def add_to_billling(billling)
billling.items << self
end
end
end
class BillingContext
def initialize(billling, product)
@billling = billling
@product.extend(Billingable)
end
def perform!
@product.add_to_billling(@billling)
end
module Billlingable
def add_to_billling(billling)
billling.items << self
end
end
data model 的 behavior,
是 run-time 的時候,根據當時的需要
動態 extend 進去物件
compile-time
Product
class
沒有⾏行為

run-time
extend ⾏行為模組

Product
object
加上⾏行為
批評
⽤用 Wrapper ?
require 'delegate'
class BillingContext
def initialize(billling, product)
@billling = billling
@product = BillingableProduct.new(product)
end
def perform!
@product.add_to_billling(@billling)
end
class BilllingableProduct < SimpleDelegator
def add_to_billling(billling)
billling.items << __getobj__
end
end
end
self 精神分裂
http://en.wikipedia.org/wiki/Schizophrenia_(object-oriented_programming)

• __getobj__
• 多包⼀一層,物件的 identify 和 class 是不⼀一
樣的,需要處理資料傳遞和分享的問題

• 就算⾃自⼰己寫 Wrapper,也很⿇麻煩
• 更別提如果有兩個以上的 Roles
Benchmark
並沒有數量級的差距
0.4
0.3
0.2
0.1
0

inherited

mixin

wrapper

simple delegator

extend(DCI)

https://gist.github.com/ihower/7160400
結論
Conclusion
結論
結論
• 從 Data-Centric 到 Responsibility-centric
結論
• 從 Data-Centric 到 Responsibility-centric
• 物件的 Behavior 會因為⾓角⾊色和情境⽽而需求不

同,可以分開。⽽而不需要通通塞在 data model
上
結論 (cont.)
結論 (cont.)
•

在靜態語⾔言中,Composition 是唯⼀一解
結論 (cont.)
•
•

在靜態語⾔言中,Composition 是唯⼀一解
但是在 Ruby 中,善⽤用⼀一些技巧可以事半功倍

•
•

Mixins
DCI
結論 (cont.)
•
•
•

在靜態語⾔言中,Composition 是唯⼀一解
但是在 Ruby 中,善⽤用⼀一些技巧可以事半功倍

•
•

Mixins
DCI

因為 Ruby 把 class 當作 behavior 的容器,⽽而
不是死的 template,所以可以動態地修改⾏行
為
Reference:
•
•
•

Object-Oriented Programming: Objects over Classes (The ThoughtWorks Anthology 2)

•
•
•
•
•

http://mikepackdev.com/blog_posts/24-the-right-way-to-code-dci-in-ruby

•

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecordmodels/

•

https://speakerdeck.com/stefanoverna/fat-models-must-die

Clean Ruby, Jim Gay
Rails Developers Should Take DCI Seriously http://gilesbowkett.blogspot.tw/2012/12/
rails-developers-should-take-dci.html
http://dci-in-ruby.info/
https://practicingruby.com/articles/responsibility-centric-vs-data-centric-design
http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns
http://blog.gemnasium.com/post/60091511603/casting-adding-behavior-to-objectswithout-using
謝謝!
歡迎參加明晚 Faria Systems 的
After Party

More Related Content

What's hot (20)

PDF
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
 
KEY
Ruby basic
xiaozhestrong
 
PDF
JS and NG - ntut iLab 2015/07/14
BO Hong LI
 
PDF
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
 
PPT
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
 
PDF
潜力无限的编程语言Javascript
jay li
 
PPTX
Ecma script edition5-小试
lydiafly
 
PPT
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
 
PDF
Migrations 與 Schema 操作
Shengyou Fan
 
PPTX
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
PPT
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
 
PDF
CRUD 綜合運用
Shengyou Fan
 
PDF
Eloquent ORM
Shengyou Fan
 
PDF
如何用JDK8實作一個小型的關聯式資料庫系統
なおき きしだ
 
PDF
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
 
PDF
整合 Open ID
Shengyou Fan
 
PDF
建造与理解-用Python实现深度学习框架
ZhenChen57
 
Java SE 7 技術手冊投影片第 06 章 - 繼承與多型
Justin Lin
 
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
 
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
 
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
 
Ruby basic
xiaozhestrong
 
JS and NG - ntut iLab 2015/07/14
BO Hong LI
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
 
潜力无限的编程语言Javascript
jay li
 
Ecma script edition5-小试
lydiafly
 
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
 
Migrations 與 Schema 操作
Shengyou Fan
 
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
 
CRUD 綜合運用
Shengyou Fan
 
Eloquent ORM
Shengyou Fan
 
如何用JDK8實作一個小型的關聯式資料庫系統
なおき きしだ
 
Java SE 7 技術手冊投影片第 02 章 - 從JDK到IDE
Justin Lin
 
整合 Open ID
Shengyou Fan
 
建造与理解-用Python实现深度学习框架
ZhenChen57
 

Viewers also liked (19)

PDF
那些 Functional Programming 教我的事
Wen-Tien Chang
 
PPTX
空手、緊握、到放手 – 敏捷路上學到的5件事
Yves Lin
 
PDF
淺談 Startup 公司的軟體開發流程 v2
Wen-Tien Chang
 
PPTX
ScrumMaster 的吃飯傢伙 – 引導出個夢幻團隊 Building a Dream Team with Facilitation
Yves Lin
 
PDF
Design Patterns這樣學就會了:入門班 Day1 教材
teddysoft
 
PDF
Refactoring Workshop (Rails Pacific 2014)
Bruce Li
 
PDF
Ruby 程式語言綜覽簡介
Wen-Tien Chang
 
PDF
Yet another introduction to Git - from the bottom up
Wen-Tien Chang
 
PDF
好設計如何好 @ C.C. Agile #14
teddysoft
 
PDF
ALPHAhackathon: How to collaborate
Wen-Tien Chang
 
PDF
那一夜我們說Pattern design patterns 20周年-published
teddysoft
 
PDF
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
Wen-Tien Chang
 
PDF
Git 版本控制系統 -- 從微觀到宏觀
Wen-Tien Chang
 
PDF
A brief introduction to SPDY - 邁向 HTTP/2.0
Wen-Tien Chang
 
PDF
PHP 語法基礎與物件導向
Shengyou Fan
 
PDF
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
Wen-Tien Chang
 
PPTX
[演講] Scrum導入經驗分享
teddysoft
 
PDF
敏捷軟體開發方法與 Scrum 簡介
曦 徐
 
PDF
TensorFlow 深度學習講座
Mark Chang
 
那些 Functional Programming 教我的事
Wen-Tien Chang
 
空手、緊握、到放手 – 敏捷路上學到的5件事
Yves Lin
 
淺談 Startup 公司的軟體開發流程 v2
Wen-Tien Chang
 
ScrumMaster 的吃飯傢伙 – 引導出個夢幻團隊 Building a Dream Team with Facilitation
Yves Lin
 
Design Patterns這樣學就會了:入門班 Day1 教材
teddysoft
 
Refactoring Workshop (Rails Pacific 2014)
Bruce Li
 
Ruby 程式語言綜覽簡介
Wen-Tien Chang
 
Yet another introduction to Git - from the bottom up
Wen-Tien Chang
 
好設計如何好 @ C.C. Agile #14
teddysoft
 
ALPHAhackathon: How to collaborate
Wen-Tien Chang
 
那一夜我們說Pattern design patterns 20周年-published
teddysoft
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
Wen-Tien Chang
 
Git 版本控制系統 -- 從微觀到宏觀
Wen-Tien Chang
 
A brief introduction to SPDY - 邁向 HTTP/2.0
Wen-Tien Chang
 
PHP 語法基礎與物件導向
Shengyou Fan
 
從 Scrum 到 Kanban: 為什麼 Scrum 不適合 Lean Startup
Wen-Tien Chang
 
[演講] Scrum導入經驗分享
teddysoft
 
敏捷軟體開發方法與 Scrum 簡介
曦 徐
 
TensorFlow 深度學習講座
Mark Chang
 
Ad

Similar to 從 Classes 到 Objects: 那些 OOP 教我的事 (16)

PDF
Ruby Rails 老司機帶飛
Wen-Tien Chang
 
PPTX
Object-oriented programming 物件導向程式設計 -- 從「需要」到「認識」,再到「應用」,最後內化在自己的寫扣裡
Kiwi Lee
 
PPTX
重構—改善既有程式的設計(chapter 7)
Chris Huang
 
DOC
物件導向設計原理及設計樣式
Y YU
 
PPTX
2020 11-27 Taiwan DDD Conference
Guan-Rong Huang
 
PDF
Ksdg 使用 ruby on rails 快速打造你的 web app
Eddie Lee
 
PDF
Spring 2.x 中文
Guo Albert
 
PDF
Ruby的类和对象模型
yinhm .
 
PDF
先不談 agile 不 agile 了,你有聽過 deadline 嗎?
Terry Wang
 
PDF
物件導向系統分析與設計(建國)
Kyle Lin
 
PDF
OO x Python @ Tainan.py x MOSUT x FP 2014.09.27
Chun-Yu Tseng
 
PDF
2015.07.17 新人報告(2)
Chih-Wei Chuang
 
PPT
OOAD
shiyanyong
 
PDF
领域驱动设计实践
Jacky Chi
 
PPTX
Study research in April
AlbertChenKkchuchu
 
PPTX
團隊協作實戰DDD
Jed Lin
 
Ruby Rails 老司機帶飛
Wen-Tien Chang
 
Object-oriented programming 物件導向程式設計 -- 從「需要」到「認識」,再到「應用」,最後內化在自己的寫扣裡
Kiwi Lee
 
重構—改善既有程式的設計(chapter 7)
Chris Huang
 
物件導向設計原理及設計樣式
Y YU
 
2020 11-27 Taiwan DDD Conference
Guan-Rong Huang
 
Ksdg 使用 ruby on rails 快速打造你的 web app
Eddie Lee
 
Spring 2.x 中文
Guo Albert
 
Ruby的类和对象模型
yinhm .
 
先不談 agile 不 agile 了,你有聽過 deadline 嗎?
Terry Wang
 
物件導向系統分析與設計(建國)
Kyle Lin
 
OO x Python @ Tainan.py x MOSUT x FP 2014.09.27
Chun-Yu Tseng
 
2015.07.17 新人報告(2)
Chih-Wei Chuang
 
领域驱动设计实践
Jacky Chi
 
Study research in April
AlbertChenKkchuchu
 
團隊協作實戰DDD
Jed Lin
 
Ad

More from Wen-Tien Chang (17)

PDF
評估驅動開發 Eval-Driven Development (EDD): 生成式 AI 軟體不確定性的解決方法
Wen-Tien Chang
 
PDF
⼤語⾔模型 LLM 應⽤開發入⾨
Wen-Tien Chang
 
PDF
RSpec on Rails Tutorial
Wen-Tien Chang
 
PDF
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Wen-Tien Chang
 
PDF
Exception Handling: Designing Robust Software in Ruby
Wen-Tien Chang
 
PDF
RubyConf Taiwan 2012 Opening & Closing
Wen-Tien Chang
 
PDF
Git Tutorial 教學
Wen-Tien Chang
 
PDF
RubyConf Taiwan 2011 Opening & Closing
Wen-Tien Chang
 
PDF
BDD style Unit Testing
Wen-Tien Chang
 
PDF
Git and Github
Wen-Tien Chang
 
PDF
Service-Oriented Design and Implement with Rails3
Wen-Tien Chang
 
PDF
Rails3 changesets
Wen-Tien Chang
 
PDF
遇見 Ruby on Rails
Wen-Tien Chang
 
PDF
Designing Ruby APIs
Wen-Tien Chang
 
PDF
Rails Security
Wen-Tien Chang
 
PDF
Rails Performance
Wen-Tien Chang
 
PDF
Distributed Ruby and Rails
Wen-Tien Chang
 
評估驅動開發 Eval-Driven Development (EDD): 生成式 AI 軟體不確定性的解決方法
Wen-Tien Chang
 
⼤語⾔模型 LLM 應⽤開發入⾨
Wen-Tien Chang
 
RSpec on Rails Tutorial
Wen-Tien Chang
 
Exception Handling: Designing Robust Software in Ruby (with presentation note)
Wen-Tien Chang
 
Exception Handling: Designing Robust Software in Ruby
Wen-Tien Chang
 
RubyConf Taiwan 2012 Opening & Closing
Wen-Tien Chang
 
Git Tutorial 教學
Wen-Tien Chang
 
RubyConf Taiwan 2011 Opening & Closing
Wen-Tien Chang
 
BDD style Unit Testing
Wen-Tien Chang
 
Git and Github
Wen-Tien Chang
 
Service-Oriented Design and Implement with Rails3
Wen-Tien Chang
 
Rails3 changesets
Wen-Tien Chang
 
遇見 Ruby on Rails
Wen-Tien Chang
 
Designing Ruby APIs
Wen-Tien Chang
 
Rails Security
Wen-Tien Chang
 
Rails Performance
Wen-Tien Chang
 
Distributed Ruby and Rails
Wen-Tien Chang
 

從 Classes 到 Objects: 那些 OOP 教我的事