sad
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| sad [2014/01/22 07:32] – yann | sad [2025/01/15 21:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 6: | Line 6: | ||
| ^ Names ^ Definitions ^ | ^ Names ^ Definitions ^ | ||
| - | | AntiSingleton | TBD | | + | | AntiSingleton | A class that provides mutable class variables, which consequently could be used as global variables. |
| - | | BaseClassKnowsDerivedClass | TBD | | + | | BaseClassKnowsDerivedClass | A class that invokes or has at least binary-class relationship pointing to one of its subclasses. |
| - | | BaseClassShouldBeAbstract | TBD | | + | | BaseClassShouldBeAbstract | A class that has many subclasses without being abstract. |
| - | | Blob | The Blob (also called God class) corresponds to a large controller class that depends on data stored in surrounding data classes. A large class declares many fields and methods with a low cohesion. A controller class monopolises most of the processing done by a system, takes most of the decisions, and closely directs the processing of other classes. Controller classes can be identified using suspicious names such as Process, Control, Manage, System, and so on. A data class contains only data and performs no processing on these data. It is composed of highly cohesive fields and accessors. | | + | | Blob | A large controller class that depends on data stored in surrounding data classes. A large class declares many fields and methods with a low cohesion. A controller class monopolises most of the processing done by a system, takes most of the decisions, and closely directs the processing of other classes. Controller classes can be identified using suspicious names such as Process, Control, Manage, System, and so on. A data class contains only data and performs no processing on these data. It is composed of highly cohesive fields and accessors. | |
| - | | ClassDataShouldBePrivate | TBD | | + | | ClassDataShouldBePrivate | A class that exposes its fields, thus violating the principle of encapsulation. |
| - | | ComplexClass | TBD | | + | | ComplexClass | A class that has (at least) one large and complex method, in terms of cyclomatic complexity and LOCs. | |
| - | | FunctionalDecomposition | The Functional Decomposition antipattern may occur if experienced procedural developers with little knowledge of | + | | FunctionalDecomposition | A main class, i.e., a class with a procedural name, such as Compute or Display, in which inheritance and polymorphism are scarcely used, that is associated with small classes, which declare many private fields and implement only a few methods. | |
| - | object-orientation implement an object-oriented system. Brown describes this antipattern as "a ' | + | | LargeClass | A class that has grown too large in term of LOCs. | |
| - | methods. | | + | | LazyClass | A class that has few fields and methods. |
| - | | LargeClass | TBD | | + | | LongMethod | A class that has (at least) a method that is very long, in term of LOCs. | |
| - | | LazyClass | TBD | | + | | LongParameterList | A class that has (at least) one method with a too long list of parameters in comparison to the average number of parameters per methods in the system. |
| - | | LongMethod | TBD | | + | | ManyFieldAttributesButNotComplex | A class that declares many attributes but which is not complex and, hence, more likely to be some kind of data class holding values without providing behaviour. |
| - | | LongParameterList | TBD | | + | | MessageChains | A class that uses a long chain of method invocations to realise (at least) one of its functionality. |
| - | | ManyFieldAttributesButNotComplex | TBD | | + | | RefusedParentBequest | A class that redefines inherited method using empty bodies, thus breaking polymorphism. |
| - | | MessageChains | TBD | | + | | SpaghettiCode | A class with no structure, declaring long methods with no parameters, and utilising global variables. |
| - | | RefusedParentBequest | TBD | | + | | SpeculativeGenerality | A class that is defined as abstract but that has very few children, which do not make use of its methods. |
| - | | SpaghettiCode | The Spaghetti Code is an antipattern that is characteristic of procedural thinking in object-oriented programming. Spaghetti Code is revealed by classes | + | | SwissArmyKnife | A complex class that offers a high number of services, for example, a complex class implementing a high number of interfaces. A Swiss Army Knife is different from a Blob, because it exposes a high complexity to address all foreseeable needs of a part of a system, whereas the Blob is a singleton monopolising all processing and data of a system. Thus, several Swiss Army Knives may exist in a system, for example utility classes. | |
| - | suggest procedural programming. | + | | TraditionBreaker | A class that inherits from a large parent class but that provides little behaviour and without subclasses. |
| - | | SpeculativeGenerality | TBD | | + | |
| - | | SwissArmyKnife | The Swiss Army Knife refers to a tool fulfilling a wide range of needs. The Swiss Army Knife design smell is a complex class that offers a high number of services, for example, a complex class implementing a high number of interfaces. A Swiss Army Knife is different from a Blob, | + | ===== Anti-patterns Generation ===== |
| - | because it exposes a high complexity to address all foreseeable needs of a part of a system, whereas the Blob is a singleton monopolising all processing and data of a system. Thus, several Swiss Army Knives may exist in a system, for example utility classes. | | + | |
| - | | TraditionBreaker | TBD | | + | The generation of code and design smell identification algorithms is straightforward. Class '' |
| ===== Anti-patterns Identification ===== | ===== Anti-patterns Identification ===== | ||
| + | Identifying code and design smells using PADL is made easy by the helper class '' | ||
| + | |||
| + | SAD requires [[POM]] to compute various metrics involved in the definitions of the code and design smells. These metrics are referenced by name in the rule cards, for example: | ||
| + | |||
| + | < | ||
| + | RULE_CARD : ComplexClass { | ||
| + | RULE : ComplexClass { UNION LargeClassOnly ComplexClassOnly } ; | ||
| + | RULE : LargeClassOnly { (METRIC: NMD + NAD, VERY_HIGH, 0) } ; | ||
| + | RULE : ComplexClassOnly { (METRIC: McCabe, VERY_HIGH, 20) } ; | ||
| + | }; | ||
| + | </ | ||
sad.1390375959.txt.gz · Last modified: (external edit)
