180 likes | 308 Vues
This content delves into the concept of factorization in mathematics and its application in software engineering. It emphasizes the importance of refactoring to organize data effectively, introducing various techniques such as self-encapsulating fields, replacing type codes with classes, and managing collections. By illustrating practical situations and solutions, this resource aims to simplify interactions with data structures, enhance code maintainability, and improve overall system design. Discover how to leverage these strategies to create more efficient and manageable software systems.
E N D
CSSE 375Organizing Data – Part 2 Shawn and Steve Continue the same quiz!
Mathematics: Factor fac·tor • One of two or more quantities that divides a given quantity without a remainder, for example: • 2 and 5 are factors of 10 • a and b are factors of ab • (a+1) and (a+3) are factors of a2 + 4a + 3 fac·tor·ing • To determine or indicate explicitly the factors of Reconsidering Q1…
Software Engineering: Factoring • fac·tor • Individual items that combined together form a complete software system: • identifiers • contents of function • contents of classes and place in inheritance hierarchy • fac·tor·ing • Determining the items, at design time, that make up or compose a software system Q9
Organizing Data • Refactorings that make working with data easier – Lots of them! • Self Encapsulate Field • Replace Data Value with Object • Change Value to Reference • Change Reference to Value • Replace Array with Object • Duplicate Observed Data • Change Unidirectional Association to Bidirectional • Change Bidirectional Association to Unidirectional • Replace Magic Number with Symbolic Constant • Encapsulate Field • Encapsulate Collection • Replace Record with Data Class • Replace Type Code with Class • Replace Type Code with Subclasses • Replace Type Code with State/Strategy • Replace Subclass with Fields
Replace Array with Object • Situation: You have an array in which certain elements mean different things • Solution: Replace the array with an object that has a field for each element • Similarly, Replace Record with Data Class String[] row = new String[3]; row [0] = "Liverpool"; row [1] = "15"; Performance row = new Performance(); row.setName("Liverpool"); row.setWins("15"); Q10
Duplicate Observed Data • Situation: You have domain data available only in a GUI control, and domain methods need access. • Solution: Copy the data to a domain object. Set up an observer to synchronize the two pieces of data. Q11
Replace Type Code with Class • Situation: A class has a numeric type code that does not affect its behavior • Solution: Replace the number with a new class Q12
Replace Type Code with Subclasses • Situation: You have an immutable type code that affects the behavior of a class • Solution: Replace the type code with subclasses Q13
Encapsulate Collection • Situation: A method returns a collection • Solution: Make it return a read-only view and provide add/remove methods Q14
Replace Subclass with Fields • Situation: You have subclasses that vary only in methods that return constant data • Solution: Change the methods to superclass fields and eliminate the subclasses
Replace Type Code with State/Strategy • Situation: You have a type code that affects the behavior of a class, but you cannot use subclassing • Solution: Replace the type code with a state object
Replace Type Code with State/Strategy class Employee { private int _type; static final int ENGINEER = 0; static final int SALESMAN = 1; static final int MANAGER = 2; Employee (int type) {_type = type;) } intpayAmount() { switch (_type) { case ENGINEER: return _monthlySalary; case SALESMAN: return _monthlySalary + _commission; case MANAGER: return _monthlySalary + _bonus; default: throw new Exception("Incorrect Code"); } } Q15
First Self Encapsulate Type code … Employee (int type) { setType (type);} intgetType() { return _type;} void setType(intarg) { _type = arg;} intpayAmount() { switch (getType()) { case ENGINEER: return _monthlySalary; case SALESMAN: return _monthlySalary + _commission; case MANAGER: return _monthlySalary + _bonus; default: throw new RuntimeException("Incorrect Employee"); } } Self-Encaps
Declare State Class and Subclasses… abstract class EmployeeType{ abstract intgetTypeCode(); } class Engineer extends EmployeeType{ intgetTypeCode () { return Employee.ENGINEER; } } class Manager extends EmployeeType{ intgetTypeCode () { return Employee.MANAGER; } } class Salesman extends EmployeeType{ intgetTypeCode () { return Employee.SALESMAN; } } Abstract Class Subclasses
Hook Subclasses into Employee… class Employee... private EmployeeType_type; intgetType() { return _type.getTypeCode(); } void setType(intarg) { switch (arg) { case ENGINEER: _type = new Engineer(); break; case SALESMAN: _type = new Salesman(); break; case MANAGER: _type = new Manager(); break; default: throw new Exception("Incorrect Code"); } } Employee Type Set via Accessors
Create a factory method for employee types… class Employee... void setType(intarg) { _type = EmployeeType.newType(arg); } class EmployeeType... static EmployeeTypenewType(int code) { switch (code) { case ENGINEER: return new Engineer(); case SALESMAN: return new Salesman(); case MANAGER: return new Manager(); default: throw new Exception("Incorrect Code"); } } static final int ENGINEER = 0; static final int SALESMAN = 1; static final int MANAGER = 2; Factory MethodFor Employee Type
Remove the type code definitions … class Employee... intpayAmount() { switch (getType()) { case EmployeeType.ENGINEER: return _monthlySalary; case EmployeeType.SALESMAN: return _monthlySalary + _commission; case EmployeeType.MANAGER: return _monthlySalary + _bonus; default: throw new Exception("Incorrect Code"); } } • Exercise: Now ready to use Replace Conditional with Polymorphism on payAmount Q16
Replace Conditional with Polymorphism on payAmount class Salesman... intpayAmount(Employeeemp) { return emp.getMonthlySalary() + emp.getCommission(); } class Manager... intpayAmount(Employeeemp) { return emp.getMonthlySalary() + emp.getBonus(); } … class EmployeeType... abstract intpayAmount(Employeeemp); Declare superclass method abstract Q16 - cntd