hello,

Im still working on ruby koans.
Now I have to do some sandwhich code.

The exercise looks like this :

require File.expand_path(File.dirname(__FILE__) + '/edgecase')

class AboutSandwichCode < EdgeCase::Koan

def count_lines(file_name)
file = open(file_name)
count = 0
while line = file.gets
count += 1
end
count
ensure
file.close if file
end

def test_counting_lines
assert_equal 4, count_lines("example_file.txt")
end

# ------------------------------------------------------------------

def find_line(file_name)
file = open(file_name)
while line = file.gets
return line if line.match(/e/)
end
ensure
file.close if file
end

def test_finding_lines
assert_equal "test\n", find_line("example_file.txt")
end

# ------------------------------------------------------------------
# THINK ABOUT IT:
#
# The count_lines and find_line are similar, and yet different.
# They both follow the pattern of "sandwich code".
#
# Sandwich code is code that comes in three parts: (1) the top slice
# of bread, (2) the meat, and (3) the bottom slice of bread. The
# bread part of the sandwich almost always goes together, but
# the meat part changes all the time.
#
# Because the changing part of the sandwich code is in the middle,
# abstracting the top and bottom bread slices to a library can be
# difficult in many languages.
#
# (Aside for C++ programmers: The idiom of capturing allocated
# pointers in a smart pointer constructor is an attempt to deal with
# the problem of sandwich code for resource allocation.)
#
# Consider the following code:
#

def file_sandwich(file_name)
file = open(file_name)
yield(file)
ensure
file.close if file
end

# Now we write:

def count_lines2(file_name)
file_sandwich(file_name) do |file|
count = 0
while line = file.gets
count += 1
end
count
end
end

def test_counting_lines2
assert_equal 4, count_lines2("example_file.txt")
end

# ------------------------------------------------------------------

def find_line2(file_name)
# Rewrite find_line using the file_sandwich library function.
end

def test_finding_lines2
assert_equal __, find_line2("example_file.txt")
end

# ------------------------------------------------------------------

def count_lines3(file_name)
open(file_name) do |file|
count = 0
while line = file.gets
count += 1
end
count
end
end

def test_open_handles_the_file_sandwich_when_given_a_block
assert_equal __, count_lines3("example_file.txt")
end

end


But I don't get the principle.

Can anyone explain this to me ?

Roelof



--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/ecbeYKZSW80J.
For more options, visit https://groups.google.com/groups/opt_out.

Search Discussions

Discussion Posts

Follow ups

Related Discussions

Discussion Navigation
viewthread | post
posts ‹ prev | 1 of 2 | next ›
Discussion Overview
grouprubyonrails-talk @
categoriesrubyonrails
postedSep 23, '12 at 11:15a
activeSep 23, '12 at 3:21p
posts2
users2
websiterubyonrails.org
irc#RubyOnRails

2 users in discussion

7stud --: 1 post Roelof: 1 post

People

Translate

site design / logo © 2021 Grokbase