CSC/ECE 517 Fall 2013/oss E818 mra: Difference between revisions
No edit summary |
|||
Line 19: | Line 19: | ||
# 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: | # 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: | ||
Code before refactor | |||
<pre> | |||
def self.questionnaire_unique? | |||
self.all.each do |assignment| | |||
assignment.questionnaire_types.each do |questionnaire_type| | |||
questionnaire_list = Array.new | |||
assignment.questionnaires.each do |questionnaire| | |||
if questionnaire.type == questionnaire_type | |||
questionnaire_list << questionnaire | |||
end | |||
if questionnaire_list.count > 1 | |||
return false | |||
end | |||
end | |||
end | |||
end | |||
return true | |||
end | |||
</pre> | |||
Code after refactoring. Here the inbuilt uniq method was used. If there are duplicates, then unique array length will be less than actual length. | |||
<pre> | |||
def self.questionnaire_unique? | |||
self.all.each do |assignment| | |||
questionnaires = assignment.questionnaires | |||
return false if questionnaires.uniq { |q| q.type }.length < questionnaires.length | |||
end | |||
return true | |||
end | |||
</pre> | |||
##self.questionnaire_unique? in assignment_analytic.rb | ##self.questionnaire_unique? in assignment_analytic.rb | ||
##questionnaire_of_type(type_name_in_string) in assignment_analytic.rb | ##questionnaire_of_type(type_name_in_string) in assignment_analytic.rb |
Revision as of 16:39, 30 October 2013
Topic and short description (E818 Refactoring and testing -- analytics)
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:
Code before refactor
def self.questionnaire_unique? self.all.each do |assignment| assignment.questionnaire_types.each do |questionnaire_type| questionnaire_list = Array.new assignment.questionnaires.each do |questionnaire| if questionnaire.type == questionnaire_type questionnaire_list << questionnaire end if questionnaire_list.count > 1 return false end end end end return true end
Code after refactoring. Here the inbuilt uniq method was used. If there are duplicates, then unique array length will be less than actual length.
def self.questionnaire_unique? self.all.each do |assignment| questionnaires = assignment.questionnaires return false if questionnaires.uniq { |q| q.type }.length < questionnaires.length end return true end
- 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.