Extending a Base Product for Multiple Customers Denis Defreyne - - PowerPoint PPT Presentation

extending a base product for multiple customers
SMART_READER_LITE
LIVE PREVIEW

Extending a Base Product for Multiple Customers Denis Defreyne - - PowerPoint PPT Presentation

ESUG 2012 Extending a Base Product for Multiple Customers Denis Defreyne MediaGeniX NG 1 2 Your product is cool, but its missing feature X! CUSTOMER 3 Yes, feature X would be nice for you, but nobody else! YOU 4


slide-1
SLIDE 1 ESUG 2012

Extending a Base Product for Multiple Customers

Denis Defreyne MediaGeniX NG 1
slide-2
SLIDE 2 2
slide-3
SLIDE 3

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

3 — CUSTOMER
slide-4
SLIDE 4

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

4 — YOU
slide-5
SLIDE 5

Why did you not implement feature X? :(

5 — CUSTOMER
slide-6
SLIDE 6

Ugh, this product is getting bloated! :(

6 — OTHER CUSTOMER
slide-7
SLIDE 7

Contents

  • 1. Customisations
  • 2. Techniques
  • 3. Modules
7
slide-8
SLIDE 8
  • 1. Customisations
8
slide-9
SLIDE 9 Customisation = extra bits of code for a single customer 9
slide-10
SLIDE 10

Customisations

10
  • New functionality
e.g. new issue checks (no porn at noon)
  • Extended functionality
e.g. extra metadata on films, contracts, …
  • Changed functionality
e.g. parental rating management in UK, Finland
slide-11
SLIDE 11

Integrations

11
  • Playout server
  • Commercial scheduling system
  • Music scheduling system
unique for every customer!
slide-12
SLIDE 12 Customisations are
  • nly possible if you
have FEW customers 12
slide-13
SLIDE 13

Requirements

  • Be customer-specific
  • Be fine-grained
  • Allow merging bugfixes
  • Be decoupled
13
slide-14
SLIDE 14

Why?

14
  • Talk to other devices
You’ll have static on your TV otherwise
  • Cater to a diverse market
No two broadcasters have the same workflow
  • Resolve conflicting requirements
Don’t compromise, let them both have it their way
  • Make customers happy!
But don’t over-do it :)
slide-15
SLIDE 15 15
slide-16
SLIDE 16
  • 2. Techniques
16
slide-17
SLIDE 17

Techniques

17
  • 1. Site classes
  • 2. Behaviors
  • 3. Convenience methods
slide-18
SLIDE 18

Techniques

18
  • 1. Site classes
  • 2. Behaviors
  • 3. Convenience methods
slide-19
SLIDE 19

Site classes – example

19
slide-20
SLIDE 20

Site classes – example

20
slide-21
SLIDE 21 Site class = subclass for one specific customer 21
slide-22
SLIDE 22 Site = customer 22
slide-23
SLIDE 23

Site classes

23 Film
slide-24
SLIDE 24

Site classes

24 Film FilmMTV
slide-25
SLIDE 25 MTV

Site classes

25 Film ¡class ¡>> ¡siteClassForMTV ^FilmMTV
slide-26
SLIDE 26 BASE

Site classes

26 newAustinPowersFilm ^Film ¡siteClass ¡new title: ¡'Adventures ¡at ¡ESUG'; duration: ¡(Duration ¡fromMinutes: ¡93); yourself
slide-27
SLIDE 27 WHATS’On code for MTV only

Packages

27 MTV BASE FRAMEWORK WHATS’On code shared between customers MediaGeniX framework code
slide-28
SLIDE 28

Packages

28 MTV VTM VRT TV2 NRK SBS FI NPO VPRO PRO7 FOX FTO …
slide-29
SLIDE 29

Extensions in packages

29 PACKAGE A MusicClip MusicClip>>title MusicClip>>videoFile MusicClip>>audioFile MusicClip>>is16Plus PACKAGE B MusicClip>>contract MusicClip>>agency Contract Agreement
slide-30
SLIDE 30 MTV

Site classes

30 Film ¡class ¡>> ¡siteClassForMTV ^FilmMTV
slide-31
SLIDE 31

Site classes

31 BASE Film MusicClip Commercial MTV FilmMTV Film>>siteClassForMTV
slide-32
SLIDE 32 Film ¡>> ¡siteClassForMTV Film ¡siteClass ¡new 32
slide-33
SLIDE 33 FRAMEWORK

Site classes

33 Class ¡>> ¡siteClass ^Site ¡current ¡siteClassOf: ¡self ¡
slide-34
SLIDE 34 MTV

Site classes

34 SiteMTV ¡>> ¡siteClassOf: ¡aClass ^aClass ¡siteClassForMTV ¡ ¡
slide-35
SLIDE 35 BASE

Site classes

35 Site ¡>> ¡siteClassOf: ¡aClass ^aClass
slide-36
SLIDE 36 BASE

Site classes – example

36 Film ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#title ¡name: ¡'Title'; addDuration: ¡#duration ¡name: ¡'Duration'
slide-37
SLIDE 37 37
slide-38
SLIDE 38 BASE

Site classes – example

38 Film ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#title ¡name: ¡'Title'; addDuration: ¡#duration ¡name: ¡'Duration'
slide-39
SLIDE 39 MTV

Site classes – example

39 FilmMTV ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#idForMTV ¡name: ¡'ID ¡for ¡MTV'
slide-40
SLIDE 40

Site classes – example

40
slide-41
SLIDE 41

Site classes – example

41
slide-42
SLIDE 42 BASE

Site classes – example

42 FilmEditor ¡class ¡>> ¡form ^self ¡newForm addFormField: ¡#title; addFormField: ¡#duration; yourself
slide-43
SLIDE 43 MTV

Site classes – example

43 FilmEditor ¡>> ¡siteClassForMTV ^FilmEditorMTV FilmEditorMTV ¡class ¡>> ¡form ^super ¡form addFormField: ¡#idForMTV; yourself
slide-44
SLIDE 44

Site classes – example

44
slide-45
SLIDE 45

Site classes – example

45
slide-46
SLIDE 46 BASE

Site classes – example

46 FilmEditor ¡class ¡>> ¡form ^self ¡newForm addFormField: ¡#title; addFormField: ¡#duration; addFormField: ¡#imdbRating; yourself
slide-47
SLIDE 47

Site classes – example

47
slide-48
SLIDE 48

Site classes – example

48
slide-49
SLIDE 49 BASE

Site classes – example

49 Film ¡>> ¡openInEditor ^FilmEditor ¡siteClass
  • penWithEditee: ¡self
slide-50
SLIDE 50

Call #siteClass everywhere?

50

YES!

It’s not as bad as you may think…
slide-51
SLIDE 51 PRO TIP

Avoid long methods

51
slide-52
SLIDE 52

Techniques

52
  • 1. Site classes
  • 2. Behaviors
  • 3. Convenience methods
slide-53
SLIDE 53

Behaviors

53 Product Film Commercial MusicClip
slide-54
SLIDE 54 Product ProductMTV

Behaviors

54
slide-55
SLIDE 55

Behaviors

55 Product Film Commercial MusicClip
slide-56
SLIDE 56

Behaviors

56 Product Film Commercial MusicClip ProductBehavior ProductBehaviorMTV
slide-57
SLIDE 57 Behavior class = siteclassable class with behavior from original class 57
slide-58
SLIDE 58 FRAMEWORK

Behaviors

58 BehaviorObject ¡class ¡>> ¡newOn: ¡anObject ^self ¡new
  • rig: ¡anObject;
yourself
slide-59
SLIDE 59 BASE

Behaviors – example

59 Product ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡certification ¡isOkayForTx: ¡aTx
slide-60
SLIDE 60 BASE

Behaviors – example

60 ProductBehavior ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡orig ¡certification ¡isOkayForTx: ¡aTx
slide-61
SLIDE 61 MTV

Behaviors – example

61 ProductBehaviorMTV ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡orig ¡videoFiles ¡allSatisfy: [:f ¡| ¡f ¡certification ¡isOkayForTx: ¡aTx]
slide-62
SLIDE 62 BASE

Behaviors – example

62 Product ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡behavior ¡hasValidCertForTx: ¡aTx
slide-63
SLIDE 63 BASE

Behaviors – example

63 Product ¡>> ¡behavior behavior ¡ifNil: ¡ ¡[behavior ¡:= ¡ProductBehavior ¡siteClass ¡ ¡ ¡ ¡newOn: ¡self]. ^behavior
slide-64
SLIDE 64 PRO TIP 64

Prefer composition

  • ver inheritance
slide-65
SLIDE 65

Techniques

65
  • 1. Site classes
  • 2. Behaviors
  • 3. Convenience methods
slide-66
SLIDE 66 Convenience method = commonly implemented
  • r overridden method
66
slide-67
SLIDE 67

Convenience methods

67 buildSuperModelWith: ¡aBuilder addToolsMenuItemsTo: ¡aMenu addCommandsToToolBar: ¡aToolBar
slide-68
SLIDE 68

Convenience methods

68 buildSuperModelWith: ¡aBuilder buildSuperModelForMTVWith: ¡aBuilder addToolsMenuItemsTo: ¡aMenu addToolsMenuItemsForMTVTo: ¡aMenu addCommandsToToolBar: ¡aToolBar addCommandsToToolBarForMTV: ¡aToolBar
slide-69
SLIDE 69 MTV

Convenience methods

69 FilmMTV ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#idForMTV ¡name: ¡'ID ¡for ¡MTV'
slide-70
SLIDE 70 MTV

Convenience methods

70 Film ¡class ¡>> ¡buildSuperModelForMTVWith: ¡aBuilder super ¡buildSuperModelForMTVWith: ¡aBuilder. aBuilder addString: ¡#idForMTV ¡name: ¡'ID ¡for ¡MTV'
slide-71
SLIDE 71 FRAMEWORK

Convenience methods

71 Site ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelWith: ¡aBuilder
slide-72
SLIDE 72 MTV

Convenience methods

72 SiteMTV ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass super ¡buildSuperModelWith: ¡aBuilder ¡for: ¡aClass. aClass ¡buildSuperModelForMTVWith: ¡aBuilder.
slide-73
SLIDE 73 PRO TIP 73

Use convenience methods for common methods only

slide-74
SLIDE 74

Techniques to avoid

  • Branches
Use them, but not for customer-specific code
  • VisualWorks “overrides”
They prevent access to original code 74
slide-75
SLIDE 75

Techniques

75
  • 1. Site classes
  • 2. Behaviors
  • 3. Convenience methods
slide-76
SLIDE 76
  • 3. Modules
76
slide-77
SLIDE 77 Module = pluggable component that provides a set of related functionalities 77
slide-78
SLIDE 78

Example modules

  • Contract management
  • Secondary events (logos)
  • Video on demand
78
slide-79
SLIDE 79 BASE

Super models in modules

79 Film ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super buildSuperModelWith: ¡aBuilder. aBuilder " ¡… ¡other ¡attributes ¡here ¡… ¡" addReference: ¡#contract to: ¡Contract ¡name: ¡'Contract' W R O N G
slide-80
SLIDE 80 MTV

Activating modules

SiteMTV ¡>> ¡moduleClasses ^OrderedCollection ¡new add: ¡ContractModule; add: ¡SecondaryEventsModule; yourself 80
slide-81
SLIDE 81

Super models in modules

81
slide-82
SLIDE 82 BASE

Super models in modules

82 Film ¡class ¡>> buildSuperModelForContractModuleWith: ¡aBuilder super buildSuperModelForContractModuleWith: ¡aBuilder. aBuilder addReference: ¡#contract to: ¡Contract ¡name: ¡'Contract'
slide-83
SLIDE 83 FRAMEWORK

Super models in modules

83 Site ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelWith: ¡aBuilder.
slide-84
SLIDE 84 FRAMEWORK

Super models in modules

84 Site ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelWith: ¡aBuilder. self ¡modules ¡do: [:m ¡| m ¡buildSuperModelWith: ¡aBuilder ¡for: ¡aClass].
slide-85
SLIDE 85 FRAMEWORK

Super models in modules

85 Module ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass "nothing ¡by ¡default"
slide-86
SLIDE 86 BASE

Super models in modules

86 ContractPresentModule ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelForContractModuleWith: aBuilder.
slide-87
SLIDE 87

Extensions in modules

87
slide-88
SLIDE 88 BASE

Extensions in modules

88 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. ^form
slide-89
SLIDE 89 BASE

Extensions in modules

89 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. form ¡addFormField: ¡#contract. ^form W R O N G
slide-90
SLIDE 90 BASE

Extensions in modules

90 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. ContractModule ¡current addFieldsTo: ¡form ¡for: ¡self. ^form
slide-91
SLIDE 91 BASE

Extensions in modules

91 ContractPresentModule ¡>> ¡ ¡addFieldsTo: ¡aForm ¡ ¡for: ¡anEditor anEditor ¡addContractFieldsTo: ¡aForm
slide-92
SLIDE 92 BASE

Extensions in modules

92 FilmEditor ¡>> ¡ ¡addContractFieldsTo: ¡aForm ¡ ¡aForm ¡addFormField: ¡#contract.
slide-93
SLIDE 93 BASE

Extensions in modules

93 ContractAbsentModule ¡>> ¡ ¡addFieldsTo: ¡aForm ¡ ¡for: ¡aSender ¡ ¡"nothing ¡by ¡default"
slide-94
SLIDE 94

Extensions in modules

94 CONTRACT
slide-95
SLIDE 95

Extensions in modules

95 CONTRACT
slide-96
SLIDE 96

Site classes vs. modules

96
  • Modules can be shared across sites
  • Modules require hooks
slide-97
SLIDE 97

Recap

97
slide-98
SLIDE 98

Techniques

98
  • Use site classes
whenever possible
  • Use behaviors
when site classes fail (inheritance trees)
  • Use modules
when you need more separation
slide-99
SLIDE 99

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
slide-100
SLIDE 100 100

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

— CUSTOMER

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

— YOU
slide-101
SLIDE 101 101

?

MAIL denis.defreyne@mediagenix.tv TWITTER @ddfreyne GITHUB github.com/ddfreyne
slide-102
SLIDE 102

Extra Slides

102
slide-103
SLIDE 103 FRAMEWORK

Site classing modules

103 Site ¡>> ¡modules ^self ¡moduleClasses ¡collect: [:c ¡| ¡c ¡siteClass ¡new]
slide-104
SLIDE 104 FRAMEWORK

Site classing modules

104 SuperModellary ¡>> ¡buildSuperModelFor: ¡aClass ¡ ¡builder ¡:= ¡SuperModelBuilder ¡new. ¡ ¡Site ¡current ¡buildSuperModelWith: ¡builder ¡ ¡ ¡ ¡for: ¡aClass. ¡ ¡supermodels ¡at: ¡aClass ¡put: ¡builder ¡superModel.
slide-105
SLIDE 105 BASE

Extensions in modules

105 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. ContractModule ¡current addFieldsTo: ¡form ¡for: ¡self. ^form
slide-106
SLIDE 106 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
slide-107
SLIDE 107 BASE

Extensions in modules

107 Film ¡>> ¡isLegallyBroadcastable ^ContractModule ¡current ¡isAvailable ifFalse: ¡[true] ifTrue: ¡[self ¡contract ¡isSigned].
slide-108
SLIDE 108 BASE

Extensions in modules

108 Film ¡>> ¡isLegallyBroadcastable ^ContractModule ¡current ¡isAvailable ifFalse: ¡[true] ifTrue: ¡[self ¡contract ¡isSigned].
slide-109
SLIDE 109 BASE

Extensions in modules

109 Film ¡>> ¡isLegallyBroadcastable ^ContractModule ¡current isFilmLegallyBroadcastable: ¡self
slide-110
SLIDE 110 BASE

Extensions in modules

110 ContractPresentModule ¡>> ¡ ¡isFilmLegallyBroadcastable: ¡aFilm ^aFilm ¡contract ¡isSigned
slide-111
SLIDE 111 BASE

Extensions in modules

111 ContractAbsentModule ¡>> ¡ ¡isFilmLegallyBroadcastable: ¡aFilm ^true