Reference no: EM133682893
Object Oriented Programming Hurdle Task: Semester Test
Purpose: Demonstrate your understanding of object-oriented programming and the core concepts of object-oriented design.
Task: You must complete two tasks. The first is a coding task, and the second is a series of short answer questions.
Task 1
Consider the following UML diagram:
Sales is a class that contains knowledge of purchase orders that a business has received. There are two types of purchase orders: single transaction orders and batch orders, which the class Sales records separately in two dedicated lists. Batch orders are instances of class Batch and can be added to its corresponding list, _batch_orders, using method AddBatch. Single trans- action orders, on the other hand, are instances of class Transaction and can be added to its corresponding list, _single_orders, using method AddTransaction. All orders can be printed to the console via method PrintOrders.
Class Batch defines three member variables:
_number, a string that identifies this order,
_name, a string that captures the purpose of this order, and
_items, a list of single orders attached to the bulk order. In addition, class Batch defines the methods
Add to add a single order,
Print to print this order, and
Total to return the total sum of this order.
Finally, class Batch defines two read-only getters to obtain the Number and Name of the order. Class Transaction is similar. Its member variables are:
_number, a string that identifies this order,
_name, a string that describes the product in this order, and
_amount, a decimal value to store the total of the single transaction.
Class Transaction defines a Print and a Total method, which print the order and return the amount of this order, respectively. The read-only getters return the Number and Name of a single transaction order.
A sample output of an application implementing the above UML diagram may look like the fol- lowing (result of telling a Sales object to PrintOrders):
Sales:
Batch sale: #2024x00001, CompSci Books #1, Deep Learning in Python, $67.90 #2, C# in Action, $54.10
#3, Design Patterns, $129.75 Total: $251.75
Batch sale: #2024x00002, Fantasy Books Empty order.
#00-0001, Compilers, $134.60
#10-0003, Hunger Games 1-3, $45.00 #15-0020, Learning Blender, $56.90 Sales total: $488.25
You may have noticed a peculiar feature duplication in the design. In addition, batch orders are limited to containing single transaction orders. This is an arbitrary limitation. Batch orders should be able to contain nested batch orders. Consequently, class Batch should allow for both, objects of class Batch and objects of class Transaction, to be stored (i.e., added to _items).
To achieve this, you need to redesign the system. Start with the abstract class Thing as shown in the following UML diagram:
<<abstract>> Thing
_number: String
_name: String
+ Thing(String number, String name)
+ Print() <<abstract>>
+ Total() : Decimal <<abstract>>
+ Number : String <<read-only property>>
+ Name : String <<read-only property>>
Restructure the current solution as follows:
Implement the abstract class Thing.
Change class Batch so that it stores instances of class Thing rather than class Transac- tion.
Make class Batch and class Transaction subclasses of class Thing. Apply the necessary refactoring steps.
Change class Sales to maintain only a single list _orders of Thing objects.
Replace the methods AddBatch and AddTransaction with a single method Add in class
Sales.
Revise the implementation of PrintOrders in class Sales.
Write a simple Main program to demonstrate that your new design works. The Main
program must
Create a Sales object.
Add batch orders to the Sales object.
Add single transaction orders to the Sales object.
Must create one nested batch order.
Add an empty batch order.
Tell PrintOrders to the Sales object. You are required to:
Provide a new UML class diagram for your updated design (it can be drawn by hand).
Write the code for all classes, including the abstract class Thing, and all fields, construc- tors, methods, and properties.
Write a simple Main method as described above.
Take a screenshot of the output of your program.
Task 2
Describe the principle of polymorphism and how and where it is being used in Task 1.
What is wrong with the class name Thing? Suggest a better name and explain the rea- soning behind your answer.
What is abstraction and how and where it is being used in Task 1.
Can you think of a scenario or system design that resembles Task 1? Look a the classes and their interaction in Task 1 and identify a real-world system or approach that uses a similar relationship.