Last active
December 30, 2016 10:08
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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