Design I
Properties of good design Minimize complexity Maintainable Loose coupling Extensibility Reusability High fan in Low to medium fan out Portability Leanness Stratification Standard techniques
Some principles of good design Open-Close Principle Dependency Inversion Principle Interface Segregation Principle Single Responsibility Principle Liskov’s Substitution Principle
Design heuristics 1.Use real-world and synthetic objects a)identify objects & their attributes b)determine relationships c)how they interact to realize use cases 2.Refine your classes based on responsibilities 1.don’t let an class do too much 2.keep it cohesive 3.identify areas of potential change
Example I am developing software that (among other things) displays geometric primitives Initially I only need to support lines In the future I may need to add spheres, triangles, and squares Rather than reinvent the wheel, I am going to use an existing program. Actually, I really want the option of choosing at run time between two different drawing programs, one that is better at low resolutions and one that is better at high resolutions
current design shape line draw()
Drawing APIs Package 1: drawLine(x1, y1, x2, y2) Package 2: drawALine(x1, x2, y1, y2)
solution 1 line.draw() { if (resolution == high) drawLine(v1.x, v1.y, v2.x, v2.y) else drawALine(v1.x, v2.x, v1.y, v2.y) }
solution 1 AdvantagesDisadvantages
solution 1 Advantages –simple to implement –simple to understand Disadvantages –is knowing about resolution really a responsibility of shape? –we are duplicating code
Some principles of good design Open-Close Principle Dependency Inversion Principle Interface Segregation Principle Single Responsibility Principle Liskov’s Substitution Principle No forgery principle (keep data in a single place) One rule one place (don’t duplicate code)
solution 2 line lineDP1lineDP2
solution 2 Advantages –simple to implement –simple to understand Disadvantages –as additional shapes and drawing programs are added the number of classes becomes LARGE
Shape TriangleLine Drawer Low ResHi Res Bridge design pattern defines the interface shapes use to draw “adapters” for specific drawing interfaces
Bridge Problem: Want to support multiple implementation that have different interfaces in an extensible way.
Last time Choose a game loop at some specific part of your (core) game Develop a domain model –what are the things (nouns) –what are their relationships Develop your game loop use case Use CRC cards to come up with a first pass at your design Act out the game loop use case
This time Critique your design –based on design principles –properties of good design –design heuristics Report to class