CSC/ECE 517 Fall 2017/E1756 TLD Refactor response.rb: Difference between revisions
No edit summary |
No edit summary |
||
Line 3: | Line 3: | ||
Expertiza is a Ruby on Rails based Open Source project. It is a collaboration tool which lets users with different roles (student, instructor, teaching assistant) to collaborate on a course in an institution. A collaboration could be for an assignment where students teams up for an assignment and instructors grades them on the basis of their submission. Students could review other's works and give feedbacks as well. | Expertiza is a Ruby on Rails based Open Source project. It is a collaboration tool which lets users with different roles (student, instructor, teaching assistant) to collaborate on a course in an institution. A collaboration could be for an assignment where students teams up for an assignment and instructors grades them on the basis of their submission. Students could review other's works and give feedbacks as well. | ||
===Github link=== | |||
https://github.com/expertiza/expertiza | https://github.com/expertiza/expertiza | ||
===Wiki link=== | |||
http://wiki.expertiza.ncsu.edu/index.php/Expertiza_documentation | http://wiki.expertiza.ncsu.edu/index.php/Expertiza_documentation | ||
Line 13: | Line 13: | ||
== Problem Statement == | == Problem Statement == | ||
===Background=== | |||
response.rb is the default class to interact with the responses table, which stores all answers of each questionnaire. | response.rb is the default class to interact with the responses table, which stores all answers of each questionnaire. It is basically the alternate view. The contents get changed based on the user interaction with the application. Basically there are two important views, one for students and the other is for instructors. Based on the type of the user, the contents of the page get changed. | ||
'''What’s wrong with it?''' | '''What’s wrong with it?''' | ||
response.rb is a fairly complex file. It contains a lot of methods that are long and hard to understand. These methods need to be broken down into simpler and more specific methods that are easier to read/understand. Also, the few instances of code duplication that exist should be | response.rb is a fairly complex file. It contains a lot of methods that are long and hard to understand. These methods need to be broken down into simpler and more specific methods that are easier to read/understand. Also, the few instances of code duplication that exist should be removed. The previous project did not contain any test cases for the response.rb model. The response_spec.rb file did not contain any test cases except the mocks. | ||
===Problems=== | |||
====Problem 1==== | |||
'' | ''Refactor display_as_html method'' | ||
Write failing tests first | Write failing tests first | ||
Line 32: | Line 32: | ||
Extract duplicated code into separate methods | Extract duplicated code into separate methods | ||
'' | ====Problem 2==== | ||
''Refactor self.get_volume_of_review_comments method'' | |||
Write failing tests first | Write failing tests first | ||
Line 38: | Line 39: | ||
Convert duplicated code into loop | Convert duplicated code into loop | ||
'' | ====Problem 3==== | ||
''Rename method and change all other places it is used'' | |||
Write failing tests first | Write failing tests first | ||
Line 48: | Line 50: | ||
get_maximum_score → maximum_score | get_maximum_score → maximum_score | ||
'' | ====Problem 4==== | ||
''Use sort_by(&:seq) instead of sort { |a, b| a.seq <=> b.seq }'' | |||
Write failing tests first | Write failing tests first | ||
'' | ====Problem 5==== | ||
''Use find_by instead of where.first'' | |||
Write failing tests first | Write failing tests first | ||
====Problem 6==== | |||
''Complete the pending tests in grades_controller_spec.rb, and write integration tests for newly-created methods. Refactor corresponding methods, and only then finish pending tests.'' | |||
==Refactoring Decision== | |||
===Decision 1=== | |||
The display_as_html method has been modified. The logic which was there in the display_as_html method has been put in to two different methods called construct_instructor_html and construct_student_html files. One of these methods are called based on the value of the id. The logic of adding additional comment which was in the display_as_html method has been included in another method called construct_review_response and it is called from the display_as_html method. | |||
===Decision 2=== | |||
The get_volume_of_review_comments method has been modified by putting the repeated statements in to a loop which runs on variable i. The variable comments_in_round_i changes based on the value of the variable i. | |||
===Decision 3=== | |||
The methods get_total_score, get_average_score and get_maximum_score have been changed to total_score,average_score and maximum_score. The changes have been made in all the places wherever these methods are called. | |||
===Decision 4=== | |||
The method 'where' in significant_difference? method has been changed to find_by. | |||
===Decision 5=== | |||
The sort method which was in display_as_html method has been changed to sort_by. The sort_by method is present in construct_review_response refactored method. | |||
== Files Modified == | == Files Modified == | ||
===Problem 1=== | |||
''app/models/response.rb'' | ''app/models/response.rb'' | ||
===Problem 2=== | |||
''app/models/response.rb'' | ''app/models/response.rb'' | ||
===Problem 3=== | |||
''app/controllers/assessment360_controller.rb'' | ''app/controllers/assessment360_controller.rb'' | ||
Line 89: | Line 109: | ||
''spec/models/response_spec.rb'' | ''spec/models/response_spec.rb'' | ||
===Problem 4=== | |||
''app/models/response.rb'' | ''app/models/response.rb'' | ||
===Problem 5=== | |||
''app/models/response.rb'' | ''app/models/response.rb'' |
Revision as of 01:40, 1 November 2017
About Expertiza
Expertiza is a Ruby on Rails based Open Source project. It is a collaboration tool which lets users with different roles (student, instructor, teaching assistant) to collaborate on a course in an institution. A collaboration could be for an assignment where students teams up for an assignment and instructors grades them on the basis of their submission. Students could review other's works and give feedbacks as well.
Github link
https://github.com/expertiza/expertiza
Wiki link
http://wiki.expertiza.ncsu.edu/index.php/Expertiza_documentation
Problem Statement
Background
response.rb is the default class to interact with the responses table, which stores all answers of each questionnaire. It is basically the alternate view. The contents get changed based on the user interaction with the application. Basically there are two important views, one for students and the other is for instructors. Based on the type of the user, the contents of the page get changed.
What’s wrong with it?
response.rb is a fairly complex file. It contains a lot of methods that are long and hard to understand. These methods need to be broken down into simpler and more specific methods that are easier to read/understand. Also, the few instances of code duplication that exist should be removed. The previous project did not contain any test cases for the response.rb model. The response_spec.rb file did not contain any test cases except the mocks.
Problems
Problem 1
Refactor display_as_html method
Write failing tests first
Split into several simpler methods and assign reasonable names
Extract duplicated code into separate methods
Problem 2
Refactor self.get_volume_of_review_comments method
Write failing tests first
Convert duplicated code into loop
Problem 3
Rename method and change all other places it is used
Write failing tests first
get_total_score → total_score
get_average_score → average_score
get_maximum_score → maximum_score
Problem 4
Use sort_by(&:seq) instead of sort { |a, b| a.seq <=> b.seq }
Write failing tests first
Problem 5
Use find_by instead of where.first
Write failing tests first
Problem 6
Complete the pending tests in grades_controller_spec.rb, and write integration tests for newly-created methods. Refactor corresponding methods, and only then finish pending tests.
Refactoring Decision
Decision 1
The display_as_html method has been modified. The logic which was there in the display_as_html method has been put in to two different methods called construct_instructor_html and construct_student_html files. One of these methods are called based on the value of the id. The logic of adding additional comment which was in the display_as_html method has been included in another method called construct_review_response and it is called from the display_as_html method.
Decision 2
The get_volume_of_review_comments method has been modified by putting the repeated statements in to a loop which runs on variable i. The variable comments_in_round_i changes based on the value of the variable i.
Decision 3
The methods get_total_score, get_average_score and get_maximum_score have been changed to total_score,average_score and maximum_score. The changes have been made in all the places wherever these methods are called.
Decision 4
The method 'where' in significant_difference? method has been changed to find_by.
Decision 5
The sort method which was in display_as_html method has been changed to sort_by. The sort_by method is present in construct_review_response refactored method.
Files Modified
Problem 1
app/models/response.rb
Problem 2
app/models/response.rb
Problem 3
app/controllers/assessment360_controller.rb
app/controllers/popup_controller.rb
app/helpers/review_mapping_helper.rb
app/models/collusion_cycle.rb
spec/models/response_spec.rb
Problem 4
app/models/response.rb
Problem 5
app/models/response.rb
Issue and Solution
Problem 1:
The method display_as_html is complex. Many functions are embedded in to a single method.
Solution:
The method has been broken in to smaller and simpler parts and have been given the reasonable names
Problem 2:
The method has repeated lines of code.
Solution:
The loop has been included in the method instead of writing the same lines of code.
Problem 3:
Changing the method names
Solution:
The files that are modified are:
app/controllers/assessment360_controller.rb
app/controllers/popup_controller.rb
app/helpers/review_mapping_helper.rb
app/models/collusion_cycle.rb
spec/models/response_spec.rb
Problem 4:
Use sort_by(&:seq) instead of sort { |a, b| a.seq <=> b.seq }
Solution:
Problem 5:
Use find_by instead of where.first
Solution: