Extending a Base Product For Multiple Customers

111
ESUG 2012 Extending a Base Product for Multiple Customers Denis Defreyne MediaGeniX NG 1

description

ESUG 2012, Ghent

Transcript of Extending a Base Product For Multiple Customers

Page 1: Extending a Base Product For Multiple Customers

ESUG 2012

Extending a Base Product for Multiple Customers

Denis DefreyneMediaGeniX NG

1

Page 2: Extending a Base Product For Multiple Customers

2

Page 3: Extending a Base Product For Multiple Customers

“ Your product is cool,but it’s missing feature X!

3

— CUSTOMER

Page 4: Extending a Base Product For Multiple Customers

“Yes, feature X would be nice…for you, but nobody else!

4

— YOU

Page 5: Extending a Base Product For Multiple Customers

“Why did you notimplement feature X? :(

5

— CUSTOMER

Page 6: Extending a Base Product For Multiple Customers

“Ugh, this product isgetting bloated! :(

6

— OTHER CUSTOMER

Page 7: Extending a Base Product For Multiple Customers

Contents

1. Customisations2. Techniques3. Modules

7

Page 8: Extending a Base Product For Multiple Customers

1. Customisations

8

Page 9: Extending a Base Product For Multiple Customers

Customisation =extra bits of code

for a single customer

9

Page 10: Extending a Base Product For Multiple Customers

Customisations

10

‣ New functionalitye.g. new issue checks (no porn at noon)

‣ Extended functionalitye.g. extra metadata on films, contracts, …

‣ Changed functionalitye.g. parental rating management in UK, Finland

Page 11: Extending a Base Product For Multiple Customers

Integrations

11

‣ Playout server‣ Commercial scheduling system‣ Music scheduling system‣ …

unique for every customer!

Page 12: Extending a Base Product For Multiple Customers

Customisations areonly possible if you

have FEW customers

12

Page 13: Extending a Base Product For Multiple Customers

Requirements

‣ Be customer-specific‣ Be fine-grained‣ Allow merging bugfixes‣ Be decoupled

13

Page 14: Extending a Base Product For Multiple Customers

Why?

14

‣ Talk to other devicesYou’ll have static on your TV otherwise

‣ Cater to a diverse marketNo two broadcasters have the same workflow

‣ Resolve conflicting requirementsDon’t compromise, let them both have it their way

‣ Make customers happy!But don’t over-do it :)

Page 15: Extending a Base Product For Multiple Customers

15

Page 16: Extending a Base Product For Multiple Customers

2. Techniques

16

Page 17: Extending a Base Product For Multiple Customers

Techniques

17

1. Site classes2. Behaviors3. Convenience methods

Page 18: Extending a Base Product For Multiple Customers

Techniques

18

1. Site classes2. Behaviors3. Convenience methods

Page 19: Extending a Base Product For Multiple Customers

Site classes – example

19

Page 20: Extending a Base Product For Multiple Customers

Site classes – example

20

Page 21: Extending a Base Product For Multiple Customers

Site class =subclass for one

specific customer

21

Page 22: Extending a Base Product For Multiple Customers

Site = customer

22

Page 23: Extending a Base Product For Multiple Customers

Site classes

23

Film

Page 24: Extending a Base Product For Multiple Customers

Site classes

24

Film

FilmMTV

Page 25: Extending a Base Product For Multiple Customers

MTV

Site classes

25

Film  class  >>  siteClassForMTV

^FilmMTV

Page 26: Extending a Base Product For Multiple Customers

BASE

Site classes

26

newAustinPowersFilm

^Film  siteClass  newtitle:  'Adventures  at  ESUG';duration:  (Duration  fromMinutes:  93);yourself

Page 27: Extending a Base Product For Multiple Customers

WHATS’On code for MTV only

Packages

27

MTV

BASE

FRAMEWORK

WHATS’On code shared between customers

MediaGeniX framework code

Page 28: Extending a Base Product For Multiple Customers

Packages

28

MTV

VTM

VRT

TV2NRK

SBS FI NPO

VPRO

PRO7

FOX FTO …

Page 29: Extending a Base Product For Multiple Customers

Extensions in packages

29

PACKAGE A

MusicClipMusicClip>>titleMusicClip>>videoFileMusicClip>>audioFileMusicClip>>is16Plus

PACKAGE B

MusicClip>>contractMusicClip>>agency

ContractAgreement

Page 30: Extending a Base Product For Multiple Customers

MTV

Site classes

30

Film  class  >>  siteClassForMTV

^FilmMTV

Page 31: Extending a Base Product For Multiple Customers

Site classes

31

BASE

FilmMusicClipCommercial

MTV

FilmMTV

Film>>siteClassForMTV

Page 32: Extending a Base Product For Multiple Customers

Film  >>  siteClassForMTV

Film  siteClass  new

32

Page 33: Extending a Base Product For Multiple Customers

FRAMEWORK

Site classes

33

Class  >>  siteClass^Site  current  siteClassOf:  self

 

Page 34: Extending a Base Product For Multiple Customers

MTV

Site classes

34

SiteMTV  >>  siteClassOf:  aClass^aClass  siteClassForMTV

   

Page 35: Extending a Base Product For Multiple Customers

BASE

Site classes

35

Site  >>  siteClassOf:  aClass^aClass

Page 36: Extending a Base Product For Multiple Customers

BASE

Site classes – example

36

Film  class  >>  buildSuperModelWith:  aBuilder

super  buildSuperModelWith:  aBuilder.

aBuilderaddString:  #title  name:  'Title';addDuration:  #duration  name:  'Duration'

Page 37: Extending a Base Product For Multiple Customers

37

Page 38: Extending a Base Product For Multiple Customers

BASE

Site classes – example

38

Film  class  >>  buildSuperModelWith:  aBuilder

super  buildSuperModelWith:  aBuilder.

aBuilderaddString:  #title  name:  'Title';addDuration:  #duration  name:  'Duration'

Page 39: Extending a Base Product For Multiple Customers

MTV

Site classes – example

39

FilmMTV  class  >>  buildSuperModelWith:  aBuilder

super  buildSuperModelWith:  aBuilder.

aBuilderaddString:  #idForMTV  name:  'ID  for  MTV'

Page 40: Extending a Base Product For Multiple Customers

Site classes – example

40

Page 41: Extending a Base Product For Multiple Customers

Site classes – example

41

Page 42: Extending a Base Product For Multiple Customers

BASE

Site classes – example

42

FilmEditor  class  >>  form

^self  newFormaddFormField:  #title;addFormField:  #duration;yourself

Page 43: Extending a Base Product For Multiple Customers

MTV

Site classes – example

43

FilmEditor  >>  siteClassForMTV

^FilmEditorMTV

FilmEditorMTV  class  >>  form

^super  formaddFormField:  #idForMTV;yourself

Page 44: Extending a Base Product For Multiple Customers

Site classes – example

44

Page 45: Extending a Base Product For Multiple Customers

Site classes – example

45

Page 46: Extending a Base Product For Multiple Customers

BASE

Site classes – example

46

FilmEditor  class  >>  form

^self  newFormaddFormField:  #title;addFormField:  #duration;addFormField:  #imdbRating;yourself

Page 47: Extending a Base Product For Multiple Customers

Site classes – example

47

Page 48: Extending a Base Product For Multiple Customers

Site classes – example

48

Page 49: Extending a Base Product For Multiple Customers

BASE

Site classes – example

49

Film  >>  openInEditor

^FilmEditor  siteClassopenWithEditee:  self

Page 50: Extending a Base Product For Multiple Customers

Call #siteClass everywhere?

50

YES!It’s not as bad as you may think…

Page 51: Extending a Base Product For Multiple Customers

PRO TIPAvoid long methods

51

Page 52: Extending a Base Product For Multiple Customers

Techniques

52

1. Site classes2. Behaviors3. Convenience methods

Page 53: Extending a Base Product For Multiple Customers

Behaviors

53

Product

Film Commercial MusicClip

Page 54: Extending a Base Product For Multiple Customers

Product

ProductMTV

Behaviors

54

Page 55: Extending a Base Product For Multiple Customers

Behaviors

55

Product

Film Commercial MusicClip

Page 56: Extending a Base Product For Multiple Customers

Behaviors

56

Product

Film Commercial MusicClip

ProductBehavior

ProductBehaviorMTV

Page 57: Extending a Base Product For Multiple Customers

Behavior class =siteclassable class with

behavior from original class

57

Page 58: Extending a Base Product For Multiple Customers

FRAMEWORK

Behaviors

58

BehaviorObject  class  >>  newOn:  anObject

^self  neworig:  anObject;yourself

Page 59: Extending a Base Product For Multiple Customers

BASE

Behaviors – example

59

Product  >>  hasValidCertForTx:  aTx

^self  certification  isOkayForTx:  aTx

Page 60: Extending a Base Product For Multiple Customers

BASE

Behaviors – example

60

ProductBehavior  >>  hasValidCertForTx:  aTx

^self  orig  certification  isOkayForTx:  aTx

Page 61: Extending a Base Product For Multiple Customers

MTV

Behaviors – example

61

ProductBehaviorMTV  >>  hasValidCertForTx:  aTx

^self  orig  videoFiles  allSatisfy:[:f  |  f  certification  isOkayForTx:  aTx]

Page 62: Extending a Base Product For Multiple Customers

BASE

Behaviors – example

62

Product  >>  hasValidCertForTx:  aTx

^self  behavior  hasValidCertForTx:  aTx

Page 63: Extending a Base Product For Multiple Customers

BASE

Behaviors – example

63

Product  >>  behavior

behavior  ifNil:    [behavior  :=  ProductBehavior  siteClass        newOn:  self].^behavior

Page 64: Extending a Base Product For Multiple Customers

PRO TIP

64

Prefer compositionover inheritance

Page 65: Extending a Base Product For Multiple Customers

Techniques

65

1. Site classes2. Behaviors3. Convenience methods

Page 66: Extending a Base Product For Multiple Customers

Convenience method =commonly implemented

or overridden method

66

Page 67: Extending a Base Product For Multiple Customers

Convenience methods

67

buildSuperModelWith:  aBuilder

addToolsMenuItemsTo:  aMenu

addCommandsToToolBar:  aToolBar

Page 68: Extending a Base Product For Multiple Customers

Convenience methods

68

buildSuperModelWith:  aBuilderbuildSuperModelForMTVWith:  aBuilder

addToolsMenuItemsTo:  aMenuaddToolsMenuItemsForMTVTo:  aMenu

addCommandsToToolBar:  aToolBaraddCommandsToToolBarForMTV:  aToolBar

Page 69: Extending a Base Product For Multiple Customers

MTV

Convenience methods

69

FilmMTV  class  >>  buildSuperModelWith:  aBuilder

super  buildSuperModelWith:  aBuilder.

aBuilderaddString:  #idForMTV  name:  'ID  for  MTV'

Page 70: Extending a Base Product For Multiple Customers

MTV

Convenience methods

70

Film  class  >>  buildSuperModelForMTVWith:  aBuilder

super  buildSuperModelForMTVWith:  aBuilder.

aBuilderaddString:  #idForMTV  name:  'ID  for  MTV'

Page 71: Extending a Base Product For Multiple Customers

FRAMEWORK

Convenience methods

71

Site  >>  buildSuperModelWith:  aBuilder                for:  aClass

aClass  buildSuperModelWith:  aBuilder

Page 72: Extending a Base Product For Multiple Customers

MTV

Convenience methods

72

SiteMTV  >>  buildSuperModelWith:  aBuilder                      for:  aClass

super  buildSuperModelWith:  aBuilder  for:  aClass.

aClass  buildSuperModelForMTVWith:  aBuilder.

Page 73: Extending a Base Product For Multiple Customers

PRO TIP

73

Use convenience methods for common methods only

Page 74: Extending a Base Product For Multiple Customers

Techniques to avoid

‣ BranchesUse them, but not for customer-specific code

‣ VisualWorks “overrides”They prevent access to original code

74

Page 75: Extending a Base Product For Multiple Customers

Techniques

75

1. Site classes2. Behaviors3. Convenience methods

Page 76: Extending a Base Product For Multiple Customers

3. Modules

76

Page 77: Extending a Base Product For Multiple Customers

Module =pluggable componentthat provides a set ofrelated functionalities

77

Page 78: Extending a Base Product For Multiple Customers

Example modules

‣ Contract management‣ Secondary events (logos)‣ Video on demand

78

Page 79: Extending a Base Product For Multiple Customers

BASE

Super models in modules

79

Film  class  >>  buildSuperModelWith:  aBuilder

superbuildSuperModelWith:  aBuilder.

aBuilder"  …  other  attributes  here  …  "addReference:  #contract

to:  Contract  name:  'Contract'

WR

ON

G

Page 80: Extending a Base Product For Multiple Customers

MTV

Activating modules

SiteMTV  >>  moduleClasses

^OrderedCollection  newadd:  ContractModule;add:  SecondaryEventsModule;yourself

80

Page 81: Extending a Base Product For Multiple Customers

Super models in modules

81

Page 82: Extending a Base Product For Multiple Customers

BASE

Super models in modules

82

Film  class  >>buildSuperModelForContractModuleWith:  aBuilder

superbuildSuperModelForContractModuleWith:  aBuilder.

aBuilderaddReference:  #contract

to:  Contract  name:  'Contract'

Page 83: Extending a Base Product For Multiple Customers

FRAMEWORK

Super models in modules

83

Site  >>  buildSuperModelWith:  aBuilder                for:  aClass

aClass  buildSuperModelWith:  aBuilder.

Page 84: Extending a Base Product For Multiple Customers

FRAMEWORK

Super models in modules

84

Site  >>  buildSuperModelWith:  aBuilder                for:  aClass

aClass  buildSuperModelWith:  aBuilder.

self  modules  do:[:m  |m  buildSuperModelWith:  aBuilder  for:  aClass].

Page 85: Extending a Base Product For Multiple Customers

FRAMEWORK

Super models in modules

85

Module  >>  buildSuperModelWith:  aBuilder                    for:  aClass

"nothing  by  default"

Page 86: Extending a Base Product For Multiple Customers

BASE

Super models in modules

86

ContractPresentModule  >>  buildSuperModelWith:  aBuilder                                                  for:  aClass

aClass  buildSuperModelForContractModuleWith:aBuilder.

Page 87: Extending a Base Product For Multiple Customers

Extensions in modules

87

Page 88: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

88

FilmEditor  class  >>  form

form  :=  self  newForm.form  addFormField:  #title.form  addFormField:  #duration.^form

Page 89: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

89

FilmEditor  class  >>  form

form  :=  self  newForm.form  addFormField:  #title.form  addFormField:  #duration.form  addFormField:  #contract.^form

WR

ON

G

Page 90: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

90

FilmEditor  class  >>  form

form  :=  self  newForm.form  addFormField:  #title.form  addFormField:  #duration.ContractModule  current

addFieldsTo:  form  for:  self.^form

Page 91: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

91

ContractPresentModule  >>    addFieldsTo:  aForm    for:  anEditor

anEditor  addContractFieldsTo:  aForm

Page 92: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

92

FilmEditor  >>    addContractFieldsTo:  aForm

   aForm  addFormField:  #contract.

Page 93: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

93

ContractAbsentModule  >>    addFieldsTo:  aForm    for:  aSender

   "nothing  by  default"

Page 94: Extending a Base Product For Multiple Customers

Extensions in modules

94

CONTRACT

Page 95: Extending a Base Product For Multiple Customers

Extensions in modules

95

CONTRACT

Page 96: Extending a Base Product For Multiple Customers

Site classes vs. modules

96

‣ Modules can be shared across sites

‣ Modules require hooks

Page 97: Extending a Base Product For Multiple Customers

Recap

97

Page 98: Extending a Base Product For Multiple Customers

Techniques

98

‣ Use site classeswhenever possible

‣ Use behaviorswhen site classes fail (inheritance trees)

‣ Use moduleswhen you need more separation

Page 99: Extending a Base Product For Multiple Customers

Requirements

‣ Be customer-specific (with packages)‣ Be fine-grained (with site classes)‣ Allow merging bugfixes (with packages)‣ Be decoupled (with site classes and modules)

99

Page 100: Extending a Base Product For Multiple Customers

100

“ Your product is cool,but it’s missing feature X!

— CUSTOMER

“ Do not worry.We’ll implement it for you!

— YOU

Page 101: Extending a Base Product For Multiple Customers

101

? MAIL [email protected] TWITTER @ddfreyne GITHUB github.com/ddfreyne

Page 102: Extending a Base Product For Multiple Customers

Extra Slides

102

Page 103: Extending a Base Product For Multiple Customers

FRAMEWORK

Site classing modules

103

Site  >>  modules

^self  moduleClasses  collect:[:c  |  c  siteClass  new]

Page 104: Extending a Base Product For Multiple Customers

FRAMEWORK

Site classing modules

104

SuperModellary  >>  buildSuperModelFor:  aClass

   builder  :=  SuperModelBuilder  new.

   Site  current  buildSuperModelWith:  builder        for:  aClass.

   supermodels  at:  aClass  put:  builder  superModel.

Page 105: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

105

FilmEditor  class  >>  form

form  :=  self  newForm.form  addFormField:  #title.form  addFormField:  #duration.ContractModule  current

addFieldsTo:  form  for:  self.^form

Page 106: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

106

FilmEditor  class  >>  form

form  :=  self  newForm.form  addFormField:  #title.form  addFormField:  #duration.ContractModule  current  isAvailable  ifTrue:

[form  addFormField:  #contract].^form

Page 107: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

107

Film  >>  isLegallyBroadcastable

^ContractModule  current  isAvailableifFalse:  [true]ifTrue:  [self  contract  isSigned].

Page 108: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

108

Film  >>  isLegallyBroadcastable

^ContractModule  current  isAvailableifFalse:  [true]ifTrue:  [self  contract  isSigned].

Page 109: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

109

Film  >>  isLegallyBroadcastable

^ContractModule  currentisFilmLegallyBroadcastable:  self

Page 110: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

110

ContractPresentModule  >>    isFilmLegallyBroadcastable:  aFilm

^aFilm  contract  isSigned

Page 111: Extending a Base Product For Multiple Customers

BASE

Extensions in modules

111

ContractAbsentModule  >>    isFilmLegallyBroadcastable:  aFilm

^true