CSC/ECE 517 Fall 2013/oss E818 mra
E818 Refactoring and testing -- analytics
Problem statement:
Classes:
- analytic_controller.rb (163 lines)
- assignment_analytic.rb (206 lines)
- assignment_team_analytic.rb (126 lines)
- course_analytic.rb (142 lines)
- question_analytic.rb (12 lines)
- questionnaire_analytic.rb (55 lines)
- response_analytic.rb (101 lines)
- score_analytic.rb (12 lines)
What they do:
Display information about various system components in summary form, to aid in analysis.
What needs to be done:
At least analytic_controller.rb and course_analytic.rb have much duplicated code, which should be factored out. Additionally, analytic_controller.rb has methods that are too complicated, and should be separated into shorter, well-named methods, to make the operation of the class more transparent. Also, there are absolutely no tests for any of these methods.
Code changes
- At many places the developers had added the logic to find, map, get unique object, etc. which already exist in Enumerable module. We changed the code to use these in-built methods. Some of the examples of such changes are:
- self.questionnaire_unique? in assignment_analytic.rb
- questionnaire_of_type(type_name_in_string) in assignment_analytic.rb
- The code consisted of several functions with unnecessary complexity. We refactored the code to reduce the complexity.
- The code consisted of several functions that had duplicate code. These methods transformed a list of objects into a list of one of the object’s attributes. This pattern was removed by creating a generic function.
Following was one of the pattern that existed:
# Expertiza code before refactoring in assignment_analytic.rb def team_review_counts list = Array.new self.teams.each do |team| list << team.num_reviews end if (list.empty?) [0] else list end end
The refactored code for the above logic:
# Helper function moved to common_analytic.rb def extract_from_list(list, property) list.map { |item| item.send(property) } end # Method in assignment_analytic.rb def team_review_counts extract_from_list self.teams, :num_reviews (list.empty?) ? [0] : list end
The following is a list of methods and classes changed for refactoring:
- assignment_analytic.rb
- self.questionnaire_unique?
- questionnaire_of_type
- team_review_counts
- team_scores
- course_analytic.rb
- average_num_assignment_teams
- average_assignment_score
- assignment_review_counts
- assignment_team_counts
- assignment_average_scores
- assignment_max_scores
- assignment_min_scores
- assignment_team_analytic.rb
- average_review_word_count
- average_review_score
- average_review_character_count
- review_character_counts
- review_scores
- review_word_counts
- questionnaire_analytic.rb
- questions_text_list
- word_count_list
- character_count_list
- response_analytic.rb
- word_count_list
- character_count_list
- question_score_list
- comments_text_list
Future work
- Currently only bar charts can be seen. Further work can be done to get different kinds of graphs such as pie chart, scatter plot, etc.
- There are some requests that take a long time to respond. For example, View Scores Request. They can be optimized to reduce the response time.