<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Amsonmal</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Amsonmal"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Amsonmal"/>
	<updated>2026-05-19T11:13:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81550</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81550"/>
		<updated>2013-10-30T23:16:52Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring performed on assignment_participant.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed on assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed on assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed on assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81548</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81548"/>
		<updated>2013-10-30T23:16:13Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment_participant.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed on assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed on assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed in assignment_team.rb ===o&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81547</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81547"/>
		<updated>2013-10-30T23:15:56Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Design Changes (Refactoring) Performed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed on assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed in assignment_team.rb ===o&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81546</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81546"/>
		<updated>2013-10-30T23:15:38Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment_team.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring performed in assignment_team.rb ===o&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81487</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81487"/>
		<updated>2013-10-30T22:48:53Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81486</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81486"/>
		<updated>2013-10-30T22:48:41Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81483</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81483"/>
		<updated>2013-10-30T22:48:15Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81479</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81479"/>
		<updated>2013-10-30T22:45:28Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
:1. &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81476</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81476"/>
		<updated>2013-10-30T22:44:36Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Future Work */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Adding more functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81468</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81468"/>
		<updated>2013-10-30T22:40:01Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
: 1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
: 2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
: 3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
: 4. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
: 5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81467</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81467"/>
		<updated>2013-10-30T22:39:11Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Common refactoring done in all three files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring performed on all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81462</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81462"/>
		<updated>2013-10-30T22:38:25Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment_participant.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81451</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81451"/>
		<updated>2013-10-30T22:28:51Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Future Work */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods.&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81450</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81450"/>
		<updated>2013-10-30T22:28:06Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Future Work */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
:2. Verifying whether the existing functional tests need revamping or improvement.&lt;br /&gt;
:3. Running tools like CodeClimate to identify hotspots, evaluate new approaches, and improve code quality.&lt;br /&gt;
:4. Adding more unit tests for better code coverage.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81440</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81440"/>
		<updated>2013-10-30T22:25:25Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing unit test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81439</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81439"/>
		<updated>2013-10-30T22:24:51Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81438</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81438"/>
		<updated>2013-10-30T22:24:34Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
All these three files were tested to ensure proper functioning of all test cases.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81436</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81436"/>
		<updated>2013-10-30T22:23:49Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
The files containing test cases related to the files we refactored are listed below:&lt;br /&gt;
&lt;br /&gt;
:1. assignment_test.rb&lt;br /&gt;
:2. assignment_participant_test.rb&lt;br /&gt;
:3. assignment_team_test&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81429</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81429"/>
		<updated>2013-10-30T22:20:15Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Common refactoring done in all files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all three files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81425</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81425"/>
		<updated>2013-10-30T22:19:03Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Introduction to Expertiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81422</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81422"/>
		<updated>2013-10-30T22:17:19Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link to E 819]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81421</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81421"/>
		<updated>2013-10-30T22:17:04Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps for setting up Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81419</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81419"/>
		<updated>2013-10-30T22:16:13Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [http://152.46.17.175:3000/ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81416</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=81416"/>
		<updated>2013-10-30T22:15:50Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Introduction to Expertiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza Wiki page on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80817</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80817"/>
		<updated>2013-10-30T16:59:18Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
  contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
  signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
  contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    if options['team_score'] == 'true'&lt;br /&gt;
      if team[:scores]&lt;br /&gt;
        tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['submitted_score']&lt;br /&gt;
      if pscore[:review]&lt;br /&gt;
        tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
        tcsv.push('---', '---', '---')&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if options['metareview_score']&lt;br /&gt;
      if pscore[:metareview]&lt;br /&gt;
        tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
      else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
  if options['author_feedback_score']&lt;br /&gt;
    if pscore[:feedback]&lt;br /&gt;
      tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if options['teammate_review_score']&lt;br /&gt;
    if pscore[:teammate]&lt;br /&gt;
      tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
    else&lt;br /&gt;
      tcsv.push('---', '---', '---')&lt;br /&gt;
    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
   tcsv.push(pscore[:total_score])&lt;br /&gt;
   csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
  team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
  for participant in team[:team].get_participants&lt;br /&gt;
    pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
    tcsv = Array.new&lt;br /&gt;
    tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
    team[:scores] ?&lt;br /&gt;
    tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
    pscore[:review] ?&lt;br /&gt;
    tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:metareview] ?&lt;br /&gt;
    tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:feedback] ?&lt;br /&gt;
    tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
    pscore[:teammate] ?&lt;br /&gt;
    tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
    tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
    tcsv.push(pscore[:total_score])&lt;br /&gt;
    csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
  if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
    true&lt;br /&gt;
  else	 	&lt;br /&gt;
   false&lt;br /&gt;
  end	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
  (self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
  if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
    review_num += 1&lt;br /&gt;
  else&lt;br /&gt;
    break&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80809</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80809"/>
		<updated>2013-10-30T16:53:38Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment_participant.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  if(self.directory_num)      &lt;br /&gt;
    files = get_files(self.get_path)&lt;br /&gt;
  end&lt;br /&gt;
  return files&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
  files = Array.new&lt;br /&gt;
  files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
  files&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80807</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80807"/>
		<updated>2013-10-30T16:53:10Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment_team.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each do |participant|&lt;br /&gt;
    return true if participant.has_submissions?&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80806</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80806"/>
		<updated>2013-10-30T16:52:29Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Common refactoring done in all files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements.&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80804</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80804"/>
		<updated>2013-10-30T16:52:19Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Common refactoring done in all files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else-end statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator.&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||.&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parentheses.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80800</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80800"/>
		<updated>2013-10-30T16:51:03Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80799</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80799"/>
		<updated>2013-10-30T16:50:33Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## reviewed_contributor?(contributor)&lt;br /&gt;
## get_hyperlinks&lt;br /&gt;
&lt;br /&gt;
## get_review_map_type&lt;br /&gt;
## self.handle_duplicate(team, name, assignment_id, handle_duplicates)&lt;br /&gt;
## self.import(row,session,assignment_id,options)&lt;br /&gt;
## get_participants&lt;br /&gt;
## add_participant&lt;br /&gt;
## get_scores(questions)&lt;br /&gt;
## self.get_team(participant)&lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## self.create_team_and_node(assignment_id)&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80784</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80784"/>
		<updated>2013-10-30T16:43:35Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_participant.rb &amp;lt;/b&amp;gt; &lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;b&amp;gt; assignment_team.rb &amp;lt;/b&amp;gt;&lt;br /&gt;
## &lt;br /&gt;
## &lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80782</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80782"/>
		<updated>2013-10-30T16:42:55Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
#assignment.rb&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# assignment_participant.rb&lt;br /&gt;
## includes?(participant)&lt;br /&gt;
## reviewed_by?(reviewer)&lt;br /&gt;
## has_submissions?&lt;br /&gt;
## get_reviewees&lt;br /&gt;
## get_reviewers&lt;br /&gt;
## get_cycle_similarity_score(cycle)&lt;br /&gt;
## get_cycle_deviation_score(cycle) &lt;br /&gt;
## copy(course_id)&lt;br /&gt;
## get_submitted_files&lt;br /&gt;
## get_wiki_submissions&lt;br /&gt;
## self.import(row,session,id)    &lt;br /&gt;
## self.get_export_fields(options)&lt;br /&gt;
## set_handle()&lt;br /&gt;
## set_student_directory_num&lt;br /&gt;
## get_topic_string&lt;br /&gt;
&lt;br /&gt;
#assignment_team.rb&lt;br /&gt;
## &lt;br /&gt;
## &lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80767</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80767"/>
		<updated>2013-10-30T16:31:20Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
#assignment.rb&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# assignment_participant.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
#assignment_team.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
:1. [http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
:2. [https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
:3. [http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
:4. [http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80766</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80766"/>
		<updated>2013-10-30T16:30:51Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
#assignment.rb&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# assignment_participant.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
#assignment_team.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:[1].[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:[2].[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:[3]. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:[4]. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:[5]. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80759</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80759"/>
		<updated>2013-10-30T16:10:35Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Introduction to Expertiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
#assignment.rb&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# assignment_participant.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
#assignment_team.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:4. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80637</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80637"/>
		<updated>2013-10-30T07:17:10Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
#assignment.rb&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## get_total_reviews_assigned_by_type(type)&lt;br /&gt;
## get_total_reviews_completed_by_type_and_date(type, date)&lt;br /&gt;
## compute_total_score(scores)&lt;br /&gt;
&lt;br /&gt;
# assignment_participant.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
#assignment_team.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:4. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80636</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80636"/>
		<updated>2013-10-30T07:13:36Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
#assignment.rb&lt;br /&gt;
## candidate_topics_to_review&lt;br /&gt;
## contributor_to_review(reviewer, topic)&lt;br /&gt;
## response_map_to_metareview(metareviewer)&lt;br /&gt;
## is_using_dynamic_reviewer_assignment?&lt;br /&gt;
## get_contributor(contrib_id)&lt;br /&gt;
## get_path&lt;br /&gt;
## check_condition(column, topic_id = nil)&lt;br /&gt;
## submission_allowed(topic_id = nil)&lt;br /&gt;
## review_allowed(topic_id = nil)&lt;br /&gt;
## metareview_allowed(topic_id=nil)&lt;br /&gt;
## email(author_id)&lt;br /&gt;
## get_review_number(mapping)&lt;br /&gt;
## is_wiki_assignment&lt;br /&gt;
## is_microtask?&lt;br /&gt;
## create_node&lt;br /&gt;
## get_current_stage(topic_id = nil)&lt;br /&gt;
## get_stage_deadline(topic_id = nil)&lt;br /&gt;
## get_review_rounds&lt;br /&gt;
## get_review_questionnaire_id&lt;br /&gt;
## get_next_due_date&lt;br /&gt;
## find_next_stage()&lt;br /&gt;
## &lt;br /&gt;
&lt;br /&gt;
# assignment_participant.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
#assignment_team.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:4. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80633</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80633"/>
		<updated>2013-10-30T07:00:49Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* List of classes and corresponding methods refactored */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
#assignment.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
# assignment_participant.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
#assignment_team.rb&lt;br /&gt;
##&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:4. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80632</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80632"/>
		<updated>2013-10-30T06:59:09Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Design Changes (Refactoring) Performed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==List of classes and corresponding methods refactored==&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:4. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80631</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80631"/>
		<updated>2013-10-30T06:56:56Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
:1.[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
:2.[http://www.refactoringinruby.info/ Refactoring in Ruby] &lt;br /&gt;
&lt;br /&gt;
:3. [https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;br /&gt;
&lt;br /&gt;
:4. [ VCL Link]&lt;br /&gt;
&lt;br /&gt;
:5. [https://docs.google.com/a/ncsu.edu/document/d/1Z0xjFZu-Zy-xm73YyUVUgFCtfWgRwhN1rZuThoyF-U0/edit Steps to setup Expertiza]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80630</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80630"/>
		<updated>2013-10-30T06:49:27Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
[http://www.refactoringinruby.info/ Refactoring in Ruby]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/okdalvi/Expertiza-E819 Expertiza Repo]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80629</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80629"/>
		<updated>2013-10-30T06:45:30Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* External Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;br /&gt;
&lt;br /&gt;
[http://www.refactoringinruby.info/ Refactoring in Ruby]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80628</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80628"/>
		<updated>2013-10-30T06:44:25Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
[http://ghendry.net/refactor.html Refactoring Notes]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80626</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80626"/>
		<updated>2013-10-30T06:43:49Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
[http://refactoring.com/ refactoring.com]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80625</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80625"/>
		<updated>2013-10-30T06:42:37Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80624</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80624"/>
		<updated>2013-10-30T06:42:02Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Design Changes (Refactoring) Performed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80623</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80623"/>
		<updated>2013-10-30T06:39:54Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Describe all refactorings done in detail along with code snippets.&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80622</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80622"/>
		<updated>2013-10-30T06:39:19Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment_team.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Describe all refactorings done in detail along with code snippets.&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring done on method has_submissions? &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80621</id>
		<title>CSC/ECE 517 Fall 2013/oss aoa</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2013/oss_aoa&amp;diff=80621"/>
		<updated>2013-10-30T06:38:59Z</updated>

		<summary type="html">&lt;p&gt;Amsonmal: /* Refactoring done in assignment_participant.rb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Project E 819 - Refactoring and Testing - Assignment ==&lt;br /&gt;
This Wiki page provides a detailed description of the Open Source Software project conducted on Expertiza, as part of the Object Oriented Languages and Systems coursework.&lt;br /&gt;
&lt;br /&gt;
== Introduction to Expertiza==&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]is an open source project built using the Ruby on Rails platform. It is a web application where students can submit and peer-review learning objects (articles, code, web sites, etc). It is used in select courses at NC State and by professors at several other colleges and universities to manage peer reviews in coursework. The source code can be forked from [https://github.com/expertiza/expertiza github] and cloned for performing modifications. The Expertiza environment is already set up in NC State's VCL image &amp;quot;Ruby on Rails&amp;quot;. If you have access, this is quickest way to get a development environment running for Expertiza. See the Expertiza wiki(provide hyperlink) on developing Expertiza on the VCL.&lt;br /&gt;
&lt;br /&gt;
== Overview of project ==&lt;br /&gt;
The main objective of the project was to refactor three Ruby files:&lt;br /&gt;
:• assignment.rb (925 lines)&lt;br /&gt;
:• assignment_participant.rb (385 lines)&lt;br /&gt;
:• assignment_team.rb (254 lines)&lt;br /&gt;
&lt;br /&gt;
These three files are responsible for creation and management of assignments in Expertiza. They perform operations relating to a user participating in an assignment. AssignmentParticipant is a subclass of class Participant. CourseParticipant is Participant’s only other subclass. If a course has CourseParticipants, then an assignment can take its participants from the CourseParticipants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Project Requirements ==&lt;br /&gt;
&lt;br /&gt;
:1. Do methods 'get_percentage_reviews_completed' and 'get_total_reviews_completed_by_type_and_date' belong to this class? The assignment.rb file should only contain those methods that pertain to the creation and maintenance of assignments in Expertiza.&lt;br /&gt;
&lt;br /&gt;
:2. The self.export method contains a lot of statements that have been repeated. Refactor this method to avoid duplication.&lt;br /&gt;
&lt;br /&gt;
:3. Look for other methods in the assignment.rb file that shouldn't belong to this file but to some other model/controller.&lt;br /&gt;
&lt;br /&gt;
:4. The 'get_scores' method in the 'assignment', 'assignment_participant' and 'assignment_team' files contain lines of code that appear to be repeated. Can this be refactored so that only one method implements the common functionality?&lt;br /&gt;
&lt;br /&gt;
:5. Refactor 'get_hyperlinks' to replace the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:6. Refactor the 'get_reviews' method by replacing the conditional statement with polymorphism.&lt;br /&gt;
&lt;br /&gt;
:7. Look for any unused methods or variables in these files.&lt;br /&gt;
&lt;br /&gt;
:8. Also apply other refactorings such as Rename variable, Rename method to give the variables and methods more meaningful names.&lt;br /&gt;
&lt;br /&gt;
==Design Changes (Refactoring) Performed ==&lt;br /&gt;
&lt;br /&gt;
Describe all refactorings done in detail along with code snippets.&lt;br /&gt;
&lt;br /&gt;
Following are the code snippets of all the files that have been refactored as part of the project:&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment.rb===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt;function candidate_topics_to_review &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before Refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! { |contributor| signed_up_topic(contributor).nil? or !contributor.has_submissions? }&lt;br /&gt;
&lt;br /&gt;
# Reject contributions of topics whose deadline has passed&lt;br /&gt;
contributor_set.reject! { |contributor| contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' or&lt;br /&gt;
                                            contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission' }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging reject statements)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.reject! do |contributor|&lt;br /&gt;
      signed_up_topic(contributor).nil? || !contributor.has_submissions? ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'Complete' ||&lt;br /&gt;
          contributor.assignment.get_current_stage(signed_up_topic(contributor).id) == 'submission'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Refactoring of self.export method &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        if options['team_score'] == 'true'&lt;br /&gt;
          if team[:scores]&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname)&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['submitted_score']&lt;br /&gt;
          if pscore[:review]&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['metareview_score']&lt;br /&gt;
          if pscore[:metareview]&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['author_feedback_score']&lt;br /&gt;
          if pscore[:feedback]&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if options['teammate_review_score']&lt;br /&gt;
          if pscore[:teammate]&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg])&lt;br /&gt;
          else&lt;br /&gt;
            tcsv.push('---', '---', '---')&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Code after refactoring (merging the if-else statements and replacing them with ternary operator):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for index in 0 .. @scores[:teams].length - 1&lt;br /&gt;
      team = @scores[:teams][index.to_s.to_sym]&lt;br /&gt;
      for participant in team[:team].get_participants&lt;br /&gt;
        pscore = @scores[:participants][participant.id.to_s.to_sym]&lt;br /&gt;
        tcsv = Array.new&lt;br /&gt;
        tcsv &amp;lt;&amp;lt; 'team'+index.to_s&lt;br /&gt;
&lt;br /&gt;
        team[:scores] ?&lt;br /&gt;
            tcsv.push(team[:scores][:max], team[:scores][:avg], team[:scores][:min], participant.fullname) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['team_score'] == 'true'&lt;br /&gt;
&lt;br /&gt;
        pscore[:review] ?&lt;br /&gt;
            tcsv.push(pscore[:review][:scores][:max], pscore[:review][:scores][:min], pscore[:review][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['submitted_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:metareview] ?&lt;br /&gt;
            tcsv.push(pscore[:metareview][:scores][:max], pscore[:metareview][:scores][:min], pscore[:metareview][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['metareview_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:feedback] ?&lt;br /&gt;
            tcsv.push(pscore[:feedback][:scores][:max], pscore[:feedback][:scores][:min], pscore[:feedback][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['author_feedback_score']&lt;br /&gt;
&lt;br /&gt;
        pscore[:teammate] ?&lt;br /&gt;
            tcsv.push(pscore[:teammate][:scores][:max], pscore[:teammate][:scores][:min], pscore[:teammate][:scores][:avg]) :&lt;br /&gt;
            tcsv.push('---', '---', '---') if options['teammate_review_score']&lt;br /&gt;
&lt;br /&gt;
        tcsv.push(pscore[:total_score])&lt;br /&gt;
        csv &amp;lt;&amp;lt; tcsv&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:3. &amp;lt;b&amp;gt; Replaced all occurrences of if statements with one-line if statements &amp;lt;/b&amp;gt;&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if min_reviews &amp;gt; 0 &lt;br /&gt;
  contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id }	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
contributor_set.sort! { |a, b| a.review_mappings.last.id &amp;lt;=&amp;gt; b.review_mappings.last.id } if min_reviews &amp;gt; 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:4. &amp;lt;b&amp;gt; Replaced all occurrences of if-else-end with ternary operator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def is_using_dynamic_reviewer_assignment?&lt;br /&gt;
if self.review_assignment_strategy == RS_AUTO_SELECTED or self.review_assignment_strategy == RS_STUDENT_SELECTED&lt;br /&gt;
  true&lt;br /&gt;
else	 	&lt;br /&gt;
 false	 	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def dynamic_reviewer_assignment?&lt;br /&gt;
(self.review_assignment_strategy == RS_AUTO_SELECTED || self.review_assignment_strategy == RS_STUDENT_SELECTED) ? true : false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. &amp;lt;b&amp;gt; Replaced all occurrences of for loops with an each iterator &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for rm in reviewer_mappings&lt;br /&gt;
if rm.reviewee.id != mapping.reviewee.id&lt;br /&gt;
  review_num += 1&lt;br /&gt;
else&lt;br /&gt;
  break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reviewer_mappings.each do |rm|&lt;br /&gt;
  (rm.reviewee.id != mapping.reviewee.id) ? review_num += 1 : break&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:6. &amp;lt;b&amp;gt; Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and || &amp;lt;b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? and topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? and topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
raise 'Please select a topic' if has_topics? &amp;amp;&amp;amp; topic.nil?&lt;br /&gt;
raise 'This assignment does not have topics' if !has_topics? &amp;amp;&amp;amp; topic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_participant.rb ===&lt;br /&gt;
&lt;br /&gt;
:1. &amp;lt;b&amp;gt; Refactoring of get_hyperlinks method &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_hyperlinks&lt;br /&gt;
  team.try :get_hyperlinks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def get_hyperlinks_array&lt;br /&gt;
  self.submitted_hyperlinks.nil? ? [] : YAML::load(self.submitted_hyperlinks)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:2. &amp;lt;b&amp;gt; Discarded all unnecessary return statements at the end of functions and eliminated parantheses &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files()&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    if(self.directory_num)      &lt;br /&gt;
      files = get_files(self.get_path)&lt;br /&gt;
    end&lt;br /&gt;
    return files&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code after refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def get_submitted_files&lt;br /&gt;
    files = Array.new&lt;br /&gt;
    files = get_files(self.get_path) if self.directory_num&lt;br /&gt;
    files&lt;br /&gt;
  end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Refactoring done in assignment_team.rb ===&lt;br /&gt;
:1. Refactoring done on method has_submissions?&lt;br /&gt;
&lt;br /&gt;
Before refactoring:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
    participants.each do |participant|&lt;br /&gt;
      return true if participant.has_submissions?&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After refactoring (Replacing do block with single line {} block and discarding return statement):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def has_submissions?&lt;br /&gt;
  participants.each { |participant| return true if participant.has_submissions? }&lt;br /&gt;
  false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Common refactoring done in all files===&lt;br /&gt;
&lt;br /&gt;
:1. Merged all if-else statements and replaced them with ternary operator.&lt;br /&gt;
:2. Replaced all occurrences of if statements with one-line if statements&lt;br /&gt;
:3. Replaced all occurrences of for loops with an each iterator&lt;br /&gt;
:4. Replaced all occurrences of &amp;quot;AND&amp;quot; and &amp;quot;OR&amp;quot; with logical &amp;amp;&amp;amp; and ||&lt;br /&gt;
:5. Discarded all unnecessary return statements at the end of functions and eliminated parantheses&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
The following tasks can be performed as future work in this project:&lt;br /&gt;
:1. Functional tests for newly added methods&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://guides.rubyonrails.org/ Rails Guide]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/bbatsov/ruby-style-guide Ruby Style Guide]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
[http://rubymonk.com/learning/books/4-ruby-primer-ascent RubyMonk]&lt;/div&gt;</summary>
		<author><name>Amsonmal</name></author>
	</entry>
</feed>