1 / 47

Practices of Good Component Design

Practices of Good Component Design. Microsoft Research Asia Advanced Technology. Introduction. Barn-Wan Li Born in Toronto, Canada B.A., University of California, Berkeley Microsoft Silicon Valley Campus Microsoft Research Asia, Beijing. Software Components. Conceptualized in the 60s

alain
Download Presentation

Practices of Good Component Design

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Practices of Good Component Design Microsoft Research Asia Advanced Technology

  2. Introduction • Barn-Wan Li • Born in Toronto, Canada • B.A., University of California, Berkeley • Microsoft Silicon Valley Campus • Microsoft Research Asia, Beijing

  3. Software Components • Conceptualized in the 60s • Improve encapsulation and reuse

  4. Software Components • Conceptualized in the 60s • Improve encapsulation and reuse

  5. Software Components • Conceptualized in the 60s • Improve encapsulation and reuse PowerPoint Word Excel OfficeArt Drawing

  6. How is a Component different than an Object? • Object-oriented Programming History • created in the 60s • real-world modeling and metaphors • microcosm of objects with messages

  7. How is a Component different than an Object? • Object-oriented Programming History • created in the 60s • real-world modeling and metaphors • microcosm of objects with messages • the promise of the 80s • combining the concept of components for abstraction and reuse

  8. How is a Component different than an Object? • Object-oriented Programming History • created in the 60s • real-world modeling and metaphors • microcosm of objects with messages • the promise of the 80s • combining the concept of components for abstraction and reuse • fear in the 90s • fragile software reuse with objects

  9. Inheritance for Reuse • class Car • { • };

  10. Inheritance for Reuse • class Car • { • };

  11. Inheritance for Reuse • class Car • { • }; • class Racecar : public Car • { • }; • class Truck : public Car • { • }; • class Taxi : public Car • { • };

  12. Inheritance for Reuse • class Truck • { • };

  13. Inheritance for Reuse • class Truck • { • }; • class FireHydrant • { • }; • class FireTruck : • public Truck, • public FireHydrant • { • };

  14. Inheritance for Reuse X • class Truck • { • }; • class FireHydrant • { • }; • class FireTruck : • public Truck, • public FireHydrant • { • };

  15. Inheritance for Reuse • polymorphism • incremental behavior changes • self-recursive down-calls

  16. Inheritance for Reuse • polymorphism • incremental behavior changes • self-recursive down-calls class Car { void Stop() { SayMessage(); } virtual void SayMessage() { cout << “Bye!” << endl; } }; class Taxi : public Car { virtual void SayMessage() { cout << “50 RMB please” << endl; } };

  17. Inheritance for Reuse

  18. Inheritance for Reuse

  19. Inheritance for Reuse • breaks encapsulation • breaks data hiding • breaks implementation hiding • compile-time and run-time dependencies • syntactic and semantic fragility

  20. class LinkList { … }; class MyObjList : public LinkList { … }; Reuse and Sharing - Templates

  21. template <class T> class LinkList { … T *operator -> () { return &m_t; } T m_t; }; class MyObj { … }; typedef LinkList<MyObj> MyObjList; class LinkList { … }; class MyObjList : public LinkList { … }; Reuse and Sharing - Templates

  22. class LinkList { … }; class MyObjList : public LinkList { … }; class MyObjTree : public BinTree { … }; template <class T> class LinkList { … T *operator -> () { return &m_t; } T m_t; }; class MyObj { … }; typedef LinkList<MyObj> MyObjList; typedef BinTree<MyObj> MyObjTree; Reuse and Sharing - Templates

  23. class LinkList { }; class MyObjList : public LinkList { }; class MyObjTree : public BinTree { }; class MyObjList : public MyObj, public LinkList { }; template <class T> class LinkList { … T *operator -> () { return &m_t; } T m_t; }; class MyObj { … }; typedef LinkList<MyObj> MyObjList; typedef BinTree<MyObj> MyObjTree; Reuse and Sharing - Templates

  24. class LinkList { }; class MyObjList : public LinkList { }; class MyObjTree : public BinTree { }; class MyObjList : public MyObj, public LinkList { }; template <class T> class LinkList { … T *operator -> () { return &m_t; } T m_t; }; class MyObj { … }; typedef LinkList<MyObj> MyObjList; typedef BinTree<MyObj> MyObjTree; Reuse and Sharing - Templates X

  25. Reuse and Sharing - Containment • class LinkList • { • … • void Set(Object *pobj) { m_pObject = pobj; } • Object *Get() { return m_pObject; } • Object *m_pObject; • }; • class Object • { • … • Object() { m_linklist.Set(pobj); } • Object *Next() { return m_linklist.Next().Get(); } • … • LinkList m_listlist; • };

  26. What is a Component • different layers • within a single system • sharable library • crossing application boundaries • crossing system boundaries • encapsulation and abstraction

  27. How is a Component Design “Good”? • the component’s interface upholds a clear “contract”. • changes to the implementation of the component do not require changes in the code that uses it. • the component has reuse value when the time required to understand and integrate for a new user is faster and easier than to rewrite it.

  28. Life-time of a Component • conception of an abstract layer, a sharable service, or a piece of code that has reuse value • understanding the requirements and limitations • designing the interfaces • implementation • creating the user of the component that wraps and tests the implementation

  29. Example – Face Detection • BOOL DetectFace(HBITMAP image, CArray<RECT> &faces, CArray<long> &angles);

  30. Example – Face Detection • BOOL DetectFace(HBITMAP image, CArray<RECT> &faces, CArray<long> &angles); • BOOL DetectFace(HBITMAP image, int &facenum, RECT *faces[], long *angles[]);

  31. Example – Face Detection • BOOL DetectFace(HBITMAP image, CArray<RECT> &faces, CArray<long> &angles); • BOOL DetectFace(HBITMAP image, int &facenum, RECT *faces[], long *angles[]); • ULONG DetectFaceNumber(HBITMAP image); • BOOL DetectFace(HBITMAP image, int index, RECT *face, long *angle);

  32. Example – Face Detection • BOOL DetectFace(HBITMAP image, CArray<RECT> &faces, CArray<long> &angles); • BOOL DetectFace(HBITMAP image, int &facenum, RECT *faces[], long *angles[]); • ULONG DetectFaceNumber(HBITMAP image); • BOOL DetectFace(HBITMAP image, int index, RECT *face, long *angle); • BOOL DetectFace(HDC image, int width, int height, int index, RECT *face, long *angle); • BOOL DetectFace(void pvBits, int width, int height, int bitsperpixel, int index, RECT *face, long *angle);

  33. Introducing COM • Component Object Model • interface == pure virtual class • may be more than one object • language independent interface IUnknown { ULONG AddRef(); // reference counting ULONG Release(); HRESULT QueryInterface(); // dynamic casting }

  34. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; Face Detection Interface

  35. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; interface IFDImage { HRESULT SetHBitmap(HBITMAP bitmap); HRESULT SetHDC(HDC image, int width, int height); HRESULT SetBits(void pvBits, int width, int height, int bitsperpixel); }; Face Detection Interface

  36. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; interface IFDImage { HRESULT SetHBitmap(HBITMAP bitmap); HRESULT SetHDC(HDC image, int width, int height); HRESULT SetBits(void pvBits, int width, int height, int bitsperpixel); }; interface IFDFaceEnum { HRESULT GetNum(ULONG *pNum); HRESULT GetFace(int index, IFDFace **pFace); }; Face Detection Interface

  37. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; interface IFDImage { HRESULT SetHBitmap(HBITMAP bitmap); HRESULT SetHDC(HDC image, int width, int height); HRESULT SetBits(void pvBits, int width, int height, int bitsperpixel); }; interface IFDFaceEnum { HRESULT GetNum(ULONG *pNum); HRESULT GetFace(int index, IFDFace **pFace); }; interface IFDFace { HRESULT GetRect(RECT *pRect); HRESULT GetAngle(long *pAngle); }; Face Detection Interface

  38. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; interface IFDImage { HRESULT SetHBitmap(HBITMAP bitmap); HRESULT SetHDC(HDC image, int width, int height); HRESULT SetBits(void pvBits, int width, int height, int bitsperpixel); }; interface IFDFaceEnum { HRESULT GetNum(ULONG *pNum); HRESULT GetFace(int index, IFDFace **pFace); }; interface IFDFace { HRESULT GetRect(RECT *pRect); HRESULT GetAngle(long *pAngle); HRESULT GetLeftEye(RECT *pRect); HRESULT GetRightEye(RECT *pRect); HRESULT GetAccuracy(long *pPercent); }; Face Detection Interface

  39. Face Detection Interface Application Face Detection Component

  40. Face Detection Interface Application IFDImage IFaceDetector IFDFaceEnum IFDFace Face Detection Component

  41. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; Face Detection Implementation

  42. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; class CFaceDetector : public IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; Face Detection Implementation

  43. interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; class CFaceDetector : public IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; Face Detection Implementation HRESULT CFaceDetector::Detect(IFDImage *pImage, IFDFaceEnum **ppFaces) { if (pImage == NULL || ppResult == NULL) return E_INVALIDARG; : * ppFaces = new CFDFaceEnum; return E_SUCCESS; }

  44. void main() { CComPtr<IFaceDetector> pDetector; pDetector.CreateInstance( CLSID_FaceDetector); : CComPtr<IFDFaceEnum> pResult; pDetector->Detect(pImage, pResult); : } interface IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; class CFaceDetector : public IFaceDetector { HRESULT Detect(IFDImage *pImage, IFDFaceEnum **ppFaces); }; Face Detection Usage

  45. Face Detection Interface Application IFDImage IFaceDetector IFDFaceEnum IFDFace CFaceDetector CFDFaceEnum CFDFace Face Detection Component

  46. Tips for Authoring a Component • know your callers • check for parameter errors at external APIs , assert for internal • avoid allocating memory that the caller must free • use existing types-- or create your own abstract interfaces • aggregate types for reuse or to hide complexity

More Related