principles:invariant_avoidance_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:invariant_avoidance_principle [2021-09-02 12:37] – old revision restored (2021-05-11 21:58) 65.21.179.175 | principles:invariant_avoidance_principle [2021-09-02 20:09] – old revision restored (2021-03-27 09:33) 65.21.179.175 | ||
---|---|---|---|
Line 10: | Line 10: | ||
===== Principle Statement ===== | ===== Principle Statement ===== | ||
+ | |||
+ | Avoid Invariants and Preconditions. | ||
Line 19: | Line 21: | ||
===== Strategies ===== | ===== Strategies ===== | ||
+ | |||
+ | * If the language supports that, use references which cannot be '' | ||
+ | * In C++ use references instead of pointers (see [[#example 3: C++ references]]) | ||
+ | * In Java use primitive types instead of their object wrappers ('' | ||
+ | * Use [[patterns: | ||
+ | * Avoid duplication of information. If the same information is stored in different places (maybe in different formats), the values may get out of sync (see also [[Don' | ||
===== Caveats ===== | ===== Caveats ===== | ||
- | See section [[#contrary principles]]. | + | Keep in mind that preconditions and invariants are absolutely necessary for every software. So this principle is constantly violated. Introducing preconditions and invariants is often also done deliberately in order to simplify the code (see [[Keep It Simple Stupid|KISS]]). So the purpose of this principle is mainly to point out that there are drawbacks. By no means invariants are problematic themselves or should be entirely avoided. They just also have disadvantages. |
+ | |||
+ | See also section [[#contrary principles]]. | ||
===== Origin ===== | ===== Origin ===== | ||
+ | |||
+ | This principle is newly introduced here. | ||
===== Evidence ===== | ===== Evidence ===== | ||
/* Comment out what is not applicable and explain the rest: */ | /* Comment out what is not applicable and explain the rest: */ | ||
- | /* | + | |
* [[wiki: | * [[wiki: | ||
+ | |||
+ | /* | ||
* [[wiki: | * [[wiki: | ||
* [[wiki: | * [[wiki: | ||
Line 62: | Line 76: | ||
- | ===== Example ===== | + | ===== Examples ===== |
+ | |||
+ | ==== Example | ||
+ | |||
+ | <code java> | ||
+ | public void prettyPrintItem(List< | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | This method has the following preconditions: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Compare the following solution: | ||
+ | |||
+ | <code java> | ||
+ | public void prettyPrintItem(Item item) | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | This is better as it just has one precondition: | ||
+ | |||
+ | |||
+ | ==== Example 2: String Preconditions ==== | ||
+ | |||
+ | <code java> | ||
+ | public void downloadFile(String url) | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | This method has the following preconditions: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Compare the following method: | ||
+ | |||
+ | <code java> | ||
+ | public void downloadFile(URL url) | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | This is better since there is only one precondition: | ||
+ | |||
+ | ==== Example 3: C++ References ==== | ||
+ | |||
+ | Sompare the following two methods: | ||
+ | |||
+ | <code c++> | ||
+ | void prettyPrint(SomeClass * obj) | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code c++> | ||
+ | void prettyPrint(SomeClass& | ||
+ | { | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | In the second version '' | ||
+ | |||
+ | |||
+ | ==== Example 4: DRY ==== | ||
+ | |||
+ | A class for [[wp> | ||
principles/invariant_avoidance_principle.txt · Last modified: 2021-10-18 21:53 by christian