CSC/ECE 517 Spring 2015/oss E1503 RSA: Difference between revisions
(Created page with "== E1503. Refactoring Leaderboard model, LeaderboardController and Leaderboard_helper classes== This page talks about an open source project based on Expertiza. As a part of con...") |
No edit summary |
||
Line 1: | Line 1: | ||
'''E1504. Refactoring the Bookmark Model''' | |||
This page | This page provides a description of the Expertiza based OSS project. This team project successfully refactored the Bookmark Model by removing the duplicate code, combining the methods, improving the search function, moving Bmapping model methods to their respective class, covering dependencies associated with changed segments and adding a User Interface for using bookmarks. | ||
'''Introduction to Expertiza'''<br> | |||
[http://expertiza.ncsu.edu/ Expertiza] is a | [http://expertiza.ncsu.edu/ Expertiza] is a large project developed as a combined effort of students and faculty using the [http://rubyonrails.org/ Ruby on Rails] framework. The main advantage of using Expertiza, in an educational environment, is for the instructor to introduce peer reviewing among the students. Expertiza allows the instructor to create and customize assignments, create a list of topics the students can sign up for, have students work on teams and then review each other's assignments at the end. Expertiza supports submission of almost any document type, including the URLs and wiki pages. | ||
Expertiza is supported by National Science Foundation under Grant No. 0536558. Additional funding from the [http://www.ncsu.edu/ NCSU] [http://litre.ncsu.edu/ Learning in a Technology-Rich Environment] (LITRE) program, the NCSU [http://ofd.ncsu.edu/teaching-learning/ Faculty Center for Teaching and Learning], the NCSU [http://stem.ncsu.edu/ STEM] Initiative, and the Center for Advanced Computing and Communication. | |||
== | __TOC__ | ||
= Problem Statement = | |||
'''Classes involved:''' | |||
bookmark.rb | |||
bmapping.rb | |||
bookmarks_controller.rb | |||
auth_controller.rb | |||
auth_helper.rb | |||
'''What they do:''' | |||
The bookmark model and controller help in creating user specific bookmarks, which can be added to topics. Also, they provide the functionality to edit these bookmarks by the created user. User can search bookmarks by either users who created them or the bookmark tags. | |||
'''What needs to be done:''' | |||
The search methods in bookmarks model are being used used in a very granular level. This led to redundancy in bookmarks search methods. These methods include <i>search_alltags_allusers, search_fortags_allusers, search_fortags_forusers, search_alltags_forusers</i>. Hence duplicacies in these methods are to be singled out. As we know, in ruby, the method name should specify the pseudo use of itself. Here, <i>add_new_bookmark </i> misleads as this is one of the CRUB method and the naming convention is not quite right. It has to be renamed to create method. Again the case of duplicates arrive. Now in the methods <i> add_topic_bookmark, add_this_bookmark, add_bookmark </i>. The difference between <i> add_topic_bookmark and add_this_bookmark </i> is that the former takes an extra input i.e. topicid. Hence these two can be moved into one method. The third method is an unnecessary repetition of the former two methods' functionality. The method name <i> edit_this_bookmark </i> should be renamed to <i> edit</i> along with updating all the dependencies corresponding to <i> edit_this_bookmark </i>.Lastly, <i> add_bmapping and add_bmapping_signuptopic </i> have to be moved to appropriate class i.e. bmapping class. This involves checking their dependencies and updating their function calls accordingly. | |||
=Changes Made= | |||
==Bookmark Model== | |||
{| class="wikitable" | |||
|- | |||
! style="width:13%;"|Method Name | |||
! style="width:33%;"|Changes Made | |||
! style="width:43%;"|Reason For Change | |||
|- style="vertical-align:top;" | |||
| add_this_bookmark | |||
| Added functionality of add_topic_bookmark | |||
| To implement code reusability and remove repetitive code. | |||
|- | |||
| add_topic_bookmark | |||
| Merged the functionality into add_this_bookmarks and deleted add_topic_bookmark | |||
| To implement code reusability and remove repetitive code. | |||
|- | |||
| add_bookmark | |||
| Added a line that checks whether topic_id has been provided in the request | |||
| It allows creation of new Bmapping if no topic_id was given and removes the bug of searching for bookmark with nil topic_id later on | |||
|- | |||
| search_alltags_allusers | |||
| -------------- | |||
| --------- | |||
|- | |||
| search_alltags_foruser | |||
| -------------- | |||
| --------- | |||
|- | |||
| search_fortags_allusers | |||
| -------------- | |||
| --------- | |||
|- | |||
| search_fortags_foruser | |||
| -------------- | |||
| --------- | |||
|- | |||
| add_new_bookmark | |||
| Changed the method name to "create" | |||
| It is a much more meaningful and simpler name for a method that creates a new bookmark | |||
|- | |||
| edit_this_bookmark | |||
| Changed the name to "edit" | |||
| It is a much more appropriate name for a method that edits the bookmark it was called on | |||
|- | |||
| add_bmapping | |||
| -------------- | |||
| --------- | |||
|- | |||
| add_bmapping_signuptopic | |||
| -------------- | |||
| --------- | |||
|} | |||
==Bookmark Controller== | |||
{| class="wikitable" | |||
|- | |||
! style="width:13%;"|Method Name | |||
! style="width:33%;"|Changes Made | |||
! style="width:43%;"|Reason For Change | |||
|- style="vertical-align:top;" | |||
| create | |||
| ---------------- | |||
| ----------- | |||
|- | |||
| update | |||
| ----------------- | |||
| -------- | |||
|- | |||
| edit | |||
| -------------- | |||
| --------- | |||
|- | |||
| rowspan="3" valign="middle" | | |||
destroy | |||
| ----------------- | |||
| --------- | |||
|- | |||
| --------------- | |||
| ---------- | |||
|- | |||
| ---------- | |||
| ---------- | |||
|} | |||
==Views== | |||
{| class="wikitable" | |||
|- | |||
! style="width:13%;"|Method Name | |||
! style="width:33%;"|Changes Made | |||
! style="width:43%;"|Reason For Change | |||
|- style="vertical-align:top;" | |||
| bookmarks/_result.html.erb | |||
| ---------------- | |||
| ----------- | |||
|- | |||
| bookmarks/search_bookmarks.html.erb | |||
| ----------------- | |||
| -------- | |||
|- | |||
| bookmarks/view_bookmarks.html.erb | |||
| -------------- | |||
| --------- | |||
|- | |||
| bookmarks/_searchmine.html.erb | |||
| ----------------- | |||
| --------- | |||
|- | |||
| bookmarks/add_bookmark_form.html.erb | |||
| ----------------- | |||
| --------- | |||
|- | |||
| bookmarks/edit_bookmark_form.html.erb | |||
| ----------------- | |||
| --------- | |||
|- | |||
| bookmarks/managing_bookmarks.html.erb | |||
| ----------------- | |||
| --------- | |||
|- | |||
| layouts/application.html.erb | |||
| ----------------- | |||
| --------- | |||
|} | |||
= Re-factored Code Cases = | |||
== Case 1 : Refactoring add_this_bookmark and add_topic_bookmark == | |||
The consistency of these two methods shows plenty of repetitive code. In order to effectively refactor these methods and reuse the code they both need, our team merged the two methods together by enabling add_this_bookmark method to handle creation of a bookmark when a topic id is provided (main functionality of add_topic_bookmark method). Once we implemented this change on add_this_bookmark method, we deleted add_topic_bookmark method as it became obsolete. Therefore, we retained the same functionality while reducing the method by 7 repetitive lines of code. | |||
===Before Changes=== | |||
<pre> | |||
def self.add_topic_bookmark(b_url, b_title, b_tags_text, b_description,session_user, topicid) | |||
# Check if the bookmark exists and add / edit based on that | |||
bookmark_exists = check_bookmark_exists(b_url) | |||
bmapping_exists = check_bmapping_exists(b_url,session_user) | |||
if (!bookmark_exists || !bmapping_exists) | |||
Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user,topicid) | |||
elsif (bmapping_exists) | |||
Bookmark.edit_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user) | |||
end | |||
end | |||
def self.add_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user) | |||
bookmark_exists = check_bookmark_exists(b_url) | |||
bmapping_exists = check_bmapping_exists(b_url,session_user) | |||
if (!bookmark_exists || !bmapping_exists) | |||
Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user) | |||
elsif (bmapping_exists) | |||
Bookmark.edit_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user) | |||
end | |||
end | |||
</pre> | |||
===After Changes=== | |||
<pre> | <pre> | ||
def self.add_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user, topic_id) | |||
bookmark_exists = check_bookmark_exists(b_url) | |||
bmapping_exists = check_bmapping_exists(b_url,session_user) | |||
if (!bookmark_exists || !bmapping_exists) | |||
if(topic_id) # something has been passed for topic_id | |||
Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user,topic_id) | |||
else | |||
Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user, nil) | |||
end | |||
elsif (bmapping_exists) | |||
Bookmark.edit(b_url, b_title, b_tags_text, b_description,session_user) | |||
end | |||
end | |||
</pre> | </pre> | ||
=== | |||
== Case 2 : == | |||
=Steps to verify changes manually= | |||
===User2 Role=== | |||
=Automated Tests= | |||
===Unit test=== | |||
===Integration (Cucumber) tests=== | |||
=See Also= | |||
= References= |
Revision as of 20:16, 22 March 2015
E1504. Refactoring the Bookmark Model
This page provides a description of the Expertiza based OSS project. This team project successfully refactored the Bookmark Model by removing the duplicate code, combining the methods, improving the search function, moving Bmapping model methods to their respective class, covering dependencies associated with changed segments and adding a User Interface for using bookmarks.
Introduction to Expertiza
Expertiza is a large project developed as a combined effort of students and faculty using the Ruby on Rails framework. The main advantage of using Expertiza, in an educational environment, is for the instructor to introduce peer reviewing among the students. Expertiza allows the instructor to create and customize assignments, create a list of topics the students can sign up for, have students work on teams and then review each other's assignments at the end. Expertiza supports submission of almost any document type, including the URLs and wiki pages.
Expertiza is supported by National Science Foundation under Grant No. 0536558. Additional funding from the NCSU Learning in a Technology-Rich Environment (LITRE) program, the NCSU Faculty Center for Teaching and Learning, the NCSU STEM Initiative, and the Center for Advanced Computing and Communication.
Problem Statement
Classes involved:
bookmark.rb bmapping.rb bookmarks_controller.rb auth_controller.rb auth_helper.rb
What they do: The bookmark model and controller help in creating user specific bookmarks, which can be added to topics. Also, they provide the functionality to edit these bookmarks by the created user. User can search bookmarks by either users who created them or the bookmark tags.
What needs to be done: The search methods in bookmarks model are being used used in a very granular level. This led to redundancy in bookmarks search methods. These methods include search_alltags_allusers, search_fortags_allusers, search_fortags_forusers, search_alltags_forusers. Hence duplicacies in these methods are to be singled out. As we know, in ruby, the method name should specify the pseudo use of itself. Here, add_new_bookmark misleads as this is one of the CRUB method and the naming convention is not quite right. It has to be renamed to create method. Again the case of duplicates arrive. Now in the methods add_topic_bookmark, add_this_bookmark, add_bookmark . The difference between add_topic_bookmark and add_this_bookmark is that the former takes an extra input i.e. topicid. Hence these two can be moved into one method. The third method is an unnecessary repetition of the former two methods' functionality. The method name edit_this_bookmark should be renamed to edit along with updating all the dependencies corresponding to edit_this_bookmark .Lastly, add_bmapping and add_bmapping_signuptopic have to be moved to appropriate class i.e. bmapping class. This involves checking their dependencies and updating their function calls accordingly.
Changes Made
Bookmark Model
Method Name | Changes Made | Reason For Change |
---|---|---|
add_this_bookmark | Added functionality of add_topic_bookmark | To implement code reusability and remove repetitive code. |
add_topic_bookmark | Merged the functionality into add_this_bookmarks and deleted add_topic_bookmark | To implement code reusability and remove repetitive code. |
add_bookmark | Added a line that checks whether topic_id has been provided in the request | It allows creation of new Bmapping if no topic_id was given and removes the bug of searching for bookmark with nil topic_id later on |
search_alltags_allusers | -------------- | --------- |
search_alltags_foruser | -------------- | --------- |
search_fortags_allusers | -------------- | --------- |
search_fortags_foruser | -------------- | --------- |
add_new_bookmark | Changed the method name to "create" | It is a much more meaningful and simpler name for a method that creates a new bookmark |
edit_this_bookmark | Changed the name to "edit" | It is a much more appropriate name for a method that edits the bookmark it was called on |
add_bmapping | -------------- | --------- |
add_bmapping_signuptopic | -------------- | --------- |
Bookmark Controller
Method Name | Changes Made | Reason For Change |
---|---|---|
create | ---------------- | ----------- |
update | ----------------- | -------- |
edit | -------------- | --------- |
destroy |
----------------- | --------- |
--------------- | ---------- | |
---------- | ---------- |
Views
Method Name | Changes Made | Reason For Change |
---|---|---|
bookmarks/_result.html.erb | ---------------- | ----------- |
bookmarks/search_bookmarks.html.erb | ----------------- | -------- |
bookmarks/view_bookmarks.html.erb | -------------- | --------- |
bookmarks/_searchmine.html.erb | ----------------- | --------- |
bookmarks/add_bookmark_form.html.erb | ----------------- | --------- |
bookmarks/edit_bookmark_form.html.erb | ----------------- | --------- |
bookmarks/managing_bookmarks.html.erb | ----------------- | --------- |
layouts/application.html.erb | ----------------- | --------- |
Re-factored Code Cases
Case 1 : Refactoring add_this_bookmark and add_topic_bookmark
The consistency of these two methods shows plenty of repetitive code. In order to effectively refactor these methods and reuse the code they both need, our team merged the two methods together by enabling add_this_bookmark method to handle creation of a bookmark when a topic id is provided (main functionality of add_topic_bookmark method). Once we implemented this change on add_this_bookmark method, we deleted add_topic_bookmark method as it became obsolete. Therefore, we retained the same functionality while reducing the method by 7 repetitive lines of code.
Before Changes
def self.add_topic_bookmark(b_url, b_title, b_tags_text, b_description,session_user, topicid) # Check if the bookmark exists and add / edit based on that bookmark_exists = check_bookmark_exists(b_url) bmapping_exists = check_bmapping_exists(b_url,session_user) if (!bookmark_exists || !bmapping_exists) Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user,topicid) elsif (bmapping_exists) Bookmark.edit_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user) end end def self.add_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user) bookmark_exists = check_bookmark_exists(b_url) bmapping_exists = check_bmapping_exists(b_url,session_user) if (!bookmark_exists || !bmapping_exists) Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user) elsif (bmapping_exists) Bookmark.edit_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user) end end
After Changes
def self.add_this_bookmark(b_url, b_title, b_tags_text, b_description,session_user, topic_id) bookmark_exists = check_bookmark_exists(b_url) bmapping_exists = check_bmapping_exists(b_url,session_user) if (!bookmark_exists || !bmapping_exists) if(topic_id) # something has been passed for topic_id Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user,topic_id) else Bookmark.add_bookmark(b_url, b_title, b_tags_text, b_description,session_user, nil) end elsif (bmapping_exists) Bookmark.edit(b_url, b_title, b_tags_text, b_description,session_user) end end