Title: COTS Challenges for Embedded Systems
1E81 CSE 532S Advanced Multi-Paradigm Software
Development
Wrapper Façade Pattern
Chris Gill, Ryan Cooper, Gene Tien Department of
Computer Science and Engineering Washington
University, St. Louis cdgill_at_cse.wustl.edu
2Continued Reading Assignment
- CNPv1 Chapter 3
- Optional POSA 2 pp. 47-74
3Wrapper Facade
- Encapsulates functions and data
- Adapts existing procedural APIs
- Offers better interfaces
- Concise, maintainable
- Robust, portable
- Cohesive, object-oriented
ACE_IPC_SAP
ACE_SOCK
ACE_SPIPE
ACE_SOCK_Stream
ACE_SOCK_Dgram
4Wrapper Façade Intent Why?
- To protect the application programmer from
worrying about platform-specific APIs - Â To simplify use of the APIs (less
tedious/error-prone) - To do this while paying only a small
performance cost - Â Other related patterns have different intents
- Façade
- Decorator
- Bridge
- Adapter
5Wrapper Façade Context When?
- When extensibility can be achieved at a suitably
low cost (vs. direct use of API) - When extensibility is more important than
performance improvements - Other design patterns can give even more
significant flexibility improvements, but the
performance costs often increase as well - E.g., the Extension Interface pattern
6Wrapper Façade Context Where?
ACE_INLINE ACE_thread_t ACE_OSthr_self
(void) // ACE_OS_TRACE ("ACE_OSthr_self")
if defined (ACE_HAS_THREADS) if defined
(ACE_HAS_PTHREADS) // Note, don't use "" here
since the // following call is often a macro.
ACE_OSCALL_RETURN (pthread_self (), int, -1)
elif defined (ACE_HAS_STHREADS)
ACE_OSCALL_RETURN (thr_self (), int, -1)
elif defined (ACE_HAS_WTHREADS) return
GetCurrentThreadId () elif defined
(ACE_PSOS) // there does not appear to be a way
to get // a task's name other than at creation
return 0 elif defined (VXWORKS) return
taskName (taskIdSelf ()) endif /
ACE_HAS_STHREADS / else return 1 // Might as
well make it the first thread -) endif /
ACE_HAS_THREADS /
- Most commonly used with networking, threading,
and other low-level APIs
7Wrapper Façade Implementation How? (from POSA2)
- Identify cohesive abstractions and relationships
among low level APIs - E.g., Every IPC SAP has a handle and every
socket is an IPC SAP, but not every IPC SAP is a
socket.
8Wrapper Façade Implementation, cont.
2. Cluster cohesive groups of functions into
wrapper façade classes and methods 2.1 -
Create cohesive classes 2.2 - Coalesce multiple
individual functions into a single method (e.g.,
bind/listen) 2.3 - Automate creation and
destruction 2.4 - Select level of
indirection 2.5 - Determine where to
encapsulate platform-specifics
9Wrapper Façade Implementation, cont.
- 3. Consider allowing selective access to some
implementation details, e.g., ACE_IPC_SAPget_han
dle() is a controlled violation of
encapsulation. - 4. Develop error handling (language support for
features such as exceptions may matter) - 5. Define related helper classes
10Example Thread Management
- Â Thread_Mutex, Thread_Condition, Thread_Manager
- Â Automatic creation, initialization and
destruction - Â Extensible templates parameterized by mutex
types
11Common Problems and Issues
- Exceptions
- Language support
- Different ways of handling
- Resource management (e.g., memory leaks in C)
- Overhead
- Loss of functionality
- Poor cross-language support
- Performance costs relative to application needs
12For Discussion
-  What problem is addressed by the Wrapper Façade
pattern? - Compare and contrast socket programming code
with and without ACE. -  How can wrapper façade increase type safety? At
the same time, how can it increase type
compatibility?