Remember the ride share exercise we did with designing and creating a system to track the ride share data from a CSV file? We did a lot of great work on this exercise in creating arrays and hashes of data, but we've learned a lot since we did that exercise!
Now, we're going to use our understanding of classes, methods and attributes to create an object-oriented implementation of our ride share system.
This is a level 2 individual project.
Reinforce and practice all of the Ruby and programming concepts we've covered in class so far:
- Creating and instantiating classes with attributes
- Creating class methods and instance methods within our classes
- Writing pseudocode and creating tests to drive the creation of our code
We have a code base that already pulls data from CSV files and turns them into collections of the following objects:
Driver
sPassenger
sTrip
s
All of this data is managed in a class called TripDispatcher
. Our program will contain one instance of TripDispatcher
, which will load and manage the lists of Driver
s, Passenger
s and Trip
s.
We are going to continue making functionality that works with this data, such as finding the duration of a specific trip or the total amount of money a passenger has spent, and also make functionality to create a new trip.
Each Driver
has:
Attribute | Description |
---|---|
id | The Driver's ID number |
name | The name of the Driver |
vehicle_identification | The driver's Vehicle Identification Number (VIN Number), Each vehicle identification number should be a specific length to ensure it is a valid vehicle identification number |
status | Indicating availability, a driver's availability should be either :AVAILABLE or :UNAVAILABLE |
Each Driver
instance is able to:
Method | Description |
---|---|
average_rating | retrieve an average rating for that driver based on all trips taken |
Each Passenger
has:
Attribute | Description |
---|---|
id | The Driver's ID number |
name | The name of the Driver |
Phone Number | The Passenger's Phone Number which must be in phone number format (XXX) XXX-XXXX |
trips | A list of trips that only this passenger has taken |
Each Passenger
instance is able to:
Method | Description |
---|---|
get_drivers | retrieve the list of all previous driver instances associated with trips this passenger has taken |
Each Trip
has:
Attribute | Description |
---|---|
id | The Driver's ID number |
passenger | The passenger on the trip |
driver | The driver for the trip |
rating | The rating given by the passenger, a number 1-5 |
Each Trip
instance is able to:
Method | Description |
---|---|
driver | retrieve the associated driver instance |
passenger | retrieve the associated passenger instance |
The TripDispatcher
has:
Attribute | Description |
---|---|
drivers | A list of all drivers in the system |
passengers | A list of all passengers in the system |
trips | A list of all trips taken in the system |
The TripDispatcher
has the following responsibilities:
- load collections of
Driver
s,Passenger
s, andTrip
s from CSV files - store and manage this data into separate collections
The TripDispatcher
does the following:
- on instantiation, loads and creates
Trip
s,Passenger
s, andDriver
s and stores them into collections
The TripDispatcher
instance is able to:
Methods | Description |
---|---|
drivers, passengers, trips | retrieve the collection of Trip s, Passenger s, and Driver s |
find_driver | find an instance of Driver given an ID |
find_passenger | find an instance of Passenger given an ID |
By the end of this project, a TripDispatcher
will be able to:
- create new trips with assigning appropriate passengers and drivers
We will use the same project structure we used for the previous project. Classes should be in files in the lib
folder, and tests should be in files in the specs
folder. You will run tests by executing the rake
command, as configured in a Rakefile.
The support
folder contains CSV files which will drive your system design. Each CSV corresponds to a different type of object as well as creating a relationship between different objects.
- Fork this repository in GitHub
- Clone the repository to your computer
- Run
rake
to run the tests
You should use the following process as much as possible:
- Write pseudocode
- Write test(s)
- Write code
- Refactor
To start this project, take some time to get familiar with the code. Do the following in this order:
- Read through all of the tests
- Look at the provided CSV files:
support/drivers.csv
,support/passengers.csv
,support/trips.csv
- Then look through the ruby files in the
lib
folder
Create a diagram that describes how each of these classes and methods (messages) interact with one another as well as with the CSV files.
Exercise: Look at this requirement in Wave 1: "For a given driver, calculate their total revenue for all trips. Each driver gets 80% of the trip cost after a fee of $1.65 is subtracted." Spend some time writing pseudocode for this.
The purpose of Wave 1 is to help you become familiar with the existing code, and to practice working with enumerables.
Currently our implementation saves the start and end time of each trip as a string. This is our first target for improvement. Instead of storing these values as strings, we will use Ruby's built-in Time
class. You should:
- Spend some time reading the docs for
Time
- you might be particularly interested inTime.parse
- Modify
TripDispatcher#load_trips
to store thestart_time
andend_time
asTime
instances - Add a check in
Trip#initialize
that raises anArgumentError
if the end time is before the start time, and a corresponding test - Add an instance method to the
Trip
class to calculate the duration of the trip in seconds, and a corresponding test
Hint: If you're hitting a NoMethodError
for Time.parse
, be aware that you need to require 'time'
in order for it to work. This is a weird quirk of how the library is designed.
Now that we have data for cost available for every trip, we can do some interesting data processing. Each of these should be implemented as an instance method on Driver
or Passenger
.
- Add an instance method to
Passenger
that will return the total amount of money that passenger has spent on their trips - Add an instance method to
Passenger
that will return the total amount of time that passenger has spent on their trips - Add an instance method to
Driver
to calculate that driver's total revenue across all their trips. Each driver gets 80% of the trip cost after a fee of $1.65 is subtracted. - Add an instance method to
Driver
to calculate that driver's average revenue per hour spent driving, using the above formula for revenue
All of these methods must have tests.
Check out the feedback template which lists the items instructors will be looking for as they evaluate your project.