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
2026年度春学期 統計学 第14回 分布についての仮説を検証する ― 仮説検定(1) (2026. 7. 2)
akiraasano
PRO
0
140
AWS Skill Builderを活用した一石二鳥の業務計画
ysaeki
0
140
形骸化しない社内勉強会の取り組み - オーナーシップの作り方 / In-house study session
soudai
PRO
1
260
観察、仮説、実行、検証、計画、提案を一年で3000回トレーニングする方法/3000 Thinking Loops in 365 Days
moriyuya
5
1.3k
One Year of Learning English with AI @エンジニア英語キャリア Meetup #3
kekekenta
0
190
Course Review - Lecture 13 - Information Visualisation (4019538FNR)
signer
PRO
1
2.8k
「答えを出す」より「わかる」をつくる
kzkmaeda
1
290
Enterprise UI, v2
stevekinney
0
220
FA26 CLU MS Clinical Psychology New Student Orientation
jdbedics
0
170
人間のために、人間と共に働く時代の終わりの始まり
frievea
0
170
DecisionesEjecutivasCrisis
mariooc
0
260
SFプロトタイピング体験(滝中学校)
yusk1450
PRO
0
130
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
RailsConf 2023
tenderlove
30
1.5k
Six Lessons from altMBA
skipperchong
29
4.5k
BBQ
matthewcrist
89
10k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Rails Girls Zürich Keynote
gr2m
96
14k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
430
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
320
Discover your Explorer Soul
emna__ayadi
2
1.3k
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')