User Tools

Site Tools


principles:generalization_principle

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
principles:generalization_principle [2012-12-09 22:26]
christian enhanced principle description
principles:generalization_principle [2018-06-24 11:00]
christian
Line 1: Line 1:
-====== Generalization Principle ======+====== Generalization Principle ​(GP) ======
  
 ===== Variants and Alternative Names ===== ===== Variants and Alternative Names =====
  
-  * Build Generality into Software +  * Build Generality into Software(({{page>​resources:​201 Principles#​reference}})) 
 +  * Abstractions Live Longer than Details(({{page>​resources:​The Pragmatic Programmer#​reference}})) 
 +  * Rule of Power (RoP)
  
 ===== Context ===== ===== Context =====
  
   * [[contexts:​Object-Oriented Design]]   * [[contexts:​Object-Oriented Design]]
 +  * [[contexts:​API Design]]
 +  * [[contexts:​Architecture]]
 +  * [[contexts:​User Interface Design]]
 +  * [[contexts:​Implementation]]
 +
  
-===== Definition ​=====+===== Principle Statement ​=====
  
 A generalized solution, that solves not only one but many problems, is better than a specific one. A generalized solution, that solves not only one but many problems, is better than a specific one.
Line 21: Line 27:
 A general solution abstracts from the specific tasks and solves a superset of them. Parameterization of some kind is used to specify what has to be done in a given situation. A general solution abstracts from the specific tasks and solves a superset of them. Parameterization of some kind is used to specify what has to be done in a given situation.
  
 +A module can be more general than another one. But there are two aspects of this: First of all there is functionality. If module ''​A''​ can do the same as module ''​B''​ plus something more then ''​A''​ is more general. The second aspect is the one of what has to be done in order to exploit the generality. An ideal case would be that nothing has to be done and the module just does more. Other possibilities are that a configuration file has to be changed, an attribute has to be set, an invocation parameter has to be adjusted, etc. The least general possibility would be a module which can be changed easily. This is still better than a rigid module but less general than modules which do not need such changes. This form of generality is often rather called "​flexibility"​ (({{page>​resources:​Designing Software for Ease of Extension and Contraction#​reference}})).
 ===== Rationale ===== ===== Rationale =====
  
Line 27: Line 33:
  
 Moreover a generalized solution can be reused in a variety of other situations. A specific solution can only be reused when exactly the same requirements appear again. So a general solution is much more reusable. Moreover a generalized solution can be reused in a variety of other situations. A specific solution can only be reused when exactly the same requirements appear again. So a general solution is much more reusable.
 +
 +
 +===== Strategies =====
 +  * Make modules configurable at runtime or deployment time by using configuration files.
 +  * Use parameterizable modules(method parameters, object attributes, parametric types, etc.)
 +  * Use constants
 +  * Find suitable abstractions
 +
 +===== Caveats =====
 +
 +Making a [[glossary:​module]] (typically a layer, a subsystem or an API) too general leads to the [[anti-patterns:​inner-platform effect]]. This means that the module is so general that it mirrors the functionality of the underlying platform without adding a benefit but only complexity.
 +
 +Another problem is the [[anti-patterns:​turing tarpit]]. This means that the module is so general that arbitrarily complex tasks can be performed but those of interest, meaning the rather simple tasks that occur over and over again, are also difficult to do. This is a violation of the [[Easy to Use and hard to Misuse|EUHM]] principle.
 +
 +See also section [[#contrary principles]].
  
  
 ===== Origin ===== ===== Origin =====
  
-FIXME+The term "​generalization principle"​ is proposed here. Nevertheless the value of generalized solutions is well known at least since: 
 + 
 +{{page>​resources:​Designing Software for Ease of Extension and Contraction#​reference}} 
  
 ===== Evidence ===== ===== Evidence =====
 /* Comment out what is not applicable and explain the rest: */ /* Comment out what is not applicable and explain the rest: */
-[[wiki:​Proposed]] +  * [[wiki:​Proposed]] 
-/​*[[wiki:​Examined]]*/​ + 
-/​*[[wiki:​Accepted]]*/​ +/*  ​* [[wiki:​Examined]]*/​ 
-/​*[[wiki:​Questioned]]*/​+/*  ​* [[wiki:​Accepted]]*/​ 
 +/*  ​* [[wiki:​Questioned]]*/​
  
  
Line 44: Line 69:
  
 ==== Generalizations ==== ==== Generalizations ====
- 
-  * [[principles:​Don'​t Repeat Yourself]] (DRY): A more general solution avoids duplication. 
  
 ==== Specializations ==== ==== Specializations ====
Line 52: Line 75:
 ==== Contrary Principles ==== ==== Contrary Principles ====
  
-  * **[[principles:Keep It Simple Stupid]]** +  * **[[Keep It Simple Stupid]] ​(KISS)**: A generalized solution is typically not simple anymore. This is the typical conflict between generality and simplicity. 
 +  * [[Easy to Use and Hard to Misuse]] (EUHM): Too general solutions may lead to complicated usage of the module. 
 +  * [[Rule of Explicitness]] (RoE): RoE often results in specific solutions. Generality often requires stating something implicitly.
 ==== Complementary Principles ==== ==== Complementary Principles ====
 +
 +  * [[Don'​t Repeat Yourself]] (DRY): A more general solution avoids duplication.
 +  * [[Encapsulate the Concept that Varies]] (ECV): Encapsulating a varying concept typically results in a more generally applicable solution. This is especially true when an abstract concept is encapsulated by introducing an interface or an abstract class.
  
 ==== Principle Collections ==== ==== Principle Collections ====
  
 +{{page>​collections:​OOD Principle Language#​Box}}
 +{{page>​collections:​Principles in "The Pragmatic Programmer"#​Box}}
  
-===== Example ​=====+===== Examples ​=====
  
  
 ===== Description Status ===== ===== Description Status =====
 /* Choose one of the following and comment out the rest: */ /* Choose one of the following and comment out the rest: */
-[[wiki:​Stub]] +/*[[wiki:​Stub]]*
-/*[[wiki:​Incomplete]]*/+[[wiki:​Incomplete]]
 /​*[[wiki:​Complete]]*/​ /​*[[wiki:​Complete]]*/​
  
Line 71: Line 100:
 ===== Further Reading ===== ===== Further Reading =====
  
-  * + 
 + 
 +===== Discussion ===== 
 + 
 +Discuss this wiki article and the principle on the corresponding [[talk:​principles:​Generalization Principle|talk page]].
principles/generalization_principle.txt · Last modified: 2018-06-24 11:00 by christian