From Modules to Objects Professor James Landay CS169: Software Engineering Spring 2001 February 14, 2001 2/14/2001 1 Outline Review Modules Cohesion Administrivia Coupling Encapsulation & ADTs 2/14/2001 2 Review Testing doesn’t show the absence of bugs Major assumptions of testing inference from behavior, known environment, choosing the right test cases Why shouldn’t SEs do all their own testing? What to test? utility, reliability, robustness, performance, correctness Why is correctness not enough? the spec might be bad! When are correctness proofs useful? if the benefits outweigh the costs (lives, space, etc.) 2/14/2001 3 Modules What is a module? lexically contiguous sequence of program statements, bounded by boundary elements, with aggregate identifier Examples procedures & functions in classical PLs objects & methods within objects in OO PLs 2/14/2001 4 Good vs. Bad Modules Modules in themselves are not “good” Must design them to have good properties i) CPU using 3 chips (modules) ii) CPU using 3 chips (modules) Chi p 2 Chi p 1 Chi p 1 Chi p 2 OR ga te s AND g ates Reg iste rs ALU ALU Chi p 3 Shi fte r SHIFTER Chi p 3 2/14/2001 What is the problem here? NOT g ate s 5 Good vs. Bad Modules Two designs functionally equivalent, but the 2nd is hard to understand hard to locate faults difficult to extend or enhance cannot be reused in another product. Implication? -> expensive to perform maintenance Good modules must be like the 1st design maximal relationships within modules (cohesion) minimal relationships between modules (coupling) this is the main contribution of structured design 2/14/2001 6 Modules to Objects 2/14/2001 Objects with high cohesion and low coupling Objects Information hiding Abstract data types Data encapsulation Modules with high cohesion and low coupling Modules 7 Cohesion ? Degree of interaction within module Seven levels of cohesion 7. Functional | Informational 5. Communicational 4. Procedural 3. Temporal 2. Logical 1. Coincidental 2/14/2001 (best) (worst) 8 1. Coincidental Cohesion Def. ? module performs multiple, completely unrelated actions Example module prints next line, reverses the characters of the 2nd argument, adds 7 to 3rd argument How could this happen? hard organizational rules about module size Why is this bad? degrades maintainability & modules are not reusable Easy to fix. How? break into separate modules each performing one task 2/14/2001 9 2. Logical Cohesion Def. module performs series of related actions, one of which is selected by calling module Example function code = 7; new operation (op code, dummy 1, dummy 2, dummy 3); // dummy 1, dummy 2, and dummy 3 are dummy variables, // not used if function code is equal to 7 Why is this bad? interface difficult to understand code for more than one action may be intertwined difficult to reuse 2/14/2001 10 3. Temporal Cohesion Def. ? module performs series of actions related in time Initialization example open old db, new db, transaction db, print db, initialize sales district table, read first transaction record, read first old db record Why is this bad? actions weakly related to one another, but strongly related to actions in other modules code spread out -> not maintainable or reusable Initialization example fix define these intializers in the proper modules & then have an initialization module call each 2/14/2001 11 4. Procedural Cohesion Def. ? module performs series of actions related by procedure to be followed by product Example update part number and update repair record in master db Why is this bad? actions are still weakly related to one another not reusable Solution break up! 2/14/2001 12 5. Communicational Cohesion Def. module performs series of actions related by procedure to be followed by product, but in addition all the actions operate on same data Example 1 update record in db and write it to audit trail Example 2 calculate new coordinates and send them to window Why is this bad? still leads to less reusability -> break it up 2/14/2001 13 7. Informational Cohesion Def. module performs a number of actions, each with its own entry point, with independent code for each action, all performed on the same data structure Defi ni tio n o f sa le s_re gi on _ta bl e Entry •• • Entry •• • This is an ADT! i ni ti al i ze_ sal e s_reg i on _tab l e Exi t u pd ate_ sal e s_reg i on _tab l e •• • •• • Exi t Entry •• • •• • 2/14/2001 p ri n t_ sal e s_reg i on _tab l e 14 Exi t 7. Functional Cohesion Def. module performs exactly one action Examples get temperature of furnace compute orbital of electron calculate sales commission Why is this good? more reusable corrective maintenance easier fault isolation reduced regression faults easier to extend product 2/14/2001 15 Coupling ? Degree of interaction between two modules Five levels of coupling 5. 4. 3. 2. 1. 2/14/2001 Data Stamp Control Common Content (best) (worst) 16 1. Content Coupling Def. one module directly references contents of the other Example module a modifies statements of module b module a refers to local data of module b in terms of some numerical displacement within b module a branches into local label of module b Why is this bad? almost any change to b requires changes to a 2/14/2001 17 ccb cca 2. Common Coupling Def. g lo ba l vari ab le two modules have write access to the same global data Example two modules have access to same database, and can both read and write same record use of Java public statement while (global variable == 0) if (argument xyz > 25) Why is this bad? module 3 (); resulting code is unreadable else modules can have side-effects module 4 (); must read entire module to understand difficult to reuse module exposed to more data than necessary 2/14/2001 18 3. Control Coupling Def. one module passes an element of control to the other Example control-switch passed as an argument Why is this bad? modules are not independent module b must know the internal structure of module a affects reusability 2/14/2001 19 4. Stamp Coupling Def. data structure is passed as parameter, but called module operates on only some of individual components Example calculate withholding (employee record) Why is this bad? affects understanding not clear, without reading entire module, which fields of record are accessed or changed unlikely to be reusable other products have to use the same higher level data structures passes more data than necessary 2/14/2001 e.g., uncontrolled data access can lead to computer crime 20 5. Data Coupling Def. every argument is either a simple argument or a data structure in which all elements are used by the called module Example display time of arrival (flight number) get job with highest priority (job queue) Slippery slope between stamp & data (see queue) Why is this good? maintenance is easier good design has high cohesion & weak coupling 2/14/2001 21 Modules to Objects 2/14/2001 Objects with high cohesion and low coupling Objects Information hiding Abstract data types Data encapsulation Modules with high cohesion and low coupling Modules 22 Data Encapsulation ? Def. data structure together with actions to be performed on that structure m_ 12 3 Bad job queue example { j o b j ob _a , j ob _b ; im pl em en ta tio n o f j ob _q ue ue • • • i ni tia l ize_ jo b_ qu eu e () { •• • •• • •• • •• • } ad d_ j ob _to_ qu eu e (j ob j ) { •• • •• • •• • } } remo ve _j ob _from _q ue ue (j ob { ••• •• • 2/14/2001 re move_ jo b_ fro m_ qu eu e (jo b_ b); •• • easier development & maintenance helps us cope w/ change a dd _j o b_ to _q ue ue (j o b_ a); •• • Abstraction or stepwise refinement i n iti al i ze _j ob _q ue ue (); •• • put all job queue ops together w/ 1 definition of job queue in 1 module informational cohesion & data encapsulation •• • define job queue w/ 1 op together in module (repeat for init, add, etc.) low cohesion Better job queue example m_ en cap sul a ti o n } 23 Abstract Data Types Def. data type together with actions to be performed on instantiations of that data type subtle difference with encapsulation Example class JobQueue { public int queueLength; // length of job queue public int queue = new int[25]; // up to 25 jobs // methods public void initializeJobQueue (){ // body of method } public void addJobToQueue (int jobNumber){ // body of method } } // JobQueue 2/14/2001 24 Information Hiding Really “details hiding” hiding implementation details, not information Example design modules so that items likely to change are hidden future change localized change cannot affect other modules data abstraction designer thinks at level of ADT 2/14/2001 25 Information hiding Example class JobQueue { private int queueLength; // length of job queue private int queue = new int[25]; // up to 25 jobs // methods public void initializeJobQueue (){ // body of method } public void addJobToQueue (int jobNumber){ // body of method } } // JobQueue Now queue and queueLength are inaccessible 2/14/2001 26 Objects Def. class – abstract data type which supports inheritance objects are instantiations of classes Inheritance new data types defined as extensions to previously defined types don’t have to define from scratch -> provides more data abstraction Example Define humanBeing to be a class A humanBeing has attributes, such as age, height, gender Assign values to attributes when describing object 2/14/2001 Define parent to be a subclass of humanBeing A parent has all attributes of humanBeing, plus attributes of his/her own (name of oldest child, number of children) 27 A parent inherits all attributes of humanBeing Inheritance (UML) HumanBeing (base class) UML notation: boxes represent classes open triangle represent inheritance inherits from(“isA ”) Parent derived part (derived class) incremental part 2/14/2001 28 Inheritance (Java) class HumanBeing { private int private float age; height; public // declarations of operations on HumanBeing } // class HumanBeing class Parent extends HumanBeing { private String private int nameOfOldestChild; numberOfChildren; public // declarations of operations on Parent } // class Parent 2/14/2001 29 Inheritance Bas e Method Foo (b : Base) can be applied to objects of any subclass of Base 2/14/2001 30 Aggregation (UML) PersonalComputer UML notation: diamond (1 or more) no diamond (1) CPU Monitor Keyboard Printer Aggregation refers to the components of a class - used to group related items - each of these (CPU, etc.) would be instance var 2/14/2001 31 Polymorphism & Dynamic Binding Classical paradigm function draw_rectangle function draw_circle function draw_line must explicitly invoke the correct version 2/14/2001 32 Polymorphism & Dynamic Binding Object-oriented paradigm GraphObjClass method draw RectClass Implementation of method draw for a rectangle CircleClass Implementation of method draw for a circle LineClass Implementation of method draw for a line all that is needed is myGraphObj.draw() Dynamic binding correct method invoked at run-time (dynamically) Polymorphic method draw can be applied to objects of different classes 2/14/2001 33 Polymorphism & Dynamic Binding Advantages ? can build for the future easy to add a new shape w/o changing previous code • don’t ever want to mess w/ code that works easy to iterate over similar but distinct objects draw all GraphObjs Disadvantages ? performance (have to look things up at run time) have to design classes better have to understand how it will be extended over time harder to understand the code must understand multiple possibilities for specific method 2/14/2001 34 Advantages of Objects Same as abstract data types information hiding data abstraction procedural abstraction start code design at high level & continue down levels until using primitives Inheritance provides further data abstraction easier and less error-prone product development easier maintenance 2/14/2001 35 Summary Good modules have strong cohesion and weak coupling Data encapsulation, ADTs, information hiding, & objects ease maintenance & reuse Polymorphism has advantages & disadvantages 2/14/2001 36 Next Time Questions? Friday’s lecture on Requirements read Chapter 9 from Schach 2/14/2001 37