<?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=Atripat5</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=Atripat5"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Atripat5"/>
	<updated>2026-05-23T11:56:52Z</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_2014&amp;diff=91765</id>
		<title>CSC/ECE 517 Fall 2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014&amp;diff=91765"/>
		<updated>2014-11-11T22:35:53Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[CSC/ECE_517_Fall_2014/sample_page]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 22 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 19 mx]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 3 zq]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 4 lf]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 4 wl]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a a7 ch]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 rs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 jf]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 8 os]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 8 sn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 15 gs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 10 hu]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 20 kv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 21 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 24 sa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 26 sn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 6 rl]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 2 ss]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 16 av]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 1 rm]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 1 sj]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 23 ss]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 20 rn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 22 sp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss M1454 rss]]&lt;br /&gt;
&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 26 gn]]&lt;br /&gt;
&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 13 va]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 9 aa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 9 kn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 11 ap]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 ks]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 7 kz]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a_6_bn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 10 zz]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 16 va]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a F1415 rv]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a_3_cp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1b 26 sa]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_28_cg]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b 29 ry]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b 30 cs]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_33_jy]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_27_js]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1453 syy]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1463 vpd]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1465 oak]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_M1456_kdv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_M1453_sst]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_E1456_akk]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_M1455_asa]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1458_sst]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1457_ags]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1466_gjf]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_M1452_jns]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1462_nms]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_S1455_ajp]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_S1454_ccc]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1450_cxm]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1455_skn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_M1450_vda]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1467_rsv]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1464_vnn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/OSS_M1451_ahs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/OSS_E1451_las]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/OSS_E1461_knn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1460_aua]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1459_jjr]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/final_E1472_gjfz]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/final_design_doc_M1451_hsss]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/final_E1471_asuv]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/final_E1475_nrnn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/final_design_doc_M1450_navr]]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014&amp;diff=91608</id>
		<title>CSC/ECE 517 Fall 2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014&amp;diff=91608"/>
		<updated>2014-11-10T22:45:23Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[CSC/ECE_517_Fall_2014/sample_page]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 22 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 19 mx]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 3 zq]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 4 lf]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 4 wl]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a a7 ch]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 rs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 jf]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 8 os]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 8 sn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 15 gs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 10 hu]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 20 kv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 21 as]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 24 sa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 26 sn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 6 rl]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 2 ss]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 16 av]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 1 rm]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 1 sj]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 23 ss]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 20 rn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 22 sp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss M1454 rss]]&lt;br /&gt;
&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 26 gn]]&lt;br /&gt;
&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 13 va]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 9 aa]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 9 kn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 11 ap]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 25 ks]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1a 7 kz]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a_6_bn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 10 zz]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a 16 va]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a F1415 rv]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1a_3_cp]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/ch1b 26 sa]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_28_cg]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b 29 ry]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b 30 cs]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_33_jy]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/ch1b_27_js]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1453 syy]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1463 vpd]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss E1465 oak]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_M1456_kdv]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_M1453_sst]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/oss_E1456_akk]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_M1455_asa]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1458_sst]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1457_ags]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1466_gjf]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_M1452_jns]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1462_nms]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_S1455_ajp]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_S1454_ccc]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1450_cxm]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1455_skn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_M1450_vda]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1467_rsv]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/OSS_E1464_vnn]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/OSS_M1451_ahs]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/OSS_E1451_las]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2014/OSS_E1461_knn]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1460_aua]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/oss_E1459_jjr]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2014/final_E1474_akkn]]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91285</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91285"/>
		<updated>2014-10-30T03:33:12Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Running Project &amp;amp; Testing Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Running Project &amp;amp; Testing Functionality=&lt;br /&gt;
We tested the functionality of the questionnaires controller before and after refactoring by manually creating and listing the questionnaires, there is no change in behavior observed. Please find the snapshots below for reference.&lt;br /&gt;
After Refactoring, the questionnaire controller is working as before.&lt;br /&gt;
[[File:rsz_questionnaires_index1.jpg|100px|frame|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:rsz_questionnaires_review.jpg|frame|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:rsz_questionnaires_teammate_review.jpg|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91284</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91284"/>
		<updated>2014-10-30T03:32:56Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Testing Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Running Project &amp;amp; Testing Functionality=&lt;br /&gt;
We tested the functionality of the questionnaires controller before and after refactoring by manually creating and listing the questionnaires, there is no change in behavior observed. Please find the snapshots below for reference.&lt;br /&gt;
After Refactoring, the questionnaire controller is working as before.&lt;br /&gt;
[[File:rsz_questionnaires_index1.jpg|100px|frame|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:rsz_questionnaires_review.jpg|frame|center]]&lt;br /&gt;
&lt;br /&gt;
[[File:rsz_questionnaires_teammate_review.jpg|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91283</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91283"/>
		<updated>2014-10-30T03:31:53Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Testing Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Testing Functionality=&lt;br /&gt;
We tested the functionality of the questionnaires controller before and after refactoring by manually creating and listing the questionnaires, there is no change in behavior observed. Please find the snapshots below for reference.&lt;br /&gt;
After Refactoring, the questionnaire controller is working as before.&lt;br /&gt;
[[File:rsz_questionnaires_index1.jpg|100px|frame|center]]&lt;br /&gt;
[[File:rsz_questionnaires_review.jpg|frame|center]]&lt;br /&gt;
[[File:rsz_questionnaires_teammate_review.jpg|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91281</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91281"/>
		<updated>2014-10-30T03:29:59Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Testing Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Testing Functionality=&lt;br /&gt;
We tested the functionality of the questionnaires controller before and after refactoring by manually creating and listing the questionnaires, there is no change in behavior observed. Please find the snapshots below for reference.&lt;br /&gt;
After Refactoring, the questionnaire controller is working as before.&lt;br /&gt;
[[File:questionnaires_index.JPG|100px|frame|left]]&lt;br /&gt;
[[File:questionnaires_review.JPG|frame|left]]&lt;br /&gt;
[[File:questionnaires_teammate_review.JPG|frame|left]]&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91277</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91277"/>
		<updated>2014-10-30T03:28:57Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Testing Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Testing Functionality=&lt;br /&gt;
We tested the functionality of the questionnaires controller before and after refactoring by manually creating and listing the questionnaires, there is no change in behavior observed. Please find the snapshots below for reference.&lt;br /&gt;
After Refactoring, the questionnaire controller is working as before.&lt;br /&gt;
[[File:questionnaires_index1.JPG|100px|frame|left]]&lt;br /&gt;
[[File:questionnaires_review.JPG|frame|left]]&lt;br /&gt;
[[File:questionnaires_teammate_review.JPG|frame|left]]&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91276</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=91276"/>
		<updated>2014-10-30T03:28:22Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Testing Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Testing Functionality=&lt;br /&gt;
We tested the functionality of the questionnaires controller before and after refactoring by manually creating and listing the questionnaires, there is no change in behavior observed. Please find the snapshots below for reference.&lt;br /&gt;
After Refactoring, the questionnaire controller is working as before.&lt;br /&gt;
[[File:rsz_questionnaires_index1.JPG|100px|frame|left]]&lt;br /&gt;
[[File:rsz_questionnaires_review.JPG|frame|left]]&lt;br /&gt;
[[File:rsz_questionnaires_teammate_review.JPG|frame|left]]&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires_teammate_review.jpg&amp;diff=91274</id>
		<title>File:Rsz questionnaires teammate review.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires_teammate_review.jpg&amp;diff=91274"/>
		<updated>2014-10-30T03:27:07Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires_review.jpg&amp;diff=91273</id>
		<title>File:Rsz questionnaires review.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires_review.jpg&amp;diff=91273"/>
		<updated>2014-10-30T03:26:53Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires_index1.jpg&amp;diff=91272</id>
		<title>File:Rsz questionnaires index1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Rsz_questionnaires_index1.jpg&amp;diff=91272"/>
		<updated>2014-10-30T03:26:36Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90999</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90999"/>
		<updated>2014-10-29T23:53:22Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Code Snippets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90996</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90996"/>
		<updated>2014-10-29T23:52:23Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Code Snippets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
The scope of the project is to refactor Questionnaire Controller which is very huge, in order to follow the standard principle of Fat Models and slim controllers.&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Refactoring questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 2 '''''&lt;br /&gt;
|edit&lt;br /&gt;
|Three functions changed in this method&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 3 '''''&lt;br /&gt;
|create_questionnaire&lt;br /&gt;
|Removal of redundant If statement&lt;br /&gt;
|Removal of unnecessary statements&lt;br /&gt;
|-&lt;br /&gt;
|''''' 4 '''''&lt;br /&gt;
|create_questionnaire &lt;br /&gt;
|Commenting out unnecessary print statements&lt;br /&gt;
|Refactoring of the function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 5 '''''&lt;br /&gt;
|create&lt;br /&gt;
|statement change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 6 '''''&lt;br /&gt;
|update&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules &lt;br /&gt;
|-&lt;br /&gt;
|''''' 7 '''''&lt;br /&gt;
|toggle_access&lt;br /&gt;
|change from redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list' to redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 8 '''''&lt;br /&gt;
|save&lt;br /&gt;
|change from QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id) to QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 9 '''''&lt;br /&gt;
|save_new_questions(questionnaire_id)&lt;br /&gt;
|change from a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil) to a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 10 '''''&lt;br /&gt;
|save_questions(questionnaire_id)&lt;br /&gt;
|Deletion of an extra If statement and deletion of an unnecessary print statement&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|''''' 11 '''''&lt;br /&gt;
|save_choices(questionnaire_id)&lt;br /&gt;
|Removal of unnecessary print statements and refactoring of the function&lt;br /&gt;
|Refactoring done following Global rules and use of DRY principle&lt;br /&gt;
|-&lt;br /&gt;
|''''' 12 '''''&lt;br /&gt;
|export&lt;br /&gt;
|Refactoring done for 2 statements&lt;br /&gt;
|Refactoring done using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|''''' 13 '''''&lt;br /&gt;
|clone_questionnaire_details(questions)&lt;br /&gt;
|Refactoring of 4 statements done in this function&lt;br /&gt;
|Refactoring was required for this function&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. &amp;lt;b&amp;gt;The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;b&amp;gt;Non Restful method names changed accordingly to make them Restful.&amp;lt;/b&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Before&amp;lt;b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def select_questionnaire_type&lt;br /&gt;
    @questionnaire = Object.const_get(params[:questionnaire][:type]).new(params[:questionnaire])&lt;br /&gt;
    @questionnaire.private = params[:questionnaire][:private]&lt;br /&gt;
    @questionnaire.min_question_score = params[:questionnaire][:min_question_score]&lt;br /&gt;
    @questionnaire.max_question_score = params[:questionnaire][:max_question_score]&lt;br /&gt;
    @questionnaire.section = params[:questionnaire][:section]&lt;br /&gt;
    @questionnaire.id = params[:questionnaire][:id]&lt;br /&gt;
    @questionnaire.display_type = params[:questionnaire][:display_type]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After&amp;lt;/b&amp;gt; &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;b&amp;gt;edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;b&amp;gt;save_advice has been moved to the advice_controller. &amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;b&amp;gt;Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Extra print statement and deletion of an extra statement&amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global rules + Function name change + statement deletion&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;b&amp;gt;&amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;b&amp;gt;Removed duplicate and redundant code making the code DRY.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring  Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Redundant If in def create_questionnaire&amp;lt;/b&amp;gt; :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. &amp;lt;b&amp;gt;Removed unnecessary debug prints present in the code.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring  Un-necessary Print statements in def create_questionnaire &amp;lt;/b&amp;gt;:-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. &amp;lt;b&amp;gt;Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After refactoring Global rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. &amp;lt;b&amp;gt;More global rule changes.&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Before Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;After Refactoring Global Rules &amp;lt;/b&amp;gt;:-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90982</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90982"/>
		<updated>2014-10-29T23:37:10Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Removed duplicate and redundant code making the code DRY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. Removed unnecessary debug prints present in the code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. More global rule changes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90981</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90981"/>
		<updated>2014-10-29T23:36:57Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&amp;lt;bR&amp;gt;&lt;br /&gt;
&amp;lt;B&amp;gt;&amp;lt;U&amp;gt;Why is Refactoring Required&amp;lt;/u&amp;gt;&amp;lt;/B&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Removed duplicate and redundant code making the code DRY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. Removed unnecessary debug prints present in the code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. More global rule changes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90980</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90980"/>
		<updated>2014-10-29T23:36:23Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Why is Refactoring Required */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''E1456 Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
[https://docs.google.com/document/d/1FZCL9KWSdVNsX9BowuZ3gxbCOJoiWX-GVLctSZei3No/edit# Problem_Statement] &amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit# Global Rules]&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Removed duplicate and redundant code making the code DRY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
8. Removed unnecessary debug prints present in the code.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Used `&amp;amp;&amp;amp;` and `||` rather than `and` and `or` to keep boolean precedence as per global rules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. More global rule changes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90974</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90974"/>
		<updated>2014-10-29T23:31:00Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Object Oriented Design Principles Followed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Removed duplicate and redundant code making the code DRY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;Single Responsibility Principle&amp;lt;/b&amp;gt;: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*&amp;lt;b&amp;gt;DRY Principle&amp;lt;/b&amp;gt;: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90972</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90972"/>
		<updated>2014-10-29T23:26:29Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Object Oriented Design Principles Followed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Removed duplicate and redundant code making the code DRY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*Single Responsibility Principle: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
*DRY Principle: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90971</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90971"/>
		<updated>2014-10-29T23:26:18Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Object Oriented Design Principles Followed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Removed duplicate and redundant code making the code DRY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*Single Responsibility Principle: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*DRY Principle: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90970</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90970"/>
		<updated>2014-10-29T23:25:53Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Object Oriented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair implemented [Use key: ‘value’, not :key =&amp;gt; ‘value’] accordingly.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;quot;.eql? nil&amp;quot; used instead of &amp;quot; == nil&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Removed duplicate and redundant code making the code DRY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Object Oriented Design Principles Followed=&lt;br /&gt;
&lt;br /&gt;
The following object oriented design principles were followed during refactoring: &amp;lt;br&amp;gt;&lt;br /&gt;
*Single Responsibility Principle: The single responsibility principle states that every context (class, function, variable, etc.) should have a single responsibility. It was maintained that each method should be involved with a single responsibility and the code that was not related to that particular functionality was moved to other method. This was also taken care of in terms of classes.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
DRY Principle: Don't Repeat Yourself! The repetitive and redundant code was removed from the associated classes and methods&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90964</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90964"/>
		<updated>2014-10-29T23:19:04Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller.&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90963</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90963"/>
		<updated>2014-10-29T23:18:46Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|delete&lt;br /&gt;
|redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display' to redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
|Refactoring using Global rules&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. edit_advice method is evidently not used, and removed. This edit function is already implemented in advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
4. save_advice has been moved to the advice_controller.&lt;br /&gt;
&lt;br /&gt;
5. Global rule changes for using Hash - value key pair&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
.........&lt;br /&gt;
a = QuestionAdvice.new(:score =&amp;gt; i, :advice =&amp;gt; nil)&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save_new_questions(questionnaire_id)&lt;br /&gt;
........&lt;br /&gt;
a = QuestionAdvice.new(score: i, advice: nil)&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key,:weight =&amp;gt; 1, :txt =&amp;gt; params[:question][question_key][:txt] )&lt;br /&gt;
            else&lt;br /&gt;
              Question.update(question_key, params[:question][question_key])&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Extra print statement and deletion of an extra statement:-&lt;br /&gt;
def save_questions(questionnaire_id)&lt;br /&gt;
...........&lt;br /&gt;
# print question_key&lt;br /&gt;
..........&lt;br /&gt;
if (@questionnaire.type == &amp;quot;QuizQuestionnaire&amp;quot;)&lt;br /&gt;
              Question.update(question_key, weight: 1, txt: params[:question][question_key][:txt] )&lt;br /&gt;
            end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] and params[:new_choices]&lt;br /&gt;
...........&lt;br /&gt;
print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;True&amp;quot;, :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; &amp;quot;False&amp;quot;, :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;true&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(:txt =&amp;gt; params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], :iscorrect =&amp;gt; &amp;quot;false&amp;quot;,:question_id =&amp;gt; question.id)&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global Rules :-&lt;br /&gt;
def save_choices(questionnaire_id)&lt;br /&gt;
..........&lt;br /&gt;
if params[:new_question] &amp;amp;&amp;amp; params[:new_choices]&lt;br /&gt;
..........&lt;br /&gt;
# print &amp;quot;=====choice_key=&amp;quot;+choice_key+&amp;quot;=======&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;True&amp;quot;, iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
..........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: &amp;quot;False&amp;quot;, iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;true&amp;quot;, question_id: question.id)&lt;br /&gt;
.........&lt;br /&gt;
q = QuizQuestionChoice.new(txt: params[:new_choices][questionnum.to_s][q_type][choice_key][:txt], iscorrect: &amp;quot;false&amp;quot;, question_id: question.id)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
:type =&amp;gt; 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
 :disposition =&amp;gt; &amp;quot;attachment; filename=questionnaires.csv&amp;quot;&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def export&lt;br /&gt;
.........&lt;br /&gt;
type: 'text/csv; charset=iso-8859-1; header=present',&lt;br /&gt;
disposition: &amp;quot;attachment; filename=questionnaires.csv&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire_details(questions)&lt;br /&gt;
.........&lt;br /&gt;
@questionnaire.name = 'Copy of '+orig_questionnaire.name&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'questionnaire', :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire.id&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules + Function name change + statement deletion :-&lt;br /&gt;
def clone_questionnaire(questions)&lt;br /&gt;
.........&lt;br /&gt;
#Statement deleted&lt;br /&gt;
.........&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
..........&lt;br /&gt;
redirect_to controller: 'questionnaire', action: 'view', id: @questionnaire.id&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&lt;br /&gt;
[http://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90957</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90957"/>
		<updated>2014-10-29T23:13:29Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Why is Refactoring Required */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
*It helps in making the code more understandable&lt;br /&gt;
*It makes the code more maintainable&lt;br /&gt;
*To remove repetition of code&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;width:5%;&amp;quot;|Sr. No.&lt;br /&gt;
! style=&amp;quot;width:13%;&amp;quot;|Method Name&lt;br /&gt;
! style=&amp;quot;width:33%;&amp;quot;|Changes Made &lt;br /&gt;
! style=&amp;quot;width:43%;&amp;quot;|Reason For Change&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|''''' 1 '''''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. Global rule changes for using Hash - value key pair&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90951</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90951"/>
		<updated>2014-10-29T23:06:16Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. Global rule changes for using Hash - value key pair&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90950</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90950"/>
		<updated>2014-10-29T23:05:57Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. Global rule changes for using Hash - value key pair&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&lt;br /&gt;
[http://www.agiledeveloper.com/presentations/how_to_approach_refactoring_2up.pdf Why Refactor]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90948</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90948"/>
		<updated>2014-10-29T23:05:21Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Why is Refactoring Required=&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Questionnaire Controller: questionnaire_controller.rb =&lt;br /&gt;
&lt;br /&gt;
Several methods in Questionnaire Controller class required refactoring to ensure that the change is reflected in the entire project. The names were changed to follow method naming conventions in Ruby. Deprecated code was removed and re-coded to ensure that the code worked in future version of Rails as well. Duplicate codes were commented out. Methods that are more general in the sub classes were moved to the parent class. Some methods that calculate that were colliding with other files were moved to a helper method questionnaire_helper.rb .&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. Global rule changes for using Hash - value key pair&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90943</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90943"/>
		<updated>2014-10-29T23:01:30Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
A Subset of the UML class diagram including only the related classes for this project can be drawn as shown below.&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
Questionnaire Controller is the superclass of QuizQuestionnaire and all the other classes - User class, Advice class and Questionnaire classes are related Model Classes to the controllers that we have modified.&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
1. The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
2. Non Restful method names changed accordingly to make them Restful. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before&lt;br /&gt;
&lt;br /&gt;
After &lt;br /&gt;
[[File:after_refactoring_function_name_change.PNG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
3. Global rule changes for using Hash - value key pair&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'list', :controller =&amp;gt; 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def delete&lt;br /&gt;
.........&lt;br /&gt;
redirect_to action: 'list', controller: 'tree_display'&lt;br /&gt;
.........&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
.........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire == nil&lt;br /&gt;
.........&lt;br /&gt;
redirect_to :action =&amp;gt; 'view', :id =&amp;gt; @questionnaire&lt;br /&gt;
..........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'advice', :action =&amp;gt; 'edit_advice', :id =&amp;gt; params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
After Refactoring :-&lt;br /&gt;
def edit&lt;br /&gt;
..........&lt;br /&gt;
redirect_to Questionnaire if @questionnaire.eql? nil&lt;br /&gt;
..........&lt;br /&gt;
redirect_to action: 'view', id: @questionnaire&lt;br /&gt;
...........&lt;br /&gt;
redirect_to controller: 'advice',  action: 'edit_advice',  id: params[:questionnaire][:id]&lt;br /&gt;
..........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring  Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
          if team = Team.find(t.team_id, @assignment.id)&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
.....&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring Redundant If in def create_questionnaire :-&lt;br /&gt;
def create_questionnaire&lt;br /&gt;
........&lt;br /&gt;
if Team.find(t.team_id, @assignment.id)&lt;br /&gt;
        #Removed unneeded If statement  &lt;br /&gt;
         team = Team.find(t.team_id, @assignment.id) &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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.....&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
After Refactoring  Un-necessary Print statements in def create_questionnaire :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
# print &amp;quot;=====create_questionnaire=========&amp;quot;&lt;br /&gt;
.......&lt;br /&gt;
@successful_create = true&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire begin=========&amp;quot;&lt;br /&gt;
      save&lt;br /&gt;
      # print &amp;quot;=====save in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      save_choices @questionnaire.id&lt;br /&gt;
      # print &amp;quot;=====save_choice in create_questionnaire over=========&amp;quot;&lt;br /&gt;
      if @successful_create == true&lt;br /&gt;
        flash[:note] = &amp;quot;Quiz was successfully created&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'submitted_content', :action =&amp;gt; 'edit', :id =&amp;gt; participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'submitted_content', action: 'edit', id: participant_id&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create_questionnaire &lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def create&lt;br /&gt;
.......&lt;br /&gt;
redirect_to controller: 'tree_display',  action: 'list'&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
After Refactoring Global rules :-&lt;br /&gt;
&lt;br /&gt;
def update&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
.........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to :controller =&amp;gt; 'tree_display', :action =&amp;gt; 'list'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
After Refactoring global rules :-&lt;br /&gt;
def toggle_access&lt;br /&gt;
........&lt;br /&gt;
redirect_to controller: 'tree_display', action: 'list'&lt;br /&gt;
........&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Before Refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil and @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(:parent_id =&amp;gt; parent.id, :node_object_id =&amp;gt; @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&lt;br /&gt;
After refactoring Global rules :-&lt;br /&gt;
def save&lt;br /&gt;
.......&lt;br /&gt;
save_questions @questionnaire.id if @questionnaire.id != nil &amp;amp;&amp;amp; @questionnaire.id &amp;gt; 0&lt;br /&gt;
.......&lt;br /&gt;
QuestionnaireNode.create(parent_id: parent.id, node_object_id: @questionnaire.id)&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://en.wikipedia.org/wiki/Code_refactoring Code Refactoring Wiki]&amp;lt;br&amp;gt;&lt;br /&gt;
[https://docs.google.com/document/d/1qQD7fcypFk77nq7Jx7ZNyCNpLyt1oXKaq5G-W7zkV3k/edit Global Rules for Refactoring]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Before.JPG&amp;diff=90926</id>
		<title>File:Before.JPG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Before.JPG&amp;diff=90926"/>
		<updated>2014-10-29T22:47:52Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: uploaded a new version of &amp;amp;quot;File:Before.JPG&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Before.JPG&amp;diff=90925</id>
		<title>File:Before.JPG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Before.JPG&amp;diff=90925"/>
		<updated>2014-10-29T22:47:26Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: uploaded a new version of &amp;amp;quot;File:Before.JPG&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90915</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90915"/>
		<updated>2014-10-29T22:30:22Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
=Conclusion=&lt;br /&gt;
*Refactoring was performed as per requirements in the files questionnaire_controller.rb, and advice_controller.rb.&lt;br /&gt;
*The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb.&lt;br /&gt;
*Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90914</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90914"/>
		<updated>2014-10-29T22:29:44Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
The quiz questionnaire related methods such as view_quiz, update_quiz, new_quiz and validate_quiz are moved to questionnaire_helper.rb to make the questionnaires_controller thin and follow global rule of thin controllers and fat models.&lt;br /&gt;
[[File:add_include_line.PNG|frame|center]]&lt;br /&gt;
=Conclusion=&lt;br /&gt;
Refactoring was performed as per requirements in the files  questionnaire_controller.rb, and  advice_controller.rb. The code from models cannot be moved directly to controllers, so the code was moved to the helper class questionnaire_helper.rb. Some methods with confusing method names have also been renamed.&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90882</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90882"/>
		<updated>2014-10-29T22:04:55Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90880</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90880"/>
		<updated>2014-10-29T22:03:44Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|right]]&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90877</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90877"/>
		<updated>2014-10-29T22:03:13Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
[[File:UMLDiagram.JPG|frame|center]]&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90876</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90876"/>
		<updated>2014-10-29T22:02:07Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
[[File:20 UMLDiagram.JPG|100px|frame|right|Fig 1.1: Scaling Up]]&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90874</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90874"/>
		<updated>2014-10-29T22:00:15Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; border:1px solid grey;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:UMLDiagram.JPG]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:UMLDiagram.JPG&amp;diff=90873</id>
		<title>File:UMLDiagram.JPG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:UMLDiagram.JPG&amp;diff=90873"/>
		<updated>2014-10-29T21:58:38Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:UMLakk.PNG&amp;diff=90871</id>
		<title>File:UMLakk.PNG</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:UMLakk.PNG&amp;diff=90871"/>
		<updated>2014-10-29T21:55:50Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90870</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90870"/>
		<updated>2014-10-29T21:53:53Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; border:1px solid grey;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:UML_diag.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90867</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90867"/>
		<updated>2014-10-29T21:51:48Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
[[File:UML_diag.png]]&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90866</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90866"/>
		<updated>2014-10-29T21:51:29Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; border:1px solid grey;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:UML_diag.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90861</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90861"/>
		<updated>2014-10-29T21:27:15Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Changes to yaml file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90856</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90856"/>
		<updated>2014-10-29T21:19:10Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* UML CLass Diagram */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;br /&gt;
&lt;br /&gt;
=Participant Model=&lt;br /&gt;
&lt;br /&gt;
=Changes to yaml file=&lt;br /&gt;
&lt;br /&gt;
=Code Snippets=&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
=References=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90854</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90854"/>
		<updated>2014-10-29T21:16:18Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Project Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
*advice_controller.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=UML CLass Diagram=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90852</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90852"/>
		<updated>2014-10-29T21:16:01Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Project Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90851</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90851"/>
		<updated>2014-10-29T21:15:11Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Project Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza GitHub Project Repository]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/ VCL IP Address]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90850</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90850"/>
		<updated>2014-10-29T21:14:21Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Project Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/]&lt;br /&gt;
&lt;br /&gt;
[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza Wiki]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90844</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=90844"/>
		<updated>2014-10-29T21:12:29Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Changes made */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;br /&gt;
&lt;br /&gt;
==Project Resources==&lt;br /&gt;
[https://github.com/kbhupal/expertiza]&lt;br /&gt;
&lt;br /&gt;
[http://152.1.13.221:2555/]&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=89664</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=89664"/>
		<updated>2014-10-26T18:49:36Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Classes involved */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
*questionnaire_controller.rb&lt;br /&gt;
*questionnaire_helper.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=89663</id>
		<title>CSC/ECE 517 Fall 2014/oss E1456 akk</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2014/oss_E1456_akk&amp;diff=89663"/>
		<updated>2014-10-26T18:48:34Z</updated>

		<summary type="html">&lt;p&gt;Atripat5: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Refactoring Questionnaire Controller''' ==&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Questionnaire Controller interacts with the user to create and edit questionnaires such as review rubrics, teammate-feedback rubrics, quizzes, and surveys. This page provides a detailed description of Open Source Project on Expertiza for refactoring the questionnaire controller.&lt;br /&gt;
&lt;br /&gt;
=Project Overview=&lt;br /&gt;
&lt;br /&gt;
==Classes involved==&lt;br /&gt;
questionnaire_controller.rb&lt;br /&gt;
questionnaire_helper.rb&lt;br /&gt;
&lt;br /&gt;
==Changes made==&lt;br /&gt;
*Functionality moved to quiz_questionnaire.rb.&lt;br /&gt;
*edit_advice method was not being used, so it was removed.&lt;br /&gt;
*save_advice moved to the advice_controller.&lt;br /&gt;
*copy, update_quiz, valid_quiz methods were long and have been broken up.  clone_questionnaire_details was also broken up and renamed.&lt;br /&gt;
*Added comments to select_questionnaire_type&lt;br /&gt;
*Debug output (print statements) have been removed.&lt;br /&gt;
*Changed code to follow the global rules.&lt;br /&gt;
*save_new_questions, delete_questions, save_questions have been moved to a separate class.&lt;/div&gt;</summary>
		<author><name>Atripat5</name></author>
	</entry>
</feed>