CompSci 108
Fall 2009
Software Design and Implementation

Code Critique

This activity is intended to help you to learn to critically read code, understand its purpose, and identify ways to improve it. Along the way, you should start to build a sense of what makes one piece of code better than another given a specific set of design goals.

There are three parts to this activity:

A Code Fragment

Look at this handout given previously as an assignment in CompSci 100. Start by reading it and making sure you understand the problem you are being asked to solve. Next, examine the code given as an exemplar for solving the first part of the assignment and describe its strengths and shortcomings. In your README file, answer the following questions:

A Complete Program

Now, look at this complete Java solution to the same problem. Start by reading it and making a list of any questions you have about how the code works. Next, examine the code from the perspective of how it may be extended in the future. In your README, answer the following questions:

While studying this code, please note any good things about the code, that you might keep in the final version as well as problems with the code.

Refactoring

Refactoring is the practice of updating a program to improve its design and maintainability without changing its current functionality significantly. An example of refactoring is creating a single function or class that replaces two or more sections of similar code because it reduces the amount of redundant code within the program and makes the code easier to debug and test. You should examine the given program and refactor it based on your critique and our discussion in class. You may create (and comment) any new functions or classes you want to help improve the program; however, you should justify each change you make by explaining specifically how it improves the code.

Improving

Finally, using your refactored code, you should add three additional bin packing algorithms:

For extra credit, also change the program to print the algorithm that produces the smallest sets of disks required to fit all of the files. In case two algorithms produce the same number of disks, the first algorithm tried should be the one printed.

Grading Criteria

Your grade will be determined primarily by how you justify the changes you make to the code rather than simply how many changes you make. In other words, if you feel strongly that the code is perfect as is and make no changes, you can still get an excellent grade if you completely justify why the code does not need to be changed in the context of your design objectives. On the other hand, you can also decide to scrap the code entirely and start over from scratch but, again, you must clearly justify your decisions and why the submitted code is better than the original. Justifications that refer specifically to principles given in the resources below will be given higher credit than those that use terms like "clearly/obviously", "good/sucks", or "like/hate".

Resources

The following readings provide principles for improving the design of the code.