CSC/ECE 517 Spring 2015/oss E1501 YWS: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 9: Line 9:
* Programs with complex conditional logic are hard to modify.<br>
* Programs with complex conditional logic are hard to modify.<br>


==Introduction to Expertiza==<br>
== Introduction to Expertiza ==<br>


[http://expertiza.ncsu.edu/ Expertiza] is an open source project developed using the [http://rubyonrails.org/ Ruby on Rails] platform. It provides features like team assignments, peer review, submission of projects, grading etc. The code can be cloned from [https://github.com/expertiza/expertiza GitHub]. This application provides an efficient way to manage assignments, grades and reviews, which makes the process easier and faster when the class strength is large.  
[http://expertiza.ncsu.edu/ Expertiza] is an open source project developed using the [http://rubyonrails.org/ Ruby on Rails] platform. It provides features like team assignments, peer review, submission of projects, grading etc. The code can be cloned from [https://github.com/expertiza/expertiza GitHub]. This application provides an efficient way to manage assignments, grades and reviews, which makes the process easier and faster when the class strength is large.  

Revision as of 19:01, 23 March 2015

E1501: Refactoring Assignments.rb

<ref>Refactoring</ref>Refactoring is a technique to alter the internal structure of the code without affecting the external behaviour. It is used for:

  • Programs that are hard to read are hard to modify;
  • Programs that have duplicate logic are hard to modify;
  • Programs that require additional behavior that requires you to change running code are hard to modify;
  • Programs with complex conditional logic are hard to modify.

== Introduction to Expertiza ==

Expertiza is an open source project developed using the Ruby on Rails platform. It provides features like team assignments, peer review, submission of projects, grading etc. The code can be cloned from GitHub. This application provides an efficient way to manage assignments, grades and reviews, which makes the process easier and faster when the class strength is large.

Assignment.rb is a file which contains the assignment model and the related functionality. It also contains the score module which is refactored to make the file more clean and easy to read.

Problem Statement

Classes involved:

assignment.rb
scorable.rb
Gemfile
schema.rb

What they do

Assignment.rb along with the controller file is responsible for creating and editing the assignments. The file also contains methods which calculates the student scores. The assignment and scoring modules are very tightly bound.

What needs to be done:

The assignment model needs refactoring as it contains some modules which are responsible for generating assignment scores. Moreover, the querying module was database dependent which was made database independent. There are many function names and code lines which does not follow the ruby guidelines. They were changed to more ruby like coding style.


Re-factored Instances

Instance 1 : Refactoring the Assignment.rb

Creation of separate model scorable.rb

There are many methods which are not directly related to assignments. These methods are responsible for generating the scores and related functions. These methods are:

1.get_scores

2.get_max_score_possible

3.compute_reviews_hash

4.get_average_score

All these methods are taken out of assignment.rb and pushed into a new file "scorable.rb". This made score generation a separate module and the dependency of scores on assignments have been reduced significantly.

Make assignment.rb more Ruby like

There were many instances where the coding style was not according to ruby guidelines. The code was refactored to be more ruby like. Changes such as removing the return statements, writing .each instead of for loop and improving naming conventions were implemented. Some of the changes are described below:

Before Change

 quiz_response_mappings.each do |qmapping|
   if qmapping.response
     quiz_responses << qmapping.response
   end
 end

After Change

 quiz_responses = quiz_response_mappings.select{ |qmapping| qmapping.response }.map(&:response)

Before Change

 total = 0
 self.questionnaires.each { |questionnaire| total += questionnaire.get_weighted_score(self, scores) }
 total

After Change

 self.questionnaires.inject(0) { |total, questionnaire| total + questionnaire.get_weighted_score(self, scores) }

Instance 2 : Addition of ActiveRecord like Query

The queries where changed to function more like active record query. This made the queries database independent and more user friendly.

Before Change

  DueDate.where( ['assignment_id = ? and deadline_type_id >= ?', self.id, 7]).due_at

After Change

  DueDate.where(assignment_id: self.id, deadline_type_id: 7).due_at

Instance 3 : Changing Gemfile

Version of gem "EventMachine" was updated as earlier version was incompatible with ruby version 2.2.0. The version was changed from 1.0.3 to 1.0.7.

One more gem "quite_assets" was added to avoid unnecessary log creation of background functions.


Steps to verify changes

See Also

  1. Expertiza on GitHub
  2. GitHub Project Repository Fork
  3. The live Expertiza website
  4. Expertiza project documentation wiki

References

Expertiza
Code Refactoring
Code smell