CSC/ECE 517 Fall 2014/oss E1457 ags
Expertiza - Refactoring DynamicReviewMapping Controller
Introduction
It is time consuming to assess project work in a large classroom environment, and one of the best techniques to achieve this is to have students assist in this assessment. If each student is asked to assess a few (say, one to five) other students or student teams, the task requires a reasonable amount of effort; and that effort does not increase as the class gets larger. "Expertiza is a system for managing all kinds of communication that is involved in assessment: double-blind communications between authors and reviewers, assessment of teammate contributions, evaluations by course staff, and surveys of students to assess the assignment and the peer-review process." <ref>http://www.igi-global.com/book/monitoring-assessment-online-collaborative-environments/773&f=e-book</ref> "Expertiza project uses peer review to create reusable learning objects."<ref>http://expertiza.ncsu.edu/</ref> Students select from a list of tasks to be performed, with several students selecting each task. Then they prepare their work and submit it to an electronic peer-review system. The work is then reviewed by other students, who offer comments to help the submitters improve their work. The best submissions for each task are then selected for use in later courses. Expertiza gets students working together to improve others’ learning experiences. It helps them learn, by making them think through the lecture material and apply it to a real-world situation, just as they might do in an on-the-job situation. These learning objects can be improved iteratively; for example, the next year’s class can be presented with the examples developed by students the previous year, and asked to identify shortcomings and develop improved examples.<ref>http://scholar.google.com/scholar?q=%22Reusable+learning+objects+through+peer+review%3A+The+Expertiza+approach%22+%22The+Expertiza+platform+is+a+divide-and-conquer%22&btnG=&hl=en&as_sdt=0%2C34</ref> More information on Expertiza can be found here.
Refactoring in Ruby
Refactoring helps to<ref>http://www.refactoringinruby.com/</ref>
- Understand what led to poor code design
- Fix code which is difficult to understand
- Express each idea “once and only once”
- Recognize missing or inadequately formed classes
- Simplify overly complex relationships between classes
- Achieve the right balance of responsibilities among objects
- Make code easier to test and more maintainable
Refactoring Techniques
There are many documented refactoring techniques, and a few common ones are below.<ref>http://www.integralist.co.uk/posts/refactoring-techniques/</ref>
- Rename Method: Renaming identifiers can reduce the need for code comments and nearly always helps to promote greater clarity.
- Introduce Explaining Variable: So here is a technique specifically based around the premise of renaming.
For example:
unless "This is a String with some CAPS".scan(/([A-Z])/).empty? puts "capitalised text was found" end
Should be:
caps_not_found = "This is a String with some CAPS".scan(/([A-Z])/).empty? unless caps_not_found puts "capitalised text was found" end
- Extract Method: It consists of breaking up long methods by shifting overly complex chunks of code into new methods which have very descriptive identifiers.
For example:
class Foo attr_reader :bar def initialize bar @bar = bar end def do_something puts "my baz" # notice this is duplication puts bar end def do_something_else puts "my baz" # notice this is duplication puts "Something else" puts bar end end
Becomes:
class Foo attr_reader :bar def initialize bar @bar = bar end def do_something baz puts bar end def do_something_else baz puts "Something else" puts bar end def baz puts "my baz" end end
- Inline Method: Sometimes you want the opposite of the Extract Method technique. Imagine a method exists whose content is already simple and clear, and whose identifier adds no extra benefit. So to fix this problem we'll convert the method invocation into an inlined piece of code.
- Pull Up Method: When you have duplicated code across two separate classes then the best refactoring technique to implement is to pull that duplicate code up into a super class so we DRY (Don't Repeat Yourself) out the code and allow it to be used in multiple places without duplication (meaning changes in future only have to happen in one place).
For example:
class Person attr_reader :first_name, :last_name def initialize first_name, last_name @first_name = first_name @last_name = last_name end end class MalePerson < Person # This is duplicated in the `FemalePerson` class def full_name first_name + " " + last_name end def gender "M" end end class FemalePerson < Person # This is duplicated in the `MalePerson` class def full_name first_name + " " + last_name end def gender "F" end end
Becomes:
class Person attr_reader :first_name, :last_name def initialize first_name, last_name @first_name = first_name @last_name = last_name end def full_name first_name + " " + last_name end end class MalePerson < Person def gender "M" end end class FemalePerson < Person def gender "F" end end
- Introduce Named Parameter:When method arguments are unclear then convert them into named parameters so they become clearer (and easier to remember).
Project Description
Modification to Existing Code
Further Reading
References
<references/>