Principles of Software Construction: Design, and...
Transcript of Principles of Software Construction: Design, and...
![Page 1: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/1.jpg)
115‐214
School of Computer Science
School of Computer Science
Principles of Software Construction: Objects, Design, and Concurrency(Part 2: Designing (Sub‐)Systems)
Design for Robustness
Jonathan ALdrich Charlie Garrod
![Page 2: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/2.jpg)
215‐214
Administrativa
• Midterm 1: Thursday here• Practice midterm on Piazza• Review session tomorrow, 8pm DH 1212
• HW 4 out today, Milestone A due Oct 8– Do not underestimate design– Signups for design reviews
2
![Page 3: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/3.jpg)
315‐214
Which design is better? Argue with design goals, principles, heuristics, and patterns that you know
* old midterm question
![Page 4: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/4.jpg)
415‐214
Learning Goals
• Use exceptions to write robust programs• Make error handling explicit in interfaces and contracts
• Isolate errors modularly• Test complex interactions locally• Test for error conditions
4
![Page 5: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/5.jpg)
515‐214
Design Goals, Principles, and Patterns
• Design Goals– Design for robustness
• Design Principle– Modular protection– Explicit interfaces
• Supporting Language Features– Exceptions
5
![Page 6: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/6.jpg)
615‐214
Additional Readings
• Textbook Chapter 36 (handling failure, exceptions, proxy)
6
![Page 7: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/7.jpg)
715‐214
EXCEPTION HANDLING
7
![Page 8: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/8.jpg)
815‐214
What does this code do?FileInputStream fIn = new FileInputStream(filename);if (fIN == null) {switch (errno) {case _ENOFILE:
System.err.println(“File not found: “ + …);return ‐1;
default:System.err.println(“Something else bad happened: “ + …);return ‐1;
}}DataInput dataInput = new DataInputStream(fIn);if (dataInput == null) {System.err.println(“Unknown internal error.”);return ‐1; // errno > 0 set by new DataInputStream
}int i = dataInput.readInt();if (errno > 0) {System.err.println(“Error reading binary data from file”);return ‐1;
} // The slide lacks space to close the file. Oh well.return i;
![Page 9: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/9.jpg)
915‐214
Compare to:
try {FileInputStream fileInput = new FileInputStream(filename);DataInput dataInput = new DataInputStream(fileInput);int i = dataInput.readInt();fileInput.close();return i;
} catch (FileNotFoundException e) {System.out.println("Could not open file " + filename);return ‐1;
} catch (IOException e) {System.out.println("Error reading binary data from file "
+ filename);return ‐1;
}
![Page 10: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/10.jpg)
1015‐214
Exceptions
• Exceptions notify the caller of an exceptional circumstance (usually operation failure)
• Semantics– An exception propagates up the function‐call stack until main() is reached (terminates program) or until the exception is caught
• Sources of exceptions:– Programmatically throwing an exception– Exceptions thrown by the Java Virtual Machine
![Page 11: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/11.jpg)
1115‐214
Exceptional control‐flow in Javapublic static void test() {
try {System.out.println("Top");int[] a = new int[10];a[42] = 42;System.out.println("Bottom");
} catch (NegativeArraySizeException e) {System.out.println("Caught negative array size");
}}
public static void main(String[] args) {try {
test();} catch (IndexOutOfBoundsException e) {
System.out.println"("Caught index out of bounds");}
}
![Page 12: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/12.jpg)
1215‐214
Java: The finally keyword
• The finally block always runs after try/catch:
try {System.out.println("Top");int[] a = new int[10];a[2] = 2;System.out.println("Bottom");
} catch (IndexOutOfBoundsException e) {System.out.println("Caught index out of bounds");
} finally {System.out.println("Finally got here");
}
![Page 13: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/13.jpg)
1315‐214
The exception hierarchy in Java
Throwable
Exception
RuntimeException IOException
EOFException
FileNotFoundException
NullPointerException
IndexOutOfBoundsException
ClassNotFoundExcept… …
. . .
Object
![Page 14: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/14.jpg)
1415‐214
Design choice: Checked and unchecked exceptions and return values• Unchecked exception: any subclass of RuntimeException– Indicates an error which is highly unlikely and/or typically unrecoverable
• Checked exception: any subclass of Exception that is not a subclass of RuntimeException– Indicates an error that every caller should be aware of and explicitly decide to handle or pass on
• Return values (boolean, empty lists, null, etc): If failure is common and expected possibility
Design Principle: Explicit Interfaces (contracts)
![Page 15: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/15.jpg)
1515‐214
Creating and throwing your own exceptions• Methods must declare any checked exceptions they might throw
• If your class extends java.lang.Throwable you can throw it:– if (someErrorBlahBlahBlah) {– throw new MyCustomException(“Blah blah blah”);
– }
![Page 16: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/16.jpg)
1615‐214
Benefits of exceptions• Provide high‐level summary of error and stack trace
– Compare: core dumped in C• Can’t forget to handle common failure modes
– Compare: using a flag or special return value• Can optionally recover from failure
– Compare: calling System.exit()• Improve code structure
– Separate routine operations from error‐handling (see Cohesion)
• Allow consistent clean‐up in both normal and exceptional operation
![Page 17: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/17.jpg)
1715‐214
Guidelines for using exceptions
• Catch and handle all checked exceptions– Unless there is no good way to do so…
• Use runtime exceptions for programming errors• Other good practices
– Do not catch an exception without (at least somewhat) handling the error
– When you throw an exception, describe the error– If you re‐throw an exception, always include the original exception as the cause
![Page 18: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/18.jpg)
1815‐214
Testing for presence of an exceptionimport org.junit.*;import static org.junit.Assert.fail;
public class Tests {
@Testpublic void testSanityTest(){
try {openNonexistingFile();fail("Expected exception");
} catch(IOException e) { }}
@Test(expected = IOException.class)public void testSanityTestAlternative() {
openNonexistingFile();}
}
![Page 19: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/19.jpg)
1915‐21419
How to test failure to compute a route?
![Page 20: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/20.jpg)
2015‐21420
How to test behavior for missing routes file?
![Page 21: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/21.jpg)
2115‐214
DESIGN PRINCIPLE: MODULAR PROTECTION
21
![Page 22: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/22.jpg)
2215‐214
Modular Protection
• Errors and bugs unavoidable, but exceptions should not leak across modules (methods, classes), if possible
• Good modules handle exceptional conditions locally– Local input validation and local exception handling where possible
– Explicit interfaces with clear pre/post conditions– Explicitly documented and checked exceptions where exceptional conditions may propagate between modules
– Information hiding/encapsulation of critical code (likely bugs, likely exceptions)
![Page 23: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/23.jpg)
2315‐214
Examples
• Printer crash should not corrupt entire system– E.g., printer problem handled locally, logged, user informed
• Exception/infinite loop in Pine Simulation should not freeze GUI– E.g., decouple simulation from UI
• Error in shortest‐path algorithm should not corrupt graph– E.g., computation on immutable data structure
23
![Page 24: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/24.jpg)
2415‐21424
What happens with incorrect entries in routes file?What happens if the routes file missing?
What happens when getEntities returns null?
![Page 25: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/25.jpg)
2515‐21425
Where and how to handle invalid routes?
![Page 26: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/26.jpg)
2615‐214
TESTING WITH COMPLEX ENVIRONMENTS
26
![Page 27: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/27.jpg)
2715‐214
Problems when testing (sub‐)systems
• User interfaces and user interactions– Users click buttons, interpret output– Waiting/timing issues
• Test data vs. real data• Testing against big infrastructure (databases, web services, …)
• Testing with side effects (e.g., printing and mailing documents)
• Nondeterministic behavior• Concurrency (more later in the semester)
-> the test environment
![Page 28: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/28.jpg)
2815‐214
Example
• 3rd party Route Planning app for Android
• User interface for Android
• Internal computationsala HW2
• Backend withPAT live data
Tiramisu App
![Page 29: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/29.jpg)
2915‐214
Example
• 3rd party Facebook apps for Android
• User interface for Android• Internal computationsala HW1
• Backend withFacebook data
![Page 30: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/30.jpg)
3015‐214
Testing in real environmentsCodeFacebook Android
client
void buttonClicked() {render(getFriends());
}Pair[] getFriends() {
Connection c = http.getConnection();FacebookAPI api = new FacebookAPI(c);try {
List<Node> persons = api.getFriends("john");for (Node personA: persons) {
for (Node personB: persons) {…
}}} catch (…) { … } return result;
}
![Page 31: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/31.jpg)
3115‐214
Test driversCodeFacebook Android client
@Test void testGetFriends() {assert getFriends() == …;
}Pair[] getFriends() {
Connection c = http.getConnection();FacebookAPI api = new FacebookAPI(c);try {
List<Node> persons = api.getFriends("john");for (Node personA: persons) {
for (Node personB: persons) {…
}}} catch (…) { … } return result;
}
Test driver (JUnit)
![Page 32: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/32.jpg)
3215‐214
StubsCodeFacebook
InterfaceAndroid client
FacebookInterface fb;@Before void init() {fb = new FacebookStub(); }
Pair[] getFriends() {try {
List<Node> persons = api.getFriends("john");for (Node personA: persons) {
for (Node personB: persons) {…
}}} catch (…) { … } return result;
}
Test driver (JUnit)
Stub
class FacebookStub implements FacebookInterface {void connect() {}List<Node> getPersons(String name) {
if ("john".equals(n)) {List<Node> result=new List();result.add(…);return result;
}}
}
![Page 33: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/33.jpg)
3315‐214
Robustness test
CodeFacebookInterface
Android client
class ConnectionError implements FacebookInterface {List<Node> getPersons(String name) {
throw new HttpConnectionException();}
}
@Test void testConnectionError() {assert getFriends(new ConnectionError()) == null;
}
Test driver (JUnit)
Stub
Test for expected error conditions by introducing artificial errors through stubs
ConnectionError
![Page 34: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/34.jpg)
3415‐214
Testing in real environments
• Separating code (with stubs) allows us to test against functionality – provided by other teams– specified, but not yet implemented
CodeServer Backend(tbd.)
Android client
![Page 35: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/35.jpg)
3515‐214
Testing Strategies in Environments
• Separate business logic and data representation from GUI for testing (more later)
• Test algorithms locally without large environment using stubs
• Advantages of stubs– Create deterministic response– Can reliably simulate spurious states (e.g. network error)– Can speed up test execution (e.g. avoid slow database)– Can simulate functionality not yet implemented
• Automate, automate, automate
![Page 36: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/36.jpg)
3615‐214
Design Implications • Write testable code!• When planning to test with a stub design for it! Abstract the actual subsystem behind an interface.
int getFreeTime() {MySQLImpl db = new MySQLImpl("calendar.db");return db.execute("select …");
} int getFreeTime() {DatabaseInterface db =
databaseFactory.createDb("calendar.db");return db.execute("select …");
}int getFreeTime(MySQLImpl db) {
return db.execute("select …");} int getFreeTime(DatabaseInterface db) {
return db.execute("select …");}
![Page 37: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/37.jpg)
3715‐21437
How to test boarding delays without running the full
simulation?
How to test bus delays despite randomness?
![Page 38: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/38.jpg)
3815‐214 38
Stub Unit Driver
Scaffolding• Catch bugs early: Before client code or services
are available• Limit the scope of debugging: Localize errors• Improve coverage
– System‐level tests may only cover 70% of code [Massol]– Simulate unusual error conditions – test internal robustness
• Validate internal interface/API designs– Simulate clients in advance of their development – Simulate services in advance of their development
• Capture developer intent (in the absence of specification documentation)– A test suite formally captures elements of design intent– Developer documentation
• Improve low‐level design– Early attention to ability to test – “testability”
![Page 39: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/39.jpg)
3915‐214
More Testing in 313
• Manual testing• Security testing, penetration testing• Fuzz testing for reliability• Usability testing• GUI/Web testing• Regression testing• Differential testing• Stress/soak testing
39
![Page 40: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/40.jpg)
4015‐214
DESIGN PATTERN: PROXY
40
![Page 41: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/41.jpg)
4115‐214
Problem: Getting Facebook Friends• Assume we have an interface for getting friends from Facebook
• We want to apply some enhancements– Cache friends for quicker access– Use cache when service is down– …
• We may want to enable/disable the cache, and maybe add more enhancements latter– How can we make this easy?
41
![Page 42: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/42.jpg)
4215‐214
Example: Caching
42
interface FacebookAPI {List<Node> getFriends(String name);
}class FacebookProxy implements FacebookAPI {
FacebookAPI api;HashMap<String,List<Node>> cache = new HashMap…FacebookProxy(FacebookAPI api) { this.api=api;}
List<Node> getFriends(String name) {result = cache.get(name);if (result == null) {
result = api.getFriends(name);cache.put(name, result);
}return result;
}}
![Page 43: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/43.jpg)
4315‐214
Proxy Design Pattern
43
• Applicability– Whenever you need a
more sophisticated object reference than a simple pointer
– Local representative for a remote object
– Create or load expensive object on demand
– Control access to an object– Extra error handling, failover– Caching– Reference count an object
• Consequences– Introduces a level of indirection– Hides distribution from client– Hides optimizations from client– Adds housekeeping tasks
![Page 44: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/44.jpg)
4415‐214
Example: Caching and Failover
44
interface FacebookAPI {List<Node> getFriends(String name);
}class FacebookProxy implements FacebookAPI {
FacebookAPI api;HashMap<String,List<Node>> cache = new HashMap…FacebookProxy(FacebookAPI api) { this.api=api;}
List<Node> getFriends(String name) {try {
result = api.getFriends(name);cache.put(name, result);return result;
} catch (ConnectionException c) {return cache.get(name);
}}
![Page 45: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/45.jpg)
4515‐214
Example: Redirect to Local Service
45
interface FacebookAPI {List<Node> getFriends(String name);
}class FacebookProxy implements FacebookAPI {
FacebookAPI api;FacebookAPI fallbackApi;FacebookProxy(FacebookAPI api, FacebookAPI f) {
this.api=api; fallbackApi = f; }
List<Node> getFriends(String name) {try {
return api.getFriends(name);} catch (ConnectionException c) {
return fallbackApi.getFriends(name);}
}Further alternatives: other error handling, redirect to
other/local service, default values, etc
![Page 46: Principles of Software Construction: Design, and …charlie/courses/15-214/2015-fall/slides/03... · – Waiting/timing issues ... Stub class FacebookStub implements FacebookInterface](https://reader034.fdocuments.in/reader034/viewer/2022051803/5affaf0b7f8b9a684990222c/html5/thumbnails/46.jpg)
4615‐214
Summary
• Design for Robustness as Design Goal• Explicit Interfaces as Design Principle
– Error handling explicit in interfaces (declared exceptions, return types)
– Exceptions in Java as supporting language mechanism• Modular Protection as Design Principle
– Handle Exceptions Locally• Local testing with stubs and drivers• Proxy design pattern for separate error handling
46