SWE 316: Software Design and Architecture Objectives Lecture # 17 Good Software Design Practical tips for creating good design Introduce practical tips for creating good design The slides and the material of this chapter are adopted from: “Object-Oriented Software Engineering: Practical Software Development using UML and Java”, 2nd Ed. By Timothy C. Lethbridge and Robert Laganière SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Topics: Principles leading to good design DP 1: divide and conquer DP 6: reuse existing designs and code where possible DP 2: increase cohesion where possible DP 7: design for flexibility DP 3: reduce coupling where possible DP 8: anticipate obsolescence DP 4: keep the level of abstraction as high as possible DP 9: design for portability DP 10: design for testability DP 11: design defensively DP 5: increase reusability where possible SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 2/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Principles leading to good design Overall goals of good design: Increasing profit by reducing cost and increasing revenue Ensuring that we actually conform with the requirements Accelerating development Increasing qualities such as Usability Reliability Reusability SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Efficiency Maintainability 3/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 1: divide and conquer Trying to deal with something big all at once is normally much harder than dealing with a series of smaller things Separate people can work on each part. An individual software engineer can specialize. Each individual component is smaller, and therefore easier to understand. Parts can be replaced or changed without having to replace or extensively change other parts. SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 4/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Ways of dividing a software system A distributed system is divided up into clients and servers A system is divided up into subsystems A subsystem can be divided up into one or more packages A package is divided up into classes A class is divided up into methods SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 5/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 2: increase cohesion where possible A subsystem or module has high cohesion if it keeps together things that are related to each other, and keeps out other things This makes the system as a whole easier to understand and change Type of cohesion: -Functional -Communicational -Procedural -Utility SWE 316: Software Design and Architecture – Dr. Khalid Aljasser -Layer -Sequential -Temporal 6/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions 7/35 DP 2: increase cohesion where possible (2) SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions 8/35 DP 2: increase cohesion where possible (3) SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions 9/35 DP 2: increase cohesion where possible (4) Mixing different types of cohesion SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 3: Reduce coupling where possible Coupling occurs when there are interdependencies between one module and another When interdependencies exist, changes in one place will require changes somewhere else. A network of interdependencies makes it hard to see at a glance how some component works. Type of coupling: -Content -Common -Control -Stamp -Data -Routine Call -Type use -Inclusion/Import -External SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 10/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 3: Reduce coupling where possible SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 11/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 3: Reduce coupling where possible SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 12/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 3: Reduce coupling where possible Content Coupling A module modifies data that is internal to another component It should always be AVOIDED e.g., modify public instance variable SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 13/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 3: Reduce coupling where possible Control Coupling This occurs when one procedure calls another using a ‘flag’ or ‘command’ that explicitly controls what the second procedure does. SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 14/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 3: Reduce coupling where possible Stamp Coupling This occurs whenever a class is declared as the type of a method argument. Some stamp coupling is necessary What’s wrong in this implementation? SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 15/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 4: Abstraction as high as possible Abstractions --- keeping things simple ! keep the level of abstraction as high as possible Ensure that your designs allow you to hide or defer consideration of details, thus reducing complexity A good abstraction is said to provide information hiding Abstractions allow you to understand the essence of a subsystem without having to know unnecessary details SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 16/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Abstraction and classes Classes are data abstractions that contain procedural abstractions Abstraction is increased by defining all variables as private. The fewer public methods in a class, the better the abstraction Superclasses and interfaces increase the level of abstraction Attributes and associations are also data abstractions. Methods are procedural abstractions Better abstractions are achieved by giving methods fewer parameters SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 17/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 5: Increase reusability where possible Design for reuse ---- Design with reuse Design the various aspects of your system so that they can be used again in other contexts Generalize your design as much as possible Follow the preceding three design principles Increase cohesion Reduce coupling Increase abstraction Simplify your design as much as possible SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 18/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 5: Increase reusability where possible How? Generalize your design as much as possible Save instances of Employee class in a binary file Instead, consider saving any class to binary file Another example, generalize sorting Design your system with hooks An aspect of the design deliberately added to allow other designers to add additional functionality Extensible compiler example SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 19/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 6: reuse existing designs and code Design with reuse is complementary to design for reusability Actively reusing designs or code allows you to take advantage of the investment you or others have made in reusable components SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 20/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions 21/35 DP 7: design for flexibility (adaptability) Actively anticipate changes that a design may have to undergo in the future, and prepare for them Reduce coupling and increase cohesion Create abstractions Do not hard-code anything Leave all options open E.g., constants should be in a configuration file Do not restrict the options of people who have to modify the system later Use reusable code and make code reusable SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 8: Anticipate Obsolescence Plan for changes in the technology or environment so the software will continue to run or can be easily changed Avoid using early releases of technology Avoid using software libraries that are specific to particular environments Avoid using undocumented features or little-used features of software libraries Avoid using software or special hardware from companies that are less likely to provide long-term support Use standard languages and technologies that are supported by multiple vendors SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 22/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 9: design for portability Have the software run on as many platforms as possible Avoid the use of facilities that are specific to one particular environment E.g. a library only available in Microsoft Windows Some programming languages, such as Java, make this easy because the language itself is designed to allow software to run on different platforms unchanged. Another important portability issue has to do with text files: the characters used to terminate lines differ from platform to platform. SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 23/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 10: Design for Testability Take steps to make testing easier Design a program to automatically test the software Ensure that all the functionality of the code can by driven by an external program, bypassing a graphical user interface In Java, you can create a main() method in each class in order to exercise the other methods SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 24/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 11: Design defensively Never trust how others will try to use a component you are designing Handle all cases where other code might attempt to use your component inappropriately Check that all of the inputs to your component are valid: the preconditions Example: method to check if a certain date is working day SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 25/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) DP 11: Design defensively What’s wrong with this implementation? Design by Contract Each method has a specific contract with its caller SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Design Decisions 26/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions DP 11: Design defensively Using Asserting identify possible logic errors during development. SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 27/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions 28/35 Techniques for making good design decisions Using priorities and objectives to decide among alternatives Step 1: List and describe the any of the alternatives alternatives for the design prevents you from meeting decision. one or more of the objectives. Step 2: List the advantages and disadvantages of each alternative with respect to your objectives and priorities. Step 3: Determine whether Step 4: Choose the alternative that helps you to best meet your objectives. Step 5: Adjust priorities for subsequent decision making. SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Example priorities and objectives Imagine a system has the following objectives, starting with top priority: Security: Encryption must not be breakable within 100 hours of computing time on a 400Mhz Intel processor, using known cryptanalysis techniques. Maintainability. No specific objective. CPU efficiency. Must respond to the user within one second when running on a 400MHz Intel processor. Network bandwidth efficiency: Must not require transmission of more than 8KB of data per transaction. Memory efficiency. Must not consume over 20MB of RAM. Portability. Must be able to run on Windows 98, NT 4 and ME as well as Linux SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 29/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Example evaluation of alternatives SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 30/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Example evaluation of alternatives SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 31/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions 32/35 Cost-benefit analysis to choose among alternatives To estimate the costs, add up: The incremental cost of doing the software engineering work, including ongoing maintenance The incremental costs of any development technology required The incremental costs that end-users and product support personnel will experience To estimate the benefits, add up: The incremental software engineering time saved The incremental benefits measured in terms of either increased sales or else financial benefit to users SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Some general principles of good design Use good design patterns, patterns of call-return or cooperative objects, event-structure should be consistent Modular – logically partitioned into elements that perform specific functions and sub-functions. Should have distinct representations of data, interfaces and components Functions and components should be independent Interfaces between components should be kept as simple as possible. Use a repeatable method that transforms the requirements through analysis to high-level and then low-level design Don’t reinvent the wheel. SWE 316: Software Design and Architecture – Dr. Khalid Aljasser 33/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) CRC cards CRC stands for Classes, Responsibilities, Collaborations. CRC cards allow people to break away from the procedural mode of thought and more fully appreciate object technology. One common way of checking for a good design and guiding its refinement is to use CRC cards. Although CRC is not part of UML, they add some very useful insights throughout a development. SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Design Decisions 34/35 Intro Principles (1-2) Principles (3-4) Principles (5-7) Principles (8-11) Design Decisions Summary Overall goals of good design: Increasing profit by reducing cost and increasing revenue Ensuring that we actually conform with the requirements Accelerating development Increasing qualities such as Design principles leading to good design: Divide and conquer Increase cohesion where possible Reduce coupling where possible Keep the level of abstraction as high as possible Increase reusability where possible SWE 316: Software Design and Architecture – Dr. Khalid Aljasser Reuse existing designs and code where possible Design for flexibility Anticipate obsolescence Design for portability Design for testability Design defensively 35/35