Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Паттерны проектирования 6.2
Search
Vitaly Shlyaga
December 14, 2012
Education
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Паттерны проектирования 6.2
Паттерн Интерпретатор.
Vitaly Shlyaga
December 14, 2012
More Decks by Vitaly Shlyaga
See All by Vitaly Shlyaga
Разработка веб-приложений 01
storkvist
0
160
Паттерны проектирования 6.1
storkvist
0
150
Паттерны проектирования 5.1
storkvist
0
140
Паттерны проектирования 5.2
storkvist
1
120
Паттерны проектирования 4.1
storkvist
2
120
Паттерны проектирования 4.2
storkvist
1
100
Паттерны проектирования 3
storkvist
0
120
Паттерны проектирования 2
storkvist
0
280
Паттерны проектирования - 1.pdf
storkvist
0
420
Other Decks in Education
See All in Education
AIってなぁに?
kenichiota0711
0
760
AIの力を100%引き出すために
frievea
0
490
Visionary Initiative: Materials-Positive Society — Evolving “Things,” empowering a positive society | Science Tokyo
sciencetokyo
PRO
0
250
2026年度春学期 統計学 第13回 不確かな測定の不確かさを測る ― 不偏分散とt分布 (2026. 6. 25)
akiraasano
PRO
1
180
Stardy 会社紹介資料
stardy
0
7.3k
ちいかわを読め
uchi8977
1
320
Tableau Public入門ハンズオン|Titanicデータで学ぶViz作成とMakeover
hayashi_ds017
0
120
Course Review - Lecture 13 - Information Visualisation (4019538FNR)
signer
PRO
1
2.8k
Sekolah Sabat - Triwulan 3 2026 - Pelajaran 12
hiola
0
2k
sepm-training-sample
levii
0
200
新しいJavaを学んで・使っていこう! / osd26do
gishi_yama
0
250
エビデンスベースト英語教育入門:エビデンスは科学的知見(だけ)ではない,制度だ!
terasawat
0
200
Featured
See All Featured
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
310
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
Raft: Consensus for Rubyists
vanstee
141
7.7k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
520
4 Signs Your Business is Dying
shpigford
187
23k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Skip the Path - Find Your Career Trail
mkilby
1
220
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
430
Transcript
Паттерны проектирования часть 6.2
Интерпретатор Поведенческий шаблон проектирования, решающий часто встречающуюся, но подверженную изменениям,
задачу.
Абстрактное синтаксическое дерево терминалы и нетерминалы
Интерпретатор
Интерпретатор require 'find' class Expression #... end class All <
Expression def evaluate(dir) results= [] Find.find(dir) do |p| next unless File.file?(p) results << p end results end end
Интерпретатор class FileName < Expression def initialize(pattern) @pattern = pattern
end def evaluate(dir) results= [] Find.find(dir) do |p| next unless File.file?(p) name = File.basename(p) results << p if File.fnmatch(@pattern, name) end results end end
Интерпретатор expr_all = All.new files = expr_all.evaluate('test_dir') expr_mp3 = FileName.new('*.mp3')
mp3s = expr_mp3.evaluate('test_dir')
Интерпретатор class Bigger < Expression def initialize(size) @size = size
end def evaluate(dir) results = [] Find.find(dir) do |p| next unless File.file?(p) results << p if( File.size(p) > @size) end results end end
Интерпретатор class Writable < Expression def evaluate(dir) results = []
Find.find(dir) do |p| next unless File.file?(p) results << p if( File.writable?(p) ) end results end end
Интерпретатор class Not < Expression def initialize(expression) @expression = expression
end def evaluate(dir) All.new.evaluate(dir) - @expression.evaluate(dir) end end expr_not_writable = Not.new( Writable.new ) readonly_files = expr_not_writable.evaluate('test_dir') small_expr = Not.new( Bigger.new(1024) ) small_files = small_expr.evaluate('test_dir') not_mp3_expr = Not.new( FileName.new('*.mp3') ) not_mp3s = not_mp3_expr.evaluate('test_dir')
Интерпретатор class Or < Expression def initialize(expression1, expression2) @expression1 =
expression1 @expression2 = expression2 end def evaluate(dir) result1 = @expression1.evaluate(dir) result2 = @expression2.evaluate(dir) (result1 + result2).sort.uniq end end big_or_mp3_expr = Or.new( Bigger.new(1024), FileName.new('*.mp3') ) big_or_mp3s = big_or_mp3_expr.evaluate('test_dir')
Интерпретатор class And < Expression def initialize(expression1, expression2) @expression1 =
expression1 @expression2 = expression2 end def evaluate(dir) result1 = @expression1.evaluate(dir) result2 = @expression2.evaluate(dir) (result1 & result2) end end
Интерпретатор complex_expression = And.new( And.new(Bigger.new(1024), FileName.new('*.mp3')), Not.new(Writable.new )) complex_expression.evaluate('test_dir') complex_expression.evaluate('/tmp')
# and (and(bigger 1024)(filename *.mp3)) writable class Parser def initialize(text)
@tokens = text.scan(/\(|\)|[\w\.\*]+/) end def next_token @tokens.shift end def expression token = next_token if token == nil return nil elsif token == '(' result = expression raise 'Expected )' unless next_token == ')' result elsif token == 'all' return All.new elsif token == 'writable' return Writable.new elsif token == 'bigger' return Bigger.new(next_token.to_i) elsif token == 'filename' return FileName.new(next_token) elsif token == 'not' return Not.new(expression) elsif token == 'and' return And.new(expression, expression) elsif token == 'or' return Or.new(expression, expression) else raise "Unexpected token: #{token}" end end
Интерпретатор parser = Parser.new "and (and(bigger 1024)(filename *.mp3)) writable" ast
= parser.expression
Интерпретатор class Expression def |(other) Or.new(self, other) end def &(other)
And.new(self, other) end end #Or.new( # And.new(Bigger.new(2000), Not.new(Writable.new)), # FileName.new('*.mp3')) (Bigger.new(2000) & Not.new(Writable.new)) | FileName.new("*.mp3")
Интерпретатор def all All.new end def bigger(size) Bigger.new(size) end def
name(pattern) FileName.new(pattern) end def except(expression) Not.new(expression) end def writable Writable.new end # (bigger(2000) & except(writable) ) | file_name('*.mp3')