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

  • 7stud -- at Sep 23, 2012 at 3:21 pm
    But I don't get the principle.
    There is no such principle as the Sandwich principle. The principle is
    Don't Repeat Yourself(DRY). So if you find yourself writing the same or
    similar code over and over again, try to figure out a way to extract the
    repeated part into a method. That way you can write the code once in
    the method, and then call the method when needed.

    --
    Posted via http://www.ruby-forum.com/.

    --
    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.
    For more options, visit https://groups.google.com/groups/opt_out.

Related Discussions

Discussion Navigation
viewthread | post
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