<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=GRASP</id>
	<title>GRASP - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=GRASP"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=GRASP&amp;action=history"/>
	<updated>2026-05-26T20:08:16Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=GRASP&amp;diff=910586&amp;oldid=prev</id>
		<title>imported&gt;Crazy1880: sohin</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=GRASP&amp;diff=910586&amp;oldid=prev"/>
		<updated>2024-03-08T18:28:37Z</updated>

		<summary type="html">&lt;p&gt;sohin&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;GRASP&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;General Responsibility Assignment Software Patterns&amp;#039;&amp;#039;) bezeichnet in der [[Softwaretechnik]] eine Menge von [[Entwurfsmuster]]n, mit denen die Zuständigkeit bestimmter [[Klasse (Objektorientierung)|Klassen]] objektorientierter Systeme festgelegt wird.&lt;br /&gt;
&lt;br /&gt;
Sie beschreiben also allgemein, welche Klassen und Objekte wofür zuständig sein sollten.&lt;br /&gt;
Alle diese Regeln sind schon lange bekannt, sie wurden von Craig Larman einfach systematisch beschrieben. Dies erleichtert die Kommunikation zwischen Softwareentwicklern und erleichtert Einsteigern das Entwickeln eines Bewusstseins für guten bzw. schlechten Code.&lt;br /&gt;
&lt;br /&gt;
== Information Expert ==&lt;br /&gt;
Gibt dem &amp;#039;&amp;#039;Informations-Experten&amp;#039;&amp;#039; die Verantwortlichkeit, d.&amp;amp;nbsp;h. der Klasse, welche die notwendigen Informationen besitzt,&lt;br /&gt;
um die Verantwortung wahrzunehmen.&lt;br /&gt;
Beispiel: Eine Klasse &amp;#039;&amp;#039;Kreis&amp;#039;&amp;#039;, die die Methode &amp;#039;&amp;#039;berechneFläche()&amp;#039;&amp;#039; hat, die aus dem privaten Attribut &amp;#039;&amp;#039;Radius&amp;#039;&amp;#039; die Fläche berechnet.&lt;br /&gt;
Negativ-Beispiel: Eine Klasse &amp;#039;&amp;#039;berechneFläche&amp;#039;&amp;#039;, die eine Methode hat, die eine geometrische Form entgegennimmt und deren Fläche berechnet.&lt;br /&gt;
Im Unterschied zur realen Welt, in der ein Kreis gar nichts macht, muss in der objektorientierten Welt das Objekt alle Methoden besitzen, die Aktionen definieren, die mit ihm gemacht werden können.&lt;br /&gt;
&lt;br /&gt;
Auch bekannt als „Do it Myself“ Strategie (Peter Coad).&lt;br /&gt;
Information Expert ist das grundlegende Prinzip von Objektorientiertem Design und kann auch als Kapselung von Daten bezeichnet werden. Die konsequente Verwendung führt zu loser Kopplung (loose coupling) und hoher Kohäsion (high cohesion).&lt;br /&gt;
&lt;br /&gt;
== Creator ==&lt;br /&gt;
Das &amp;#039;&amp;#039;Erzeuger&amp;#039;&amp;#039;-Prinzip legt fest, wer eine Instanz einer Klasse (Objekt) erzeugen sollte. Neue Objekte der Klasse B sollten von A erzeugt werden, wenn:&lt;br /&gt;
* A eine [[Aggregation (Informatik)|Aggregation]] von B ist&lt;br /&gt;
* A B-Objekte enthält&lt;br /&gt;
* A B-Objekte erfasst&lt;br /&gt;
* A B-Objekte mit starker Kopplung verwendet&lt;br /&gt;
* A die Initialisierungsdaten für B hat (d.&amp;amp;nbsp;h. A ist Experte bezüglich Erzeugung von B)&lt;br /&gt;
&lt;br /&gt;
== Controller ==&lt;br /&gt;
Der &amp;#039;&amp;#039;[[Model View Controller#Steuerung (controller)|Controller]]&amp;#039;&amp;#039; (Steuereinheit) beinhaltet das Domänenwissen und definiert, wer die für eine Nicht-Benutzeroberflächen-Klasse bestimmten Systemereignisse verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Es gibt hier zwei Möglichkeiten. Die Verwendung von [[Use Case|Use-Case]]-Controllern oder Fassade-Controllern.&lt;br /&gt;
Bei Use Case-Controllern werden alle Ereignisse eines Use Cases in einer Klasse behandelt. Mini Use Cases können auch in einem Controller behandelt werden, zum Beispiel das Erzeugen und Löschen eines Users. Wichtig ist nur, dass die [[Kohäsion (Informatik)|Kohäsion]] des Controllers möglichst groß ist.&lt;br /&gt;
Der [[Fassade (Entwurfsmuster)|Fassade]]-Controller wird in Message Handling Systemen verwendet, da hier alle Systemereignisse an einem Ort eintreffen.&lt;br /&gt;
Hier wird ein einziger Controller (MessageHandler) definiert, der alle Ereignisse abfängt. Hierzu wird mit dem [[Command Pattern]] gearbeitet.&lt;br /&gt;
&lt;br /&gt;
== Low Coupling ==&lt;br /&gt;
&amp;#039;&amp;#039;Geringe [[Kopplung (Softwareentwicklung)|Kopplung]]&amp;#039;&amp;#039; ist eines der Hauptziele von gutem Design. Kopplung bezeichnet hier das Maß für die Abhängigkeit eines Elementes (z.&amp;amp;nbsp;B. einer Klasse) von der Umgebung (z.&amp;amp;nbsp;B. von anderen Klassen). Die Hauptvorteile sind dabei die folgenden:&lt;br /&gt;
* leichte Anpassbarkeit, da Änderungen in einer Klasse keine Änderungen in anderen Klassen nach sich ziehen&lt;br /&gt;
* Verständlichkeit der Klasse, da der Kontext nicht betrachtet werden muss&lt;br /&gt;
* gute Testbarkeit&lt;br /&gt;
* hohe Wiederverwendbarkeit&lt;br /&gt;
&lt;br /&gt;
=== Formen von Kopplung ===&lt;br /&gt;
&amp;#039;&amp;#039;Am Beispiel von der Klasse X zur Klasse Y:&amp;#039;&amp;#039;&lt;br /&gt;
* X ist direkte oder indirekte Unterklasse von Y&lt;br /&gt;
* X implementiert das Interface von Y&lt;br /&gt;
* X hat Attribut bzw. Referenz von Typ Y (Aggregation/Assoziation)&lt;br /&gt;
* X hat Methode, die Y referenziert (Abhängigkeit)&lt;br /&gt;
&lt;br /&gt;
== High Cohesion ==&lt;br /&gt;
&amp;#039;&amp;#039;Hohe [[Kohäsion (Informatik)|Kohäsion]]&amp;#039;&amp;#039; ist vor allem wichtig, um die Komplexität von Gesamtsystemen zu begrenzen, indem man Klassen gut überschaubar organisiert. Die Kohäsion ist ein Maß für den inneren Zusammenhalt einer Klasse. Das heißt, sie misst, wie eng die Methoden und Attribute einer Klasse zusammenarbeiten.&lt;br /&gt;
&lt;br /&gt;
Ein Negativ-Beispiel wäre z.&amp;amp;nbsp;B. eine Klasse, die Methoden aus zwei völlig verschiedenen Gebieten anbietet. Solche Klassen sind meistens schnell durch völlig nichtssagende Namen und viele Methoden/Codezeilen zu orten.&lt;br /&gt;
&lt;br /&gt;
=== Zusammenhang High Cohesion / Low Coupling ===&lt;br /&gt;
Hohe Kohäsion innerhalb der Softwareeinheiten in einem System führt tendenziell zu geringer Kopplung zwischen den beteiligten Softwareeinheiten.&lt;br /&gt;
&lt;br /&gt;
== Polymorphismus ==&lt;br /&gt;
[[Polymorphie (Programmierung)|Polymorphismus]] kann verwendet werden, um das Verhalten abhängig vom Typ zu ändern. Somit können viele Fallunterscheidungen vermieden werden. Besser bekannt ist das Pattern als [[Strategy Pattern|Strategy]] ([[Entwurfsmuster (Buch)|GoF]]).&lt;br /&gt;
&lt;br /&gt;
== Pure Fabrication ==&lt;br /&gt;
Eine Pure Fabrication (&amp;#039;&amp;#039;reine Erfindung&amp;#039;&amp;#039;), stellt eine Klasse dar, die so nicht in der Problem Domain existiert. Sie stellt eine Methode zur Verfügung, für die sie nicht Experte ist. Normalerweise wird eine Pure Fabrication verwendet, um einen Algorithmus zu kapseln, der in keine Domain-Klasse passt. Sie kann zum Beispiel verwendet werden, um Technologiewissen von Domänenwissen zu trennen. Sie implementiert reines Verhalten und hat somit keinen Zustand. Sollte nicht zu häufig verwendet werden, sonst existieren am Schluss nur noch Klassen, die einzelne Methoden kapseln.&lt;br /&gt;
&lt;br /&gt;
== Indirection ==&lt;br /&gt;
Indirection (&amp;#039;&amp;#039;Umweg&amp;#039;&amp;#039;) kann verwendet werden, um geringe Kopplung zu erreichen. Sie wird erzielt, indem ein Vermittler zwischen Client und Server eingebaut wird. Sinnvoll wenn sich ein Serverobjekt ständig verändert. Als Nachteil ist die verminderte Leistungsfähigkeit zu berücksichtigen.&lt;br /&gt;
Beispielhaft für dieses Muster ist die Einführung der Controller-Komponente, die zwischen dem Datenmodell (Model) und dessen Präsentation (View) im [[Model View Controller|Model-View-Controller]]-[[Architekturmuster]] vermittelt.&lt;br /&gt;
&lt;br /&gt;
== Protected Variations ==&lt;br /&gt;
Interfaces sollen immer verschiedene konkrete Implementierungen verstecken. Man nutzt also Polymorphismus und Delegation, um zwischen den Implementierungen zu wechseln. Dadurch kann das restliche System vor den Auswirkungen eines Wechsels der Implementierung geschützt werden.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Mark Grand&lt;br /&gt;
   |Titel=Patterns in Java&lt;br /&gt;
   |Auflage=2.&lt;br /&gt;
   |Verlag=John Wiley &amp;amp; Sons&lt;br /&gt;
   |Datum=1999&lt;br /&gt;
   |ISBN=0-471-25841-5&lt;br /&gt;
   |Sprache=en}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Craig Larman&lt;br /&gt;
   |Titel=Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development&lt;br /&gt;
   |Auflage=3.&lt;br /&gt;
   |Verlag=Markt und Technik&lt;br /&gt;
   |Datum=2005&lt;br /&gt;
   |ISBN=3-8272-6898-2&lt;br /&gt;
   |Sprache=en}}&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Grasp}}&lt;br /&gt;
[[Kategorie:Entwurfsmuster]]&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;br /&gt;
[[Kategorie:Softwarearchitektur]]&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Crazy1880</name></author>
	</entry>
</feed>