Skip to content

Instantly share code, notes, and snippets.

@JoshCheek
Last active December 30, 2016 10:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JoshCheek/9ccfd7b416b9df5260dd5b983321da87 to your computer and use it in GitHub Desktop.
Save JoshCheek/9ccfd7b416b9df5260dd5b983321da87 to your computer and use it in GitHub Desktop.
An example of how to decouple the interesting behaviour out from a user interface
require_relative 'users'
users = Users.new
loop do
puts "---------------------------------"
puts "Menu:"
puts "1. Add a user"
puts "2. List users"
puts "3. Sort users by name A to Z"
puts "4. Sort users by name Z to A"
puts "5. Sort users by age young to old"
puts "6. Sort users by age old to young"
puts "7. Quit"
print "> "
case gets.chomp
when "1"
print "Enter the user's name: "
name = gets.chomp
print "Enter the user's age: "
age = gets.to_i
users.add(name, age)
when "2"
puts "---------------------------------"
puts users
gets
when "3"
users.sort_by_name_asc
when "4"
users.sort_by_name_desc
when "5"
users.sort_by_age_asc
when "6"
users.sort_by_age_desc
when "7", "exit", "quit"
break
else
puts "Invalid input, please enter a number 1 - 7"
gets
end
end
class User
def initialize(name, age)
@name = name
@age = age
end
def name
@name
end
def age
@age
end
def inspect
"#<#{@name} (#{@age})>"
end
end
class Users
def initialize(users=[])
@users = users
end
def add(name, age)
@users << User.new(name, age)
end
def sort_by_name_asc
@users = @users.sort_by { |user| user.name }
end
def sort_by_name_desc
@users = sort_by_name_asc.reverse
end
def sort_by_age_asc
@users = @users.sort_by { |user| user.age }
end
def sort_by_age_desc
@users = sort_by_age_asc.reverse
end
def to_s
name_length = (largest_name || "NAME").length
age_length = (largest_age || "AGE").to_s.length
string = ""
header = "NAME".ljust(name_length) + " " + "AGE".ljust(age_length)
string << header << "\n"
divider = "=" * header.length
string << divider << "\n"
@users.each do |user|
user_string = user.name.ljust(name_length) + " " + user.age.to_s.ljust(age_length)
string << user_string << "\n"
end
string
end
def largest_name
@users.map { |user| user.name }.max_by { |name| name.length }
end
def largest_age
@users.map { |user| user.age }.max
end
end
users = Users.new
users.add('Anita', 5)
users.add('Britney', 20)
users.add('Chad', 103)
users.sort_by_name_asc # => [#<Anita (5)>, #<Britney (20)>, #<Chad (103)>]
users.sort_by_name_desc # => [#<Chad (103)>, #<Britney (20)>, #<Anita (5)>]
users.sort_by_age_asc # => [#<Anita (5)>, #<Britney (20)>, #<Chad (103)>]
users.sort_by_age_desc # => [#<Chad (103)>, #<Britney (20)>, #<Anita (5)>]
users.to_s
# => "NAME AGE\n" +
# "===========\n" +
# "Chad 103\n" +
# "Britney 20 \n" +
# "Anita 5 \n"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment