principles:model_principle
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
principles:model_principle [2019-12-13 11:38] – [Example 4: Break and Air Conditioning] 82.165.232.20 | principles:model_principle [2021-09-02 12:34] – old revision restored (2021-05-19 11:19) 65.21.179.175 | ||
---|---|---|---|
Line 25: | Line 25: | ||
Real world actions are then // | Real world actions are then // | ||
- | Be precise with semantics. An operation '' | + | FIXME more detailed description |
- | Keep sure that your software models the reality by invoking the method that has the correct semantics and supplying it with the parameters that are needed from a requirements perspective. | ||
===== Rationale ===== | ===== Rationale ===== | ||
Line 33: | Line 32: | ||
When the structures in the software roughly correspond to the structures of the problem domain, a developer doesn' | When the structures in the software roughly correspond to the structures of the problem domain, a developer doesn' | ||
- | Moreover if something works accidentally, | ||
- | In the example above supplying a '' | ||
===== Strategies ===== | ===== Strategies ===== | ||
Line 41: | Line 38: | ||
* Create methods corresponding to real-world actions | * Create methods corresponding to real-world actions | ||
* Map additionally necessary behavior to natural classes instead of creating artificial classes | * Map additionally necessary behavior to natural classes instead of creating artificial classes | ||
- | * For artificial behavior that cannot be mapped to a natural class at least create a metaphor or an artificial model (like a state machine) | + | * For artificial behavior that cannot be mapped to a natural class at least create a metaphor or an artificial model (like for example |
- | * Be precise with semantics. If you have an operation that currently does what you need but for slightly different reasons because it's an operation on the wrong abstraction level, create a new operation with the correct semantics. Have that new operation call the existing one as an implementation detail (e.g. have a '' | + | |
===== Caveats ===== | ===== Caveats ===== | ||
Line 86: | Line 83: | ||
* **[[Tell, don't Ask/ | * **[[Tell, don't Ask/ | ||
* [[Low Coupling]] (LC): When designing a model for a software, it has to be borne in mind that structures with low coupling are desirable. | * [[Low Coupling]] (LC): When designing a model for a software, it has to be borne in mind that structures with low coupling are desirable. | ||
- | * [[Law of Leaky Abstractions]] (LLA): When building abstractions according to MP, keep in mind that there will most likely be abstraction leaks. A good abstraction minimizes those leaks. | + | |
==== Principle Collections ==== | ==== Principle Collections ==== | ||
Line 114: | Line 111: | ||
On the other hand our intuitive model of parsers and functions tells us that a '' | On the other hand our intuitive model of parsers and functions tells us that a '' | ||
- | |||
- | |||
- | ==== Example 4: Brake and Air Conditioning ==== | ||
- | |||
- | Suppose a car has an air conditioning and a hill start assistant. The air conditioning needs to make sure that the engine provides enough power on sunny days. So it measures its power-consumption and pushes down the gas pedal just enough to the engine isn't stalled. The hill start assistant automatically releases the hand break if you start driving. Now the following situation can happen: A car waits in front of a boom barrier of an underground garage. It's a hot day and the driver opens the window to get the ticket. hot air flows into the car and the A/C powers up. The revolution speed is low because the car stands still so the A/C hits the gas pedal in order not to stall the engine. Now the hill start assistant realizes that the gas pedal was pressed and releases the hand break because pressing the gas pedal is the trigger that the diver want to drive away. As a result the car crashes into the boom barrier. | ||
- | |||
- | The problem here is with the A/C. Semantically it wanted to increase the motor power but actually it called an operation that hit the gas pedal. This is almost the same but not exactly the same. It's an operation on the wrong level of abstraction. If the A/C had called an operation '' | ||
- | |||
- | |||
- | ==== Example 5: Inferring Information ==== | ||
- | |||
- | Suppose there is a smartphone app and its backend. The app lets you buy several products. One day the app developers demand that the backend adds a field describing the product size (small, medium, large). The backend developers add the field and everyone is happy. The app developers use this field so they can decide whether gift wrapping is available (large products cannot be gift-wrapped). Half a year later the company decides to enhance their product portfolio by reselling products of company B. The backend will redirect orders of B-products directly to company B so they are in charge of delivery. | ||
- | |||
- | Unfortunately B is not able to provide gift-wrappings at all. So the smartphone app has to be changed such that it not only removes the gift-wrapping option for large products but also for B-products. But smartphone apps need to be updated by the customer (and some of them never do). So the only way to ensure that gift-wrapping is handled correctly even if the customer hasn't updated yet, is that the backend returns '' | ||
- | |||
- | The '' | ||
Line 135: | Line 116: | ||
/* Choose one of the following and comment out the rest: */ | /* Choose one of the following and comment out the rest: */ | ||
/ | / | ||
- | /*[[wiki: | + | [[wiki: |
- | [[wiki: | + | /*[[wiki: |
principles/model_principle.txt · Last modified: 2021-10-18 21:47 by christian