Extending a Base Product for Multiple Customers
Denis Defreyne MediaGeniX NG 1Extending a Base Product for Multiple Customers Denis Defreyne - - PowerPoint PPT Presentation
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
“
Your product is cool, but it’s missing feature X!
3 — CUSTOMER“
Yes, feature X would be nice… for you, but nobody else!
4 — YOU“
Why did you not implement feature X? :(
5 — CUSTOMER“
Ugh, this product is getting bloated! :(
6 — OTHER CUSTOMERContents
- 1. Customisations
- 2. Techniques
- 3. Modules
- 1. Customisations
Customisations
10- New functionality
- Extended functionality
- Changed functionality
Integrations
11- Playout server
- Commercial scheduling system
- Music scheduling system
- …
- nly possible if you
Requirements
- Be customer-specific
- Be fine-grained
- Allow merging bugfixes
- Be decoupled
Why?
14- Talk to other devices
- Cater to a diverse market
- Resolve conflicting requirements
- Make customers happy!
- 2. Techniques
Techniques
17- 1. Site classes
- 2. Behaviors
- 3. Convenience methods
Techniques
18- 1. Site classes
- 2. Behaviors
- 3. Convenience methods
Site classes – example
19Site classes – example
20Site classes
23 FilmSite classes
24 Film FilmMTVSite classes
25 Film ¡class ¡>> ¡siteClassForMTV ^FilmMTVSite classes
26 newAustinPowersFilm ^Film ¡siteClass ¡new title: ¡'Adventures ¡at ¡ESUG'; duration: ¡(Duration ¡fromMinutes: ¡93); yourselfPackages
27 MTV BASE FRAMEWORK WHATS’On code shared between customers MediaGeniX framework codePackages
28 MTV VTM VRT TV2 NRK SBS FI NPO VPRO PRO7 FOX FTO …Extensions in packages
29 PACKAGE A MusicClip MusicClip>>title MusicClip>>videoFile MusicClip>>audioFile MusicClip>>is16Plus PACKAGE B MusicClip>>contract MusicClip>>agency Contract AgreementSite classes
30 Film ¡class ¡>> ¡siteClassForMTV ^FilmMTVSite classes
31 BASE Film MusicClip Commercial MTV FilmMTV Film>>siteClassForMTVSite classes
33 Class ¡>> ¡siteClass ^Site ¡current ¡siteClassOf: ¡self ¡Site classes
34 SiteMTV ¡>> ¡siteClassOf: ¡aClass ^aClass ¡siteClassForMTV ¡ ¡Site classes
35 Site ¡>> ¡siteClassOf: ¡aClass ^aClassSite classes – example
36 Film ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#title ¡name: ¡'Title'; addDuration: ¡#duration ¡name: ¡'Duration'Site classes – example
38 Film ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#title ¡name: ¡'Title'; addDuration: ¡#duration ¡name: ¡'Duration'Site classes – example
39 FilmMTV ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#idForMTV ¡name: ¡'ID ¡for ¡MTV'Site classes – example
40Site classes – example
41Site classes – example
42 FilmEditor ¡class ¡>> ¡form ^self ¡newForm addFormField: ¡#title; addFormField: ¡#duration; yourselfSite classes – example
43 FilmEditor ¡>> ¡siteClassForMTV ^FilmEditorMTV FilmEditorMTV ¡class ¡>> ¡form ^super ¡form addFormField: ¡#idForMTV; yourselfSite classes – example
44Site classes – example
45Site classes – example
46 FilmEditor ¡class ¡>> ¡form ^self ¡newForm addFormField: ¡#title; addFormField: ¡#duration; addFormField: ¡#imdbRating; yourselfSite classes – example
47Site classes – example
48Site classes – example
49 Film ¡>> ¡openInEditor ^FilmEditor ¡siteClass- penWithEditee: ¡self
Call #siteClass everywhere?
50YES!
It’s not as bad as you may think…Avoid long methods
51Techniques
52- 1. Site classes
- 2. Behaviors
- 3. Convenience methods
Behaviors
53 Product Film Commercial MusicClipBehaviors
54Behaviors
55 Product Film Commercial MusicClipBehaviors
56 Product Film Commercial MusicClip ProductBehavior ProductBehaviorMTVBehaviors
58 BehaviorObject ¡class ¡>> ¡newOn: ¡anObject ^self ¡new- rig: ¡anObject;
Behaviors – example
59 Product ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡certification ¡isOkayForTx: ¡aTxBehaviors – example
60 ProductBehavior ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡orig ¡certification ¡isOkayForTx: ¡aTxBehaviors – example
61 ProductBehaviorMTV ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡orig ¡videoFiles ¡allSatisfy: [:f ¡| ¡f ¡certification ¡isOkayForTx: ¡aTx]Behaviors – example
62 Product ¡>> ¡hasValidCertForTx: ¡aTx ^self ¡behavior ¡hasValidCertForTx: ¡aTxBehaviors – example
63 Product ¡>> ¡behavior behavior ¡ifNil: ¡ ¡[behavior ¡:= ¡ProductBehavior ¡siteClass ¡ ¡ ¡ ¡newOn: ¡self]. ^behaviorPrefer composition
- ver inheritance
Techniques
65- 1. Site classes
- 2. Behaviors
- 3. Convenience methods
- r overridden method
Convenience methods
67 buildSuperModelWith: ¡aBuilder addToolsMenuItemsTo: ¡aMenu addCommandsToToolBar: ¡aToolBarConvenience methods
68 buildSuperModelWith: ¡aBuilder buildSuperModelForMTVWith: ¡aBuilder addToolsMenuItemsTo: ¡aMenu addToolsMenuItemsForMTVTo: ¡aMenu addCommandsToToolBar: ¡aToolBar addCommandsToToolBarForMTV: ¡aToolBarConvenience methods
69 FilmMTV ¡class ¡>> ¡buildSuperModelWith: ¡aBuilder super ¡buildSuperModelWith: ¡aBuilder. aBuilder addString: ¡#idForMTV ¡name: ¡'ID ¡for ¡MTV'Convenience methods
70 Film ¡class ¡>> ¡buildSuperModelForMTVWith: ¡aBuilder super ¡buildSuperModelForMTVWith: ¡aBuilder. aBuilder addString: ¡#idForMTV ¡name: ¡'ID ¡for ¡MTV'Convenience methods
71 Site ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelWith: ¡aBuilderConvenience methods
72 SiteMTV ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass super ¡buildSuperModelWith: ¡aBuilder ¡for: ¡aClass. aClass ¡buildSuperModelForMTVWith: ¡aBuilder.Use convenience methods for common methods only
Techniques to avoid
- Branches
- VisualWorks “overrides”
Techniques
75- 1. Site classes
- 2. Behaviors
- 3. Convenience methods
- 3. Modules
Example modules
- Contract management
- Secondary events (logos)
- Video on demand
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 GActivating modules
SiteMTV ¡>> ¡moduleClasses ^OrderedCollection ¡new add: ¡ContractModule; add: ¡SecondaryEventsModule; yourself 80Super models in modules
81Super models in modules
82 Film ¡class ¡>> buildSuperModelForContractModuleWith: ¡aBuilder super buildSuperModelForContractModuleWith: ¡aBuilder. aBuilder addReference: ¡#contract to: ¡Contract ¡name: ¡'Contract'Super models in modules
83 Site ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelWith: ¡aBuilder.Super models in modules
84 Site ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelWith: ¡aBuilder. self ¡modules ¡do: [:m ¡| m ¡buildSuperModelWith: ¡aBuilder ¡for: ¡aClass].Super models in modules
85 Module ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass "nothing ¡by ¡default"Super models in modules
86 ContractPresentModule ¡>> ¡buildSuperModelWith: ¡aBuilder ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡for: ¡aClass aClass ¡buildSuperModelForContractModuleWith: aBuilder.Extensions in modules
87Extensions in modules
88 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. ^formExtensions in modules
89 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. form ¡addFormField: ¡#contract. ^form W R O N GExtensions in modules
90 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. ContractModule ¡current addFieldsTo: ¡form ¡for: ¡self. ^formExtensions in modules
91 ContractPresentModule ¡>> ¡ ¡addFieldsTo: ¡aForm ¡ ¡for: ¡anEditor anEditor ¡addContractFieldsTo: ¡aFormExtensions in modules
92 FilmEditor ¡>> ¡ ¡addContractFieldsTo: ¡aForm ¡ ¡aForm ¡addFormField: ¡#contract.Extensions in modules
93 ContractAbsentModule ¡>> ¡ ¡addFieldsTo: ¡aForm ¡ ¡for: ¡aSender ¡ ¡"nothing ¡by ¡default"Extensions in modules
94 CONTRACTExtensions in modules
95 CONTRACTSite classes vs. modules
96- Modules can be shared across sites
- Modules require hooks
Recap
97Techniques
98- Use site classes
- Use behaviors
- Use modules
Requirements
- Be customer-specific (with packages)
- Be fine-grained (with site classes)
- Allow merging bugfixes (with packages)
- Be decoupled (with site classes and modules)
“
Your product is cool, but it’s missing feature X!
— CUSTOMER“
Do not worry. We’ll implement it for you!
— YOU?
MAIL denis.defreyne@mediagenix.tv TWITTER @ddfreyne GITHUB github.com/ddfreyneExtra Slides
102Site classing modules
103 Site ¡>> ¡modules ^self ¡moduleClasses ¡collect: [:c ¡| ¡c ¡siteClass ¡new]Site classing modules
104 SuperModellary ¡>> ¡buildSuperModelFor: ¡aClass ¡ ¡builder ¡:= ¡SuperModelBuilder ¡new. ¡ ¡Site ¡current ¡buildSuperModelWith: ¡builder ¡ ¡ ¡ ¡for: ¡aClass. ¡ ¡supermodels ¡at: ¡aClass ¡put: ¡builder ¡superModel.Extensions in modules
105 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. ContractModule ¡current addFieldsTo: ¡form ¡for: ¡self. ^formExtensions in modules
106 FilmEditor ¡class ¡>> ¡form form ¡:= ¡self ¡newForm. form ¡addFormField: ¡#title. form ¡addFormField: ¡#duration. ContractModule ¡current ¡isAvailable ¡ifTrue: [form ¡addFormField: ¡#contract]. ^formExtensions in modules
107 Film ¡>> ¡isLegallyBroadcastable ^ContractModule ¡current ¡isAvailable ifFalse: ¡[true] ifTrue: ¡[self ¡contract ¡isSigned].Extensions in modules
108 Film ¡>> ¡isLegallyBroadcastable ^ContractModule ¡current ¡isAvailable ifFalse: ¡[true] ifTrue: ¡[self ¡contract ¡isSigned].Extensions in modules
109 Film ¡>> ¡isLegallyBroadcastable ^ContractModule ¡current isFilmLegallyBroadcastable: ¡selfExtensions in modules
110 ContractPresentModule ¡>> ¡ ¡isFilmLegallyBroadcastable: ¡aFilm ^aFilm ¡contract ¡isSignedExtensions in modules
111 ContractAbsentModule ¡>> ¡ ¡isFilmLegallyBroadcastable: ¡aFilm ^true