User:BenMcDonald
BenMcDonald (Talk | contribs) (Iteration Three) |
BenMcDonald (Talk | contribs) |
||
Line 13: | Line 13: | ||
* The performance on the skills needs to be evaluated and for additional activities to be recommended to the athlete. | * The performance on the skills needs to be evaluated and for additional activities to be recommended to the athlete. | ||
* An athlete’s evaluation history, progress and general details to be recorded and recoverable. | * An athlete’s evaluation history, progress and general details to be recorded and recoverable. | ||
+ | |||
+ | My design is below. Any comments or suggestions are very welcome. | ||
+ | |||
== Iteration Three == | == Iteration Three == | ||
[[Image:BenM's UMLI3.png|border|800px]] | [[Image:BenM's UMLI3.png|border|800px]] | ||
Maxims that have been useful: | Maxims that have been useful: | ||
− | * [[Command query separation]] - One plus of C++ is that you can mark queries, and enforce them, with the const keyword. | + | * [[Command query separation]] / [[Avoid side effects]] - The interface would be tidier if the getFeedback() method in the Trainer object also cleared the feedback but doing this would violate CQS. By have two methods, getFeedback() and clearFeedback(), there are no side effects and the status of the object can be queried without invocking any commands. Additionally, I could add a getAndClearFeedback() method for convenience. One plus of C++ is that you can mark queries, and enforce them, with the const keyword. |
* [[Design by contract]] - Using assert's to enforce conditions at the moment | * [[Design by contract]] - Using assert's to enforce conditions at the moment | ||
* [[Don't expose mutable attributes]] - In C++, objects returned from another object's method can be marked as const to make them immutable. | * [[Don't expose mutable attributes]] - In C++, objects returned from another object's method can be marked as const to make them immutable. | ||
+ | * [[Object Encapsulation]] - Variables are ether 'protected' or 'public' and all methods are marked 'virtual'. Object encapsulation is more intuitive and I did not find any appropriate place for private variables. | ||
=== Patterns === | === Patterns === | ||
Line 27: | Line 31: | ||
[[State|State Pattern]]: | [[State|State Pattern]]: | ||
− | + | {| | |
− | + | |- | |
− | + | | Context || ''Trainer'' | |
+ | |- | ||
+ | | Abstract State || ''TrainingActivity'' | ||
+ | |- | ||
+ | | Concrete State1 || ''PunchingDrill'' | ||
+ | |- | ||
+ | | Concrete State2 || ''BobbingAndWeaving'' | ||
+ | |- | ||
+ | |} | ||
[[Visitor|Visitor Pattern]] | [[Visitor|Visitor Pattern]] | ||
Line 37: | Line 49: | ||
[[Observer|Observer Pattern]]: | [[Observer|Observer Pattern]]: | ||
− | + | {| | |
− | + | |- | |
− | + | | Subject || ''BoxerPose'' | |
− | + | |- | |
+ | | ConcreteSubject || ''UserBoxerPose'' | ||
+ | |- | ||
+ | | Observer || ''Observer'' | ||
+ | |- | ||
+ | | ConcreteObserver || ''Trainer'' | ||
+ | |- | ||
+ | |} | ||
A trainer can be made to observer a UserBoxerPose. The trainer will record the pose history and generate evaluations from that history, generate feedback from its observations and react to the pose's actions. | A trainer can be made to observer a UserBoxerPose. The trainer will record the pose history and generate evaluations from that history, generate feedback from its observations and react to the pose's actions. | ||
[[Observer|Observer Pattern]]: | [[Observer|Observer Pattern]]: | ||
− | + | {| | |
− | + | |- | |
− | + | | Subject || ''BoxerPose'' | |
− | + | |- | |
− | + | | ConcreteSubject || ''TrainerPose'' | |
+ | |- | ||
+ | | Observer || ''Observer'' | ||
+ | |- | ||
+ | | ConcreteObserver || ''TrainerAnimation'' | ||
+ | |- | ||
+ | |} | ||
I wanted the Trainer to know about the timings of the animations and was tempted to couple the Trainer class to the TrainerAnimations class and vice versa. I instead decided to remove the Trainer's knowledge of its animations and required the animations to conform to the timings of the Trainer's movements. The TrainerAnimations class is likely to change and coupling the Trainer class to it would increase maintenance of the Trainer class. | I wanted the Trainer to know about the timings of the animations and was tempted to couple the Trainer class to the TrainerAnimations class and vice versa. I instead decided to remove the Trainer's knowledge of its animations and required the animations to conform to the timings of the Trainer's movements. The TrainerAnimations class is likely to change and coupling the Trainer class to it would increase maintenance of the Trainer class. | ||
Revision as of 13:29, 22 September 2009
Contents |
Ben McDoanld's page
I am doing my design study for my COSC426:Augmented Reality project. I need a design for a boxing skills trainer. No code has been written so far. I have made a sketch of the requirements for the design of the software. The project is in C++ using the libraries open scene graph (osg), augmented reality tool-kit open scene graph (ARTosg) and the Wii controller library for windows
Requirements:
- A score needs to be generated from a set of tested skills:
- Consistent guard
- Eyes forward and on opponent
- Bobbing and weaving
- Timing of punches
- Each skill needs to be modeled and the evaluation method for each skill also needs to be modeled.
- The performance on the skills needs to be evaluated and for additional activities to be recommended to the athlete.
- An athlete’s evaluation history, progress and general details to be recorded and recoverable.
My design is below. Any comments or suggestions are very welcome.
Iteration Three
Maxims that have been useful:
- Command query separation / Avoid side effects - The interface would be tidier if the getFeedback() method in the Trainer object also cleared the feedback but doing this would violate CQS. By have two methods, getFeedback() and clearFeedback(), there are no side effects and the status of the object can be queried without invocking any commands. Additionally, I could add a getAndClearFeedback() method for convenience. One plus of C++ is that you can mark queries, and enforce them, with the const keyword.
- Design by contract - Using assert's to enforce conditions at the moment
- Don't expose mutable attributes - In C++, objects returned from another object's method can be marked as const to make them immutable.
- Object Encapsulation - Variables are ether 'protected' or 'public' and all methods are marked 'virtual'. Object encapsulation is more intuitive and I did not find any appropriate place for private variables.
Patterns
- BoxerPose hierarchy
- Boxer hierarchy
Context | Trainer |
Abstract State | TrainingActivity |
Concrete State1 | PunchingDrill |
Concrete State2 | BobbingAndWeaving |
- ConcreteElement - Trainer, Boxer
- Element - Boxer
- Visitor - Exporter
Subject | BoxerPose |
ConcreteSubject | UserBoxerPose |
Observer | Observer |
ConcreteObserver | Trainer |
A trainer can be made to observer a UserBoxerPose. The trainer will record the pose history and generate evaluations from that history, generate feedback from its observations and react to the pose's actions.
Subject | BoxerPose |
ConcreteSubject | TrainerPose |
Observer | Observer |
ConcreteObserver | TrainerAnimation |
I wanted the Trainer to know about the timings of the animations and was tempted to couple the Trainer class to the TrainerAnimations class and vice versa. I instead decided to remove the Trainer's knowledge of its animations and required the animations to conform to the timings of the Trainer's movements. The TrainerAnimations class is likely to change and coupling the Trainer class to it would increase maintenance of the Trainer class.
Iteration Two
Design:
- Context - Trainer
- State - TrainingState
- ConcreteStates - PunchingDrill, BobbingAndWeaving
- Subject - Observable
- ConcreteSubject - UserBoxer
- Observer - Observer
- ConcreteObserver - Trainer
- Subject - Observable
- ConcreteSubject - Trainer
- Observer - Observer
- ConcreteObserver - TrainerAnimation
Iteration One
Design:
- Subject - Observable
- ConcreteSubject - Athlete
- Observer - Observer
- ConcreteObserver - Trainer