Refactoring. Dominique Steiner 1 und Monica De Donato 2. dedom1@bfh.ch
|
|
- Steffen Heintze
- vor 8 Jahren
- Abrufe
Transkript
1 Refactoring Dominique Steiner 1 und Monica De Donato 2 1 Berner Fachhochschule Technik und Informatik, 2502 Biel, CH, steid3@bfh.ch, 2 Berner Fachhochschule Technik und Informatik, 2502 Biel, CH, dedom1@bfh.ch Abstract. Refaktorisieren 3 ist eine Technik, die benutzt wird, um die Struktur bestehender Software, die im Laufe der Zeit an Qualität verloren hat, zu überarbeiten, ohne dabei die Funktionalitäten zu verändern. Mit Refaktorisieren wird nicht, wie vermutet Zeit verloren, sondern durch den übersichtlicheren Code kann beim Implementieren von neuen Funktionalitäten sogar Zeit gewonnen werden. Das Java-Beispiel bietet einen kleinen Einblick in die Technik und das Vorgehen beim Refaktorisieren. Um Programmierern das Refaktorisieren zu vereinfachen, bieten viele moderne Entwicklungsumgebungen Möglichkeiten an, die diesen Prozess unterstützen und automatisieren. Selbstprüfende Tests sind beim Rektorisieren zum Überprüfen des Codes und zum Vermeiden von Fehlern unumgänglich. Beim Verwenden von Java ist JUnit ein sehr praktisches Hilfsmittel. Neben all den positiven Aspekten gibt es Situationen, in denen der Einsatz von Refaktorisierung zusätzliche Schwierigkeiten mit sich bringt, oder in denen ganz darauf verzichtet werden sollte. Key words: Refaktorisieren, Lesbarkeit, Übersichtlichkeit, Tests, Struktur Optimierung 1 Was ist Refaktorisieren? Im Herstellungsprozess von Software werden immer wieder, von verschiedenen Programmierern, Änderungen und neue Funktionen in die Programme eingebaut. Dies führt dazu, dass die Software immer unübersichtlicher wird und die Struktur der Software darunter leidet. Mit der Zeit wird es sehr auwändig Änderungen vorzunehmen, weil sich diese in der aktuellen Struktur fast nicht einbauen lassen. Um dieses Phänomen zu minimieren, kann der Code regelmässig refaktorisiert werden. Refaktorisieren ist eine Technik, bei der in kleinen Schritten die Struktur und die Verständlichkeit bestehender Software, durch anwenden bestimmter Refaktorisierungen, verbessert wird. Dazu gehören zum Beispiel Methode extrahieren, Variable und Methode umbenennen, Klasse extrahieren und viele weitere. Anschliessend lassen sich in der optimierten Softwareänderungen und neue Funktionalitäten viel einfacher einbauen. Im Buch von Martin Fowler 3 Der Einfachheit halber wird die deutsche Form verwendet, obwohl diese nicht ganz der deutschen Rechtschreibung entspricht.
2 2 Dominique Steiner, Monica De Donato ndet man die folgenden Denitionen, je nach Kontext in dem das Wort verwendet wird. Denition 1. Refaktorisierung (Substantiv): Eine Änderung an der internen Struktur einer Software, um sie leichter verständlich zu machen und einfacher zu verändern, ohne ihr beobachtetes Verhalten zu ändern. [1] Denition 2. Refaktorisieren (Verb): Eine Software umstrukturieren, ohne ihr beobachtetes Verhalten zu ändern, indem man eine Reihe von Refaktorisierungen anwendet. [1] Wichtig ist, dass während dem Refaktorisieren die Funktionalitäten des Codes nicht verändert werden. Die Software muss nach dem Refaktorisieren genau das Gleiche tun wie vorher. Um dies zu erreichen, müssen die folgenden Schritte eingehalten werden. Zuerst müssen automatisierte Tests geschrieben werden, die alle bisherigen Funktionalitäten der Software testen und die während dem Refaktorisieren immer wieder angewendet werden können. Diese Tests geben die Sicherheit, dass keine Fehler eingebaut werden und dass sich das Verhalten der Software nicht verändert. Im zweiten Schritt wird der Code durch das Anwenden von Refaktorisierungen neu strukturiert und vereinfacht. Erst wenn die Phase des Refaktorisierens abgeschlossen ist, dürfen der Software wieder neue Funktionalitäten hinzugefügt werden. Das folgende Java-Beispiel, ein bearbeiteter Ausschnitt des Beispiels von Fowler [1], zeigt exemplarisch das Anwenden einfacher Refaktorisierungen. Es handelt sich um Software eines Videoverleihs, die die Rechnungen der Kunden druckt. Dazu wird anhand der Ausleihdauer und der Kategorie von Filmen die Miete berechnet. Zusätzlich werden bei Filmen, die der Kategorie 'Neuerscheinungen' angehören, Bonuspunkte vergeben, die auch auf der Rechnung vermerkt werden. Fig. 1. Assoziationen zwischen den Klassen Movie, Rental und Customer // Datenklasse fuer die verschiedenen Filme public class Movie { public static final int CHILDREN = 2; public static final int REGULAR = 0; public static final int NEW_ RELEASE = 1; private String title ; private int pricecode ;
3 Refactoring 3 public Movie ( String title, int pricecode ){ this. title = title ; this. pricecode = pricecode ; public int getpricecode () { return this. pricecode ; public void setpricecode ( int arg ){ this. pricecode = arg ; public String gettitle () { return this. title ; // Die Klasse Rental repraeseniert die Ausleihen eines Films durch einen Kunden class Rental { private Movie movie ; private int daysrented ; public Rental ( Movie movie, int daysrented ){ this. movie = movie ; this. daysrented = daysrented ; public int getdaysrented () { return this. daysrented ; public Movie getmovie () { return this. movie ; // Klasse fuer Kunden der Videothek public class Customer { private String name ; private List < Rental > rentals = new ArrayList < Rental >() ; public Customer ( String name ){ this. name = name ; public void addrental ( Rental arg ){ this. rentals. add ( arg ); public String getname () { return this. name ; public String statement () { double totalamount = 0;
4 4 Dominique Steiner, Monica De Donato int frequentrenterpoints = 0; Iterator it = rentals. iterator () ; String result = " Rental Record for " + getname () + "\ n"; while ( it. hasnext () ) { double thisamount = 0; Rental each = ( Rental ) it. next () ; // Betraege pro Zeile ermitteln switch ( each. getmovie (). getpricecode () ){ case Movie. REGULAR : thisamount +=2; if ( each. getdaysrented () > 2) thisamount += ( each. getdaysrented () - 2) * 1.5; case Movie. NEW_ RELEASE : thisamount += each. getdaysrented () * 3; case Movie. CHILDREN : thisamount += 1.5; if ( each. getdaysrented () > 3) thisamount += ( each. getdaysrented () - 3) * 1.5; // Bonuspunkte aufaddieren frequentrenterpoints ++; // Bonuspunkte fuer zweitaegige Ausleihe einer Neuerscheinung if (( each. getmovie (). getpricecode () == Movie. NEW_RELEASE ) && each. getdaysrented () > 1) frequentrenterpoints ++; // Zahlen fuer diese Ausleihe ausgeben result += "\t" + each. getmovie (). gettitle () + "\t" + String. valueof ( thisamount ) + "\n"; totalamount += thisamount ; // Fusszeilen einfuegen result += " Amount owned is " + String. valueof ( totalamount ) + "\n"; result += " You earned " + String. valueof ( frequentrenterpoints ) + " frequent renter points "; return result ; Die Methode statement() gibt einen String mit der Rechnung des Kunden zurück. Ziel des Beispiels von Fowler ist es, die gewünschte Änderung, die Ausgabe der
5 Refactoring 5 Rechnung in HTML, zu ermöglichen. Dies wäre hier zwar möglich, es müsste dazu jedoch eine ganz neue Methoden geschrieben werden, da die bisherige Methode statement() sehr lang und unübersichtlich ist. Zudem lassen sich auch keine Teile dieser Methode wiederverwenden, was dazu führen würde, dass nach dem Einfügen der Änderung duplizierter Code vorhanden ist. Dies soll nun mit Hilfe von Refaktorisieren geändert werden, damit einzelne Funktionen, die sich bisher in der Methode statement() benden, auch für die moderne Ausgabe zur Verfügung stehen. Dazu wird im ersten Schritt der Switch-Abschnitt mit Methode extrahieren in eine eigenständige Methode amountfor() umgewandelt. Dabei muss besonders auf die Parameter und lokalen Variablen acht gegeben werden. private String name ; private List < Rental > rentals = new ArrayList < Rental >() ; public Customer ( String name ){ this. name = name ; public void addrental ( Rental arg ){ this. rentals. add ( arg ); public String getname () { return this. name ; public String statement () { double totalamount = 0; int frequentrenterpoints = 0; Iterator it = rentals. iterator () ; String result = " Rental Record for " + getname () + "\ n"; while ( it. hasnext () ) { double thisamount = 0; Rental each = ( Rental ) it. next () ; thisamount = amountfor ( each ); // Bonuspunkte aufaddieren frequentrenterpoints ++; // Bonuspunkte fuer zweitaegige Ausleihe einer Neuerscheinung if (( each. getmovie (). getpricecode () == Movie. NEW_RELEASE ) && each. getdaysrented () > 1) frequentrenterpoints ++; // Zahlen fuer diese Ausleihe ausgeben result += "\t" + each. getmovie (). gettitle () + "\t" + String. valueof ( thisamount ) + "\n"; totalamount += thisamount ;
6 6 Dominique Steiner, Monica De Donato // Fusszeilen einfuegen result += " Amount owned is " + String. valueof ( totalamount ) + "\n"; result += " You earned " + String. valueof ( frequentrenterpoints ) + " frequent renter points "; return result ; private double amountfor ( Rental each ) { double thisamount = 0; // Betraege pro Zeile ermitteln switch ( each. getmovie (). getpricecode () ){ case Movie. REGULAR : thisamount +=2; if ( each. getdaysrented () > 2) thisamount += ( each. getdaysrented () - 2) * 1.5; case Movie. NEW_ RELEASE : thisamount += each. getdaysrented () * 3; case Movie. CHILDREN : thisamount += 1.5; if ( each. getdaysrented () > 3) thisamount += ( each. getdaysrented () - 3) * 1.5; return thisamount ; Als zweiter Schritt werden nun die Variablen each und thisamount umbenennt. Durch einen aussagekräftigen Namen wird der Code besser lesbar und es ist sofort erkennbar, was für ein Wert in der Variable gespeichert ist. private double amountfor ( Rental arental ) { double result = 0; // Betraege pro Zeile ermitteln switch ( arental. getmovie (). getpricecode () ){ case Movie. REGULAR : result +=2; if ( arental. getdaysrented () > 2) result += ( arental. getdaysrented () - 2) * 1.5; case Movie. NEW_ RELEASE : result += arental. getdaysrented () * 3; case Movie. CHILDREN : result += 1.5;
7 Refactoring 7 if ( arental. getdaysrented () > 3) result += ( arental. getdaysrented () - 3) * 1.5; return result ; Da die Methode amountfor() enger mit der Klasse Rental als mit der Klasse Customer zusammenarbeitet, ist es sinnvoller, diese Methode in die Klasse Rental zu verschieben. Beim Verschieben der Methode, muss diese der neuen Umgebung angepasst werden. class Rental { private Movie movie ; private int daysrented ; public Rental ( Movie movie, int daysrented ){ this. movie = movie ; this. daysrented = daysrented ; public int getdaysrented () { return this. daysrented ; public Movie getmovie () { return this. movie ; double getcharge () { double result = 0; // Betraege pro Zeile ermitteln switch ( getmovie (). getpricecode () ){ case Movie. REGULAR : result +=2; if ( getdaysrented () > 2) result += ( getdaysrented () - 2) * 1.5; case Movie. NEW_ RELEASE : result += getdaysrented () * 3; case Movie. CHILDREN : result += 1.5; if ( getdaysrented () > 3) result += ( getdaysrented () - 3) * 1.5; return result ; public class Customer {
8 8 Dominique Steiner, Monica De Donato... /* * deprecated Use Rental # getcharge () instead */ private double amountfor ( Rental arental ) { return arental. getcharge () ; Nun wird der Methodenaufruf in der Klasse Customer durch einen Aufruf der neuen Klasse ersetzt. Dadurch kann die veraltete Methode aus der Klasse Customer entfernt werden. public class Customer { private String name ; private List < Rental > rentals = new ArrayList < Rental >() ; public Customer ( String name ){ this. name = name ; public void addrental ( Rental arg ){ this. rentals. add ( arg ); public String getname () { return this. name ; public String statement () { double totalamount = 0; int frequentrenterpoints = 0; Iterator it = rentals. iterator () ; String result = " Rental Record for " + getname () + "\ n"; while ( it. hasnext () ) { double thisamount = 0; Rental each = ( Rental ) it. next () ; thisamount = each. getcharge () ; // Bonuspunkte aufaddieren frequentrenterpoints ++; // Bonuspunkte fuer zweitaegige Ausleihe einer Neuerscheinung if (( each. getmovie (). getpricecode () == Movie. NEW_RELEASE ) && each. getdaysrented () > 1) frequentrenterpoints ++; // Zahlen fuer diese Ausleihe ausgeben
9 Refactoring 9 result += "\t" + each. getmovie (). gettitle () + "\t" + String. valueof ( thisamount ) + "\n"; totalamount += thisamount ; // Fusszeilen einfuegen result += " Amount owned is " + String. valueof ( totalamount ) + "\n"; result += " You earned " + String. valueof ( frequentrenterpoints ) + " frequent renter points "; return result ; Da thisamount in dieser Klasse nur zweimal vorkommt, kann diese Variable durch den Einsatz von direkten Methodenaufrufen eingespart werden. public class Customer { private String name ; private List < Rental > rentals = new ArrayList < Rental >() ; public Customer ( String name ){ this. name = name ; public void addrental ( Rental arg ){ this. rentals. add ( arg ); public String getname () { return this. name ; public String statement () { double totalamount = 0; int frequentrenterpoints = 0; Iterator it = rentals. iterator () ; String result = " Rental Record for " + getname () + "\ n"; while ( it. hasnext () ) { Rental each = ( Rental ) it. next () ; // Bonuspunkte aufaddieren frequentrenterpoints ++; // Bonuspunkte fuer zweitaegige Ausleihe einer Neuerscheinung if (( each. getmovie (). getpricecode () == Movie. NEW_RELEASE ) && each. getdaysrented () > 1) frequentrenterpoints ++; // Zahlen fuer diese Ausleihe ausgeben result += "\t" + each. getmovie (). gettitle () + "\t" + String. valueof ( each. getcharge () ) + "\n";
10 10 Dominique Steiner, Monica De Donato totalamount += each. getcharge () ; // Fusszeilen einfuegen result += " Amount owned is " + String. valueof ( totalamount ) + "\n"; result += " You earned " + String. valueof ( frequentrenterpoints ) + " frequent renter points "; return result ; Nun ist die Methode statement() der Klasse Customer bereits deutlich schlanker. Wichtig ist, dass beim Refaktorisieren immer kleine Schritte gemacht und mit den vorbereiteten Tests geprüft werden. Natürlich ist das Refaktorisieren dieser Klassen und das Einbauen der Veränderung hier keineswegs schon abgeschlossen. Martin Fowler zeigt in seinem Buch noch weitere Techniken des Refaktorisieren und führt diese und weitere Änderungen zu Ende. 2 Warum Refaktorisieren? Refaktorisierung ist ein Werkzeug, das für verschiedene Zwecke eingesetzt werden kann und hilft, Software im Gri zu behalten. Durch Eliminieren von Redundanz kann die Menge des Codes oft verringert werden. Dies hilft, einen besseren Überlick zu behalten und bei Änderungen diese nur an einer Stelle durchführen zu müssen. Zudem macht eine optimierte Struktur Software leichter verständlich für Programmierer, die Änderungen daran vornehmen müssen und hilft so Zeit zu sparen. Bei refaktorisiertem Code sind die Absichten der einzelnen Methoden besser erkennbar, vor allem wenn darauf geachtet wird, die Konvention eine Methode für eine Aufgabe einzuhalten. Als sinnvoll hat sich auch erwiesen, alles Wichtige direkt im Code zu dokumentieren. So steht das Wissen nicht nur dem aktuellen Programmierer, sondern auch seinen Nachfolgern genau dann zur Verfügung, wenn es nötig ist und hilft beim Verständnis für den Code. Durch die klar erkennbaren Absichten des Codes, die Dokumentation und das bessere Verständnis lassen sich viele Fehler vermeiden, was natürlich auch dazu beiträgt, produktiver zu arbeiten. Dass sich Qualität, Lesbarkeit und Struktur des Codes verbessern, ist oensichtlich. Dass Refaktorisierung auch hilft schneller zu programmieren, ist nicht ganz so schnell erkennbar. Dies ist darauf zurückzuführen, dass Programmmierer sehr viel Zeit darauf verwenden, Fehler in der Software zu nden. Durch das Refaktorisieren in kleinen Schritten und den Tests, die immer wieder angewendet werden, sind Fehler viel schneller zu nden, wodurch sich viel Zeit einsparen lässt. In vielen Firmen ist der Zeitdruck für Neuerungen in der Software hoch, so dass der Refaktorisierung des Codes keine Zeit eingeräumt wird. Zudem ist Refaktorisierung auf den ersten Blick auch mit mehr Aufwand und mehr Kosten
11 Refactoring 11 verbunden, was für Unternehmen eher dagegen spricht. Trotzdem kommt die Refaktorisierung der bestehenden Software, in welche bereits viel Geld geossen ist, in der Regel billiger, als die ganze Software neu zu programmieren. Zudem ist es für Programmierer, welche später an der Software arbeiten, einfacher, refaktorisierten Code zu verstehen, was für das Unternehmen auch Kosteneinsparungen bedeutet. Bei refaktorisiertem Code ist es oft einfacher, einen Überblick zu gewinnen. Oft werden beim Schreiben der Tests auch Fehler in der bisherigen Software gefunden. Diese können während dem Refaktorisieren behoben werden. 3 Wann wird Refaktorisieren eingesetzt? 3.1 Zeitpunkt des Refaktorisierens Refaktorisieren sollte immer in kleinen Schritten gemacht werden. Es ist besser, nicht Zeit einzuplanen zum Refaktorisieren, sondern Refaktorisieren dann einzusetzen, wenn es hilft etwas anderes einfacher zu machen. In seinem Buch empehlt Fowler die Dreierregel, die dabei helfen kann, den Zeitpunkt zum Refaktorisieren festzulegen. Wenn Sie etwas das erste Mal machen, tun Sie es einfach. Das zweite Mal, wenn Sie etwas ähnliches machen, so scheuen Sie zwar die Wiederholung, aber Sie machen es trotzdem noch einmal. Wenn Sie etwas Ähnliches das dritte Mal tun, refaktorisieren Sie.[1, Seite 46] Häug wird refaktorisiert, wenn Software etwas Neues hinzuzufügt wird. Hier können Anpassungen der Struktur ermöglichen, dass Neues leichter eingefügt werden kann. Das Verbessern der Struktur des Codes dank Refaktorisierung trägt dazu bei, dass Fehler in Programmen gefunden werden können. Code-Reviews in kleinen Teams dienen dazu, Wissen gleichmässig zu verteilen und an jüngere weiterzugeben. Hier können mehrere Personen nützliche Infos beitragen zum Verbessern von Software. Es lohnt sich auch hier, bei Vorschlägen, zu überlegen, ob diese durch Refaktorisieren leicht umzusetzen sind und dies bei guten Vorschlägen direkt zu machen. 3.2 Welcher Code muss Refaktorisiert werden? Duplizierter Code Wenn die gleiche Codestruktur in einem Programm an mehr als einer Stelle vorkommt, sollte immer refaktorisiert und dieser Code vereinigt werden. Kommt der Code in der gleichen Klasse zweimal vor, kann dies sehr einfach durch Methode extrahieren an der einen Stelle gemacht werden. Danach wird die neu erstellte Methode an beiden Orten aufgerufen. Kommt der gleiche Code in verschiedenen Geschwisterklassen oder ähnlicher Code in mehreren Klassen vor, kann auch hier, durch den Einsatz geeigneter Refaktorisierungen, das Programm verbessert werden.
12 12 Dominique Steiner, Monica De Donato Lange Methode Kurze Methoden machen ein Programm durch bessere Verständlichkeit, gemeinsame Nutzung und Auswahl viel langlebiger. Es ist jedoch sehr wichtig, dass diese kurzen Methoden gute Name haben, so dass der Rumpf nicht gelesen werden muss um zu wissen was gemacht wird. Methoden verkürzen wird durch Methode extrahieren gemacht, hier sollte darauf geachtet werden, dass nicht zu viele Parameter mitgegeben werden. Diese sollten, wenn möglich, durch temporäre Variablen oder direkte Aufrufe ersetzt werden, was mit den entsprechenden Refaktorisierungen einfach umzusetzen ist. Grosse Klasse Grosse Klassen, die zu viel tun, sind meist an zu vielen Instanzvariablen erkennbar. Hier kann oft Klasse extrahieren angewandt werden, um aus Instanzvariablen, die zusammenpassen ein neues Objekt zu erzeugen. In Klassen, die viel Code und sehr lange Methoden enthalten, bendet sich oft auch redundanter Code, der durch kürzere Methoden mehrfach genutzt werden kann. Lange Parameterliste Bei der objektorientierten Programmierung wird nicht mehr alles, was eine Methode benötigt, als Parameter übergeben. Es wird nur soviel übergeben, dass die Methode sich die anderen Informationen selber holen kann. Daher sollen Parameter wenn möglich durch einen direkten Methodenaufruf ersetzt werden, was durch die Refaktorisierung Paramter durch explizite Methode ersetzen erreicht wird. Divergierende Änderungen Divergierende Änderungen lassen sich dadurch erkennen, dass die Struktur der Software es nicht zulässt, Änderungen an einer Stelle einfach vorzunehmen. Dies kann dadurch entstehen, dass einen Klasse häug verändert wird. Müssen bei Änderungen an mehreren Stellen Anpassungen vorgenommen werden, kann es helfen, die Klasse mit Klassse extrahieren zu teilen und zwei Objekte daraus zu machen. 3.3 Schwierigkeiten beim Refaktorisieren Refaktorisieren ist eine sehr gute Methode, doch es gibt Situtationen, bei denen sich Schwierigkeiten ergeben können. Bei Datenbanken bringt die enge Anbindung an Applikationen sowie die Migration von Daten Schwierigkeiten beim Refaktorisieren mit sich. Bei nicht objektorientierten Datenbanken gibt es die Möglichkeit, dies durch eine zusätzliche Softwareschicht zu lösen, da sich die Veränderungen so isolieren lassen. Die Migration von objektorientierte Datenbanken ist mit sehr viel Aufwand verbunden, auch wenn einige Datenbanken automatische Funktionen zur Migration von Objekten anbieten.
13 Refactoring 13 Das Ändern von öentlichen Schnittstellen (public Methoden) kann Auswirkungen auf nicht vorhersehbare Komponenten haben, da diese oft von anderen Programmen genutzt werden. Viele Refaktorisierungs-Techniken verändern jedoch die Schnittstellen, wie zum Beispiel Methode umbenennen. Daher braucht das Ändern dieser Schnittstellen eine aufwändigen Prozess. Über längere Zeit werden beide Schnittstellen beibehalten, wobei alte als deprecated bezeichnet wird, die nicht mehr verwendet werden soll. Erst nachdem alle Nutzer die Möglichkeit hatten ihre Programme anzupassen, darf die alte Schnittstelle aufgehoben werden. Beim Veröentlichen von Schnittstellen sollte daher gut überlegt werden, welche wirklich geönet werden. Wenn Code sehr schlecht ist und nicht funktioniert, kann nicht refaktorisiert werden. Denn um refaktorisieren zu können, müssen die Tests, welche die Funktionalität prüfen, alle korrekt durchlaufen. In dieser Situation ist es einfacher, den Code neu zu schreiben. Ein weiterer Zeitpunkt, zu dem eine Refaktorisierung des Codes nicht sinnvoll ist, ist kurz vor dem Abgabetermin. Hier kann kein Produktivitätsgewinn mehr herausgeholt werden. 3.4 Refaktorisieren und Design Obwohl sich durch Refaktorisieren das Design verbessern lässt, lohnt es sich, das Design zuerst zu planen und danach zu programmieren. Wenn sich beim Planen verschiedene Möglichkeiten bieten, kann Refaktorisieren mithelfen sich zu entscheiden. Wenn sich nämlich die einfachere Lösung durch Refaktorisieren ohne viel Aufwand in die exiblere, meist aber kompliziertere Lösung umbauen lässt, ist es sinnvoll zu diesem Zeitpunkt die einfache Lösung zu implementieren. Falls es nötig wird, kann diese dann später immer noch zur exibleren Lösung ausgebaut werden. 3.5 Refaktorisieren und Performance Durch das Refaktorisieren wird die Struktur des Programms zwar übersichtlicher, dabei jedoch meist langsamer. Hier wird der Ansatz so gewählt, dass zuerst refaktorisiert wird, danach wird an dem optimierten Code ein Performace Tuning durchgeführt. Die Ausnahme sind Echtzeitsysteme, bei denen für alle Methoden ein Zeitbudget erstellt wird, dass eingehalten werden muss. 4 Refaktorisierungs-Werkzeuge (Tools) 4.1 Allgemein In Entwicklungsumgebungen sind heute Werkzeuge zum Refaktorisieren eingebaut, die viele der erwähnten Techniken unterstützen. Dies erleichtert die Arbeit der Programmierer, da sie nicht mehr auf Hilfsmittel wie Suchen/Ersetzen angewiesen sind, sondern genau auf die anzuwendende Refaktorisierung abgestimmte Methoden nutzen können. Was natürlich hilft Zeit zu sparen, aber auch vermeidet, dass aus Versehen neue Fehler in den Code eingebaut werden.
14 14 Dominique Steiner, Monica De Donato Table 1. Übersicht über verschieden Werkzeuge zum Refaktorisieren Sprache IDE How To Eclipse integriert in die Grundinstallation von Eclipse Java Refactorit Plattformunabhängiges Plugin für NetBeans, Eclipse und andere IDEs JRefactory Bietet neben Refaktorisierung auch Funktionalitäten für UML Diagramme.NET C#Refactory in Visual Studio integriert, funktioniert ähnlich wie bei Eclipse C/C++ REF++ intergriert in Visual Studio zum Refaktorisieren von C++ Code Visual Basic Refactor for VB Plugin für Visual Studio Delphi ModelMaker In diesem Plugin stehen nur die einfachsten Refaktorisierungen zur Verfügung 4.2 Eclipse Auch Eclipse bietet bereits in der Grundinstallation die gängigen Techniken zum Refaktorisieren an. Diese benden sich im Menu Refactor (Fig. 3 Eclipse- Menu) oder können durch einen rechten Mausklick aufgerufen werden. Das Refaktorisieren von Code mit Eclipse ist sehr einfach, da beim Benutzen die Angaben, die zum Ausführen der jeweiligen Refaktorisierung notwendig sind, in Dialogfenstern (Fig. 4) gemacht werden können. Am Schluss bietet Eclipse eine Vorschau (Fig. 5), in der der aktuelle Code und der zukünftige Code nebeneinander stehen und verglichen werden. 5 Refaktorisieren mit Eclipse Das folgende Beispiel zeigt die Refaktorisierung Methode extrahieren mit Eclipse 3.4. Der Code der verwendet wird, ist aus dem Beispiel im ersten Kapitel. Es geht darum den Switch-Abschnitt, mit Hilfe von Eclipse, automatisiert in eine eigene Methode umzuwandeln. Dazu wird als erstes die Codestelle, die extrahiert werden soll, markiert (Fig. 2). Fig. 2. Markieren der Codestelle
15 Refactoring 15 Als Nächstes wird im Menu Refactor der Punkt Extract Method... aufgerufen (Fig. 3). Fig. 3. Auswählen des Menupunktes Nun önet sich ein Dialogfenster. Hier wird der Name der neuen Methode angegeben. Zudem besteht die Möglichkeit Parameter, die übergeben werden, zu bearbeiten (Fig. 4). Fig. 4. Dialogfenster zum Eingeben der nötigen Parameter
16 16 Dominique Steiner, Monica De Donato Bevor die Refaktorisierung vollständig durchgeführt wird, können die Änderungen im nächsten Fenster kontrolliert werden (Fig. 5). Fig. 5. Vorschaufenster zum Kontrollieren der Änderungen Nun ist die Methode extrahiert. Eclipse hat an der markierten Stelle automatisch den Aufruf der neuen Methode eingefügt. Die neue Methode wurde nach den bestehenden Methoden hinzugefügt (Fig. 6). Fig. 6. Änderungen im Code 6 Detaillierte Beschreibung einer Refaktorisierung 6.1 Klasse extrahieren Klassen wachsen mit der Zeit. Es werden laufend mehr Methoden und Daten hinzugefügt, so dass sie gross und schlecht verständlich werden. In diesem Fall
17 Refactoring 17 sollte eine Klasse zerlegt werden. Dazu werden die Daten und Methoden, die zusammen passen in eine neue Klasse gepackt. Fig. 7. Klasse Person, die in die beiden Klassen Person und TelephoneNumber aufgeteilt wird public class Person { public String getname () { return this. name ; public String gettelephonenumber () { return "(" + this. officeareacode + ") " + this. officenumber ; public String getofficeareacode () { return this. officeareacode ; public void setofficeareacode ( String arg ){ this. officeareacode = arg ; public String getofficenumber () { return this. officenumber ; public void setofficenumber ( String arg ){ this. officenumber = arg ; private String name ; private String officeareacode ; private String officenumber ; In diesem Beispiel ist die Klasse Person gewachsen und enthält Informationen zum Tefonnummer-Verhalten, die in eine eigene Klasse verschoben werden können. Hierfür wird im ersten Schritt die neue Klasse deniert. public class TelephoneNumber { Nun werden die notwendigen Assoziationen gemacht. public class Person {
18 18 Dominique Steiner, Monica De Donato private TelephoneNumber officetelephone = new TelephoneNumber () ;... Als Nächstes werden mit Feld verschieben die Variablen erstellt. public class Person { public String getname () { return this. name ; public String gettelephonenumber () { return "(" + getofficeareacode () + ") " + this. officenumber ; public String getofficeareacode () { return this. officetelephone. getareacode () ; public void setofficeareacode ( String arg ){ this. officetelephone. setareacode ( arg ); public String getofficenumber () { return this. officenumber ; public void setofficenumber ( String arg ){ this. officenumber = arg ; private TelephoneNumber officetelephone = new TelephoneNumber () ; private String name ; private String officenumber ; Nun werden die Methoden durch Methode verschieben in die neue Klasse verschoben. public class Person { public String getname () { return this. name ; public String gettelephonenumber () { return this. officetelephone. gettelephonenumber () ; public TelephoneNumber getofficetelephone () { return this. officetelephone ; TelephoneNumber officetelephone = new TelephoneNumber () ; private String name ; public class TelephoneNumber { public String gettelephonenumber () {
19 Refactoring 19 return ("("+ this. areacode +")"); public String getareacode () { return this. areacode ; public void setareacode ( String arg ){ this. areacode = arg ; public String getnumber () { return this. number ; public void setnumber ( String arg ){ this. number = arg ; private String areacode ; private String number ; Zuletzt wird entschieden welche Methoden öentlich gemacht werden. Jetzt haben beide Klassen wieder klar denierte Verantwortlichkeiten die sie wahrnehmen. 7 Unit Tests Geeignete Tests sind etwas vom Wichtigsten beim Refaktorisieren, auch wenn die Refaktorisierungen mit Hilfsmitteln durchgeführt werden. Das Schreiben von Test bringt meist ein erhöhtes Programmiertempo mit sich, da viel weniger Zeit für die Fehlersuche aufgewendet werden muss. Jedes mal beim Verändern des Codes werden die Tests ausgeführt. So sind Fehler viel schneller zu nden, da in den kleinen Schritten nur wenig Code verändert werden muss und dieser dem Programmierer noch präsent ist. Durch das intensive Auseinandersetzen mit dem Code, werden auch Fehler von früher in den Programmen entdeckt und können verbessert werden. Mit dem Schreiben der Tests sollte vor oder mit dem Programm begonnen werden. Geeignet ist, zuerst die Tests zu schreiben und danach die entsprechende Funktionalität zu implementieren. Durch die Konzentration auf die Schnittstelle beim Schreiben der Tests, ist das Implementieren der Funktion meist einfacher, da klar ist, was die Funktion machen muss. Zudem ist eindeutig, dass die Funktion fertig implementiert ist, sobald der Test funktioniert. Um jedoch das Refaktorisieren sinnvoll mit Tests unterstützen zu können, müssen diese so angelegt werden, dass sie vollständig automatisiert sind, dass heisst jeder Test muss sich selbst überprüfen und zurückgeben, ob er korrekt durchgelaufen ist oder nicht. Üblich ist, dass pro Klasse eine Testklasse geschrieben wird, welche die Methoden überprüft. Gut geeignet dazu ist das JUnit Framework. Nach dem Durchführen der Test werden die Resultate in der Konsole oder im GUI ausgegeben. Das GUI stellt die Resultate mit roten oder grünen Balken graphisch
20 20 Dominique Steiner, Monica De Donato dar, so ist auf einen Blick sichtbar, ob die Tests erfolgreich durchgelaufen sind. Während dem Refaktorisieren werden nur die Test, zu der veränderten Programmstelle ausgeführt. Wenn immer alle Tests durchgeführt würden, wäre dies ein zu grosser Zeitverlust. Die gesamten Test werden meist über Nacht durchgeführt, wenn niemand dadurch bei der Arbeit gestört wird. 8 Fazit Refaktorisierung ist eine hervorragende Technik, die heute noch viel zu wenig eingesetzt wird. Es wäre wünschenswert, dass sie sich weiter verbreiten und vermehrt zum Einsatz kommen würde. Dazu müssten sicher bei vielen Leuten erst Vorurteile über Aufwand und Kosten abgebaut und der Gewinn, der mit Refaktorisieren gemacht werden kann, aufgezeigt werden. Oft müsste dazu wohl erst eine solide Testumgebung aufgebaut werden, was für den Anfang einen Mehraufwand bedeutet, der sich jedoch, nach der Umstellungsphase durch produktiveres Arbeiten auszahlen wird. Als Programmierer ist es sinnvoll, sich die Technik des Refaktorisierens anzueignen, um sie zum produktivieren Arbeiten nutzen zu können. Mit den Tools, die heute zum Refaktorisieren zur Verfügung stehen, können die verschiedenen Refaktorisierungen sehr einfach und schnell angewendet werden. Dadurch wird der eigene Code übersichtlicher und besser verständlich für sich selber und andere Programmierer. References 1. Fowler, M.: Refactoring. Wie Sie das Design vorhandener Software verbessern. Addison-Wesley Verlag (Deutschland) GmbH, Bonn (2005) 2. Fowler, M.: Refactoring. Improving The Design of Existing Code. Addison-Wesley Publishing Co., Inc., Reading, MA (1999) 3. Fowler, M.,: Refactoring. Online,
Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch
Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen Alexander Schunk Henry Trobisch Inhalt 1. Vergleich der Unit-Tests... 2 2. Vergleich der Codeabdeckungs-Tests... 2 3. Vergleich
MehrLineargleichungssysteme: Additions-/ Subtraktionsverfahren
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als
MehrDiese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.
Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,
MehrDieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.
Millennium SMS Service Schnellübersicht Seite 1 von 6 1. Tägliche Arbeiten mit der SMS Bestätigung Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.
MehrFachbericht zum Thema: Anforderungen an ein Datenbanksystem
Fachbericht zum Thema: Anforderungen an ein Datenbanksystem von André Franken 1 Inhaltsverzeichnis 1 Inhaltsverzeichnis 1 2 Einführung 2 2.1 Gründe für den Einsatz von DB-Systemen 2 2.2 Definition: Datenbank
MehrBinäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen
Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders
MehrSoftware Engineering Klassendiagramme Assoziationen
Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen
MehrObjektorientierte Programmierung für Anfänger am Beispiel PHP
Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten
MehrHilfe zur Urlaubsplanung und Zeiterfassung
Hilfe zur Urlaubsplanung und Zeiterfassung Urlaubs- und Arbeitsplanung: Mit der Urlaubs- und Arbeitsplanung kann jeder Mitarbeiter in Coffee seine Zeiten eintragen. Die Eintragung kann mit dem Status anfragen,
MehrSEP 114. Design by Contract
Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit
MehrKlassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java
Objektorientierte Programmierung mit Java Eine praxisnahe Einführung mit BlueJ Klassenentwurf Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? 1.0 Zentrale Konzepte
MehrSuche schlecht beschriftete Bilder mit Eigenen Abfragen
Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere
MehrJava: Vererbung. Teil 3: super() www.informatikzentrale.de
Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und
MehrBilder zum Upload verkleinern
Seite 1 von 9 Bilder zum Upload verkleinern Teil 1: Maße der Bilder verändern Um Bilder in ihren Abmessungen zu verkleinern benutze ich die Freeware Irfan View. Die Software biete zwar noch einiges mehr
MehrARCO Software - Anleitung zur Umstellung der MWSt
ARCO Software - Anleitung zur Umstellung der MWSt Wieder einmal beschert uns die Bundesverwaltung auf Ende Jahr mit zusätzlicher Arbeit, statt mit den immer wieder versprochenen Erleichterungen für KMU.
Mehrbilder.tibs.at Upload-Assistent
bilder.tibs.at Upload-Assistent Der bisherige Upload-Assistent, der als Windowsprogramm vorlag, wird nun durch eine neue Version abgelöst. Diese Version ermöglicht den Upload der Bilder direkt über die
Mehr! " # $ " % & Nicki Wruck worldwidewruck 08.02.2006
!"# $ " %& Nicki Wruck worldwidewruck 08.02.2006 Wer kennt die Problematik nicht? Die.pst Datei von Outlook wird unübersichtlich groß, das Starten und Beenden dauert immer länger. Hat man dann noch die.pst
MehrUrlaubsregel in David
Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5
MehrAnwendungsbeispiele. Neuerungen in den E-Mails. Webling ist ein Produkt der Firma:
Anwendungsbeispiele Neuerungen in den E-Mails Webling ist ein Produkt der Firma: Inhaltsverzeichnis 1 Neuerungen in den E- Mails 2 Was gibt es neues? 3 E- Mail Designs 4 Bilder in E- Mails einfügen 1 Neuerungen
MehrAbamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER
Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos in Verbindung mit der Webshopanbindung wurde speziell auf die Shop-Software shop to date von DATA BECKER abgestimmt. Mit
MehrMit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.
Seite erstellen Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Es öffnet sich die Eingabe Seite um eine neue Seite zu erstellen. Seiten Titel festlegen Den neuen
MehrAnleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung
Anleitung zur Daten zur Datensicherung und Datenrücksicherung Datensicherung Es gibt drei Möglichkeiten der Datensicherung. Zwei davon sind in Ges eingebaut, die dritte ist eine manuelle Möglichkeit. In
MehrZimmertypen. Zimmertypen anlegen
Zimmertypen anlegen Hier legen Sie Ihre Zimmer an, damit sie auf der Homepage dargestellt werden und online buchbar gemacht werden können. Wobei wir ausdrücklich darauf hinweisen möchten, dass es ganz
MehrMenü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen
Menü Macro WinIBW2-Macros unter Windows7?... 1 Macros aufnehmen... 1 Menübefehle und Schaltflächen in Macros verwenden... 4 Macros bearbeiten... 4 Macros löschen... 5 Macro-Dateien... 5 Macros importieren...
MehrWindows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1
Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Wenn der Name nicht gerade www.buch.de oder www.bmw.de heißt, sind Internetadressen oft schwer zu merken Deshalb ist es sinnvoll, die Adressen
Mehr1. Software installieren 2. Software starten. Hilfe zum Arbeiten mit der DÖHNERT FOTOBUCH Software
1. Software installieren 2. Software starten Hilfe zum Arbeiten mit der DÖHNERT FOTOBUCH Software 3. Auswahl 1. Neues Fotobuch erstellen oder 2. ein erstelltes, gespeichertes Fotobuch laden und bearbeiten.
MehrInformatik 2 Labor 2 Programmieren in MATLAB Georg Richter
Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter Aufgabe 3: Konto Um Geldbeträge korrekt zu verwalten, sind zwecks Vermeidung von Rundungsfehlern entweder alle Beträge in Cents umzuwandeln und
MehrEr musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt
Inhaltsverzeichnis Aufgabe... 1 Allgemein... 1 Active Directory... 1 Konfiguration... 2 Benutzer erstellen... 3 Eigenes Verzeichnis erstellen... 3 Benutzerkonto erstellen... 3 Profil einrichten... 5 Berechtigungen
MehrZwischenablage (Bilder, Texte,...)
Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen
MehrKostenstellen verwalten. Tipps & Tricks
Tipps & Tricks INHALT SEITE 1.1 Kostenstellen erstellen 3 13 1.3 Zugriffsberechtigungen überprüfen 30 2 1.1 Kostenstellen erstellen Mein Profil 3 1.1 Kostenstellen erstellen Kostenstelle(n) verwalten 4
MehrProgrammierkurs Java
Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen
MehrOutlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang
sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche
Mehrteischl.com Software Design & Services e.u. office@teischl.com www.teischl.com/booknkeep www.facebook.com/booknkeep
teischl.com Software Design & Services e.u. office@teischl.com www.teischl.com/booknkeep www.facebook.com/booknkeep 1. Erstellen Sie ein neues Rechnungsformular Mit book n keep können Sie nun Ihre eigenen
MehrKleines Handbuch zur Fotogalerie der Pixel AG
1 1. Anmelden an der Galerie Um mit der Galerie arbeiten zu können muss man sich zuerst anmelden. Aufrufen der Galerie entweder über die Homepage (www.pixel-ag-bottwartal.de) oder über den direkten Link
MehrFastBill Automatic. Dokumentation Versand. FastBill GmbH. Holteyer Straße 30 45289 Essen Telefon 0201 47091505 Telefax 0201 54502360
FastBill GmbH Holteyer Straße 30 45289 Essen Telefon 0201 47091505 Telefax 0201 54502360 FastBill Automatic Dokumentation Versand 1 Inhaltsverzeichnis: 1. Grundlegendes 2. Produkteinstellungen 2.1. Grundeinstellungen
MehrEINFACHES HAUSHALT- KASSABUCH
EINFACHES HAUSHALT- KASSABUCH Arbeiten mit Excel Wir erstellen ein einfaches Kassabuch zur Führung einer Haushalts- oder Portokasse Roland Liebing, im November 2012 Eine einfache Haushalt-Buchhaltung (Kassabuch)
MehrComputeria Rorschach Mit Excel Diagramme erstellen
Mit Excel Diagramme erstellen 25.12.2010 Roland Liebing Mit Excel Diagramme erstellen Diagramme können Zahlenwerte veranschaulichen, das heisst, mit Hilfe eines Diagramms können Zahlen besser miteinander
Mehr1. Einschränkung für Mac-User ohne Office 365. 2. Dokumente hochladen, teilen und bearbeiten
1. Einschränkung für Mac-User ohne Office 365 Mac-User ohne Office 365 müssen die Dateien herunterladen; sie können die Dateien nicht direkt öffnen und bearbeiten. Wenn die Datei heruntergeladen wurde,
MehrJavadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck
Javadoc Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle
MehrWordPress. Dokumentation
WordPress Dokumentation Backend-Login In das Backend gelangt man, indem man hinter seiner Website-URL einfach ein /wp-admin dranhängt www.domain.tld/wp-admin Dabei gelangt man auf die Administrationsoberfläche,
MehrProblemdefinition. Cash Flow Reminder. 1 Problembeschreibung: 2 Projektziel: 3 Aufgaben des Benutzers
Cash Flow Reminder Problemdefinition 1 Problembeschreibung: Viele Studenten verfügen über ein eher geringes monatliches Budget, mit welchem sie aber alle Lebensunterhaltskosten decken sollten. Deshalb
MehrBeispiel Shop-Eintrag Ladenlokal & Online-Shop im Verzeichnis www.wir-lieben-shops.de 1
Beispiel Shop-Eintrag Ladenlokal & Online-Shop. Als Händler haben Sie beim Shop-Verzeichnis wir-lieben-shops.de die Möglichkeit einen oder mehrere Shop- Einträge zu erstellen. Es gibt 3 verschiedene Typen
MehrDer Kalender im ipad
Der Kalender im ipad Wir haben im ipad, dem ipod Touch und dem iphone, sowie auf dem PC in der Cloud einen Kalender. Die App ist voreingestellt, man braucht sie nicht laden. So macht es das ipad leicht,
MehrProfessionelle Seminare im Bereich MS-Office
Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion
MehrArbeiten mit UMLed und Delphi
Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf
Mehretermin Einbindung in Outlook
etermin Einbindung in Outlook 1. Einführung Über etermin gebuchte Termine können bei Bedarf auch mit externen Terminkalendern, wie zum Beispiel Outlook, ical oder Google synchronisiert werden. Dieses Dokument
MehrObjektorientierte Programmierung
Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum
MehrProgrammieren in Java
Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können
MehrFirefox: Die Lesezeichen im Griff
Firefox: Die Lesezeichen im Griff Die Favoriten im Internet Explorer sind eine Lachnummer gegen die Lesezeichen im Firefox. Eingetippte Schlagworte reichen, um sie aufzurufen. Außerdem können ganze Befehlsfolgen
MehrDie Dateiablage Der Weg zur Dateiablage
Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen
MehrStellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster
Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.
MehrTipps & Tricks im CRM
Tipps & Tricks im CRM 1. Mehrere Datensätze gleichzeitig bearbeiten S. 2 2. Änderung der Spaltenreihenfolge S. 3 3. Auto-Vervollständigung S. 3 4. Katalogwert wählen, ohne Katalog zu öffnen S. 4 5. Tastenkombination
MehrProzessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am 14.08.08
Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements von Stephanie Wilke am 14.08.08 Überblick Einleitung Was ist ITIL? Gegenüberstellung der Prozesse Neuer
MehrDrei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI
Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer
MehrIch möchte eine Bildergalerie ins Internet stellen
Ich möchte eine Bildergalerie ins Internet stellen Ich habe viele Fotos von Blumen, von Häusern, von Menschen. Ich möchte zu einem Thema Fotos sammeln, eine Vorschau erstellen und die Fotos so in der Größe
MehrUnsere Webapplikation erweitern
Unsere Webapplikation erweitern Um die Webapplikation zu benutzen: 1. Starten Sie den Server, indem Sie das Hauptprogramm in der Klasse ImdbServer starten. 2. Laden Sie im Browser die Seite http://localhost:8080/html/index.html.
MehrRefactoring. PG Reclipse Seminar: Refactoring Jan-Christopher Bals (1/30)
Refactoring PG Reclipse Seminar: Refactoring Jan-Christopher Bals (1/30) Gliederung des Vortrags Definition Hintergrund und Motivation Refactoring am Beispiel Refactoring-Katalog Unterstützung durch Tools
MehrDas Design: Themen und Varianten anwenden
Das Design: Themen und Varianten anwenden 1 a In Kapitel 1 haben Sie schon gesehen, wie einfach Sie in PowerPoint eine Designvorlage anwenden können. Lesen Sie hier, wie Sie aus noch mehr Vorlagen auswählen
MehrSecond Steps in eport 2.0 So ordern Sie Credits und Berichte
Second Steps in eport 2.0 So ordern Sie Credits und Berichte Schritt 1: Credits kaufen, um Zugangscodes generieren zu können Wählen Sie Credits verwalten und klicken Sie auf Credits kaufen. Geben Sie nun
MehrWichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge
Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge Ab der Version forma 5.5 handelt es sich bei den Orientierungshilfen der Architekten-/Objektplanerverträge nicht
MehrInternet Explorer Version 6
Internet Explorer Version 6 Java Runtime Ist Java Runtime nicht installiert, öffnet sich ein PopUp-Fenster, welches auf das benötigte Plugin aufmerksam macht. Nach Klicken auf die OK-Taste im PopUp-Fenster
MehrReporting Services und SharePoint 2010 Teil 1
Reporting Services und SharePoint 2010 Teil 1 Abstract Bei der Verwendung der Reporting Services in Zusammenhang mit SharePoint 2010 stellt sich immer wieder die Frage bei der Installation: Wo und Wie?
MehrSie wollen Was heißt das? Grundvoraussetzung ist ein Bild oder mehrere Bilder vom Wechseldatenträger
Den Speicherplatz wechseln oder eine Sicherungskopie erstellen. Es lässt sich nicht verhindern. Manche Sachen liegen am falschen Platz, können gelöscht werden oder man will vor der Bearbeitung eine Sicherungskopie
MehrFachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer
Fachdidaktik der Informatik 18.12.08 Jörg Depner, Kathrin Gaißer Klassendiagramme Ein Klassendiagramm dient in der objektorientierten Softwareentwicklung zur Darstellung von Klassen und den Beziehungen,
MehrOP-LOG www.op-log.de
Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server
MehrDas Persönliche Budget in verständlicher Sprache
Das Persönliche Budget in verständlicher Sprache Das Persönliche Budget mehr Selbstbestimmung, mehr Selbstständigkeit, mehr Selbstbewusstsein! Dieser Text soll den behinderten Menschen in Westfalen-Lippe,
MehrSICHERN DER FAVORITEN
Seite 1 von 7 SICHERN DER FAVORITEN Eine Anleitung zum Sichern der eigenen Favoriten zur Verfügung gestellt durch: ZID Dezentrale Systeme März 2010 Seite 2 von 7 Für die Datensicherheit ist bekanntlich
Mehr1. Einführung. 2. Weitere Konten anlegen
1. Einführung In orgamax stehen Ihnen die gängigsten Konten des Kontenrahmens SKR03 und SKR04 zur Verfügung. Damit sind im Normalfall alle Konten abgedeckt, die Sie zur Verbuchung benötigen. Eine ausführliche
MehrInstallation von Updates
Installation von Updates In unregelmässigen Abständen erscheinen Aktualisierungen zu WinCard Pro, entweder weil kleinere Verbesserungen realisiert bzw. Fehler der bestehenden Version behoben wurden (neues
MehrOnline Newsletter III
Online Newsletter III Hallo zusammen! Aus aktuellem Anlass wurde ein neuer Newsletter fällig. Die wichtigste Neuerung betrifft unseren Webshop mit dem Namen ehbshop! Am Montag 17.10.11 wurde die Testphase
MehrACDSee 2009 Tutorials: Rote-Augen-Korrektur
In diesem Tutorial lernen Sie den schnellsten Weg zum Entfernen roter Augen von Ihren Fotos mit der Rote-Augen- Korrektur. Die Funktion zur Reduzierung roter Augen ist ein Untermenü des Bearbeitungsmodus.
MehrHilfe zur Dokumentenverwaltung
Hilfe zur Dokumentenverwaltung Die Dokumentenverwaltung von Coffee-CRM ist sehr mächtig und umfangreich, aber keine Angst die Bedienung ist kinderleicht. Im Gegensatz zur Foto Galeria können Dokumente
MehrAdobe Photoshop. Lightroom 5 für Einsteiger Bilder verwalten und entwickeln. Sam Jost
Adobe Photoshop Lightroom 5 für Einsteiger Bilder verwalten und entwickeln Sam Jost Kapitel 2 Der erste Start 2.1 Mitmachen beim Lesen....................... 22 2.2 Für Apple-Anwender.........................
MehrEinführung in die Informatik Tools
Einführung in die Informatik Tools Werkzeuge zur Erstellung von Softwareprojekten Wolfram Burgard 8.1 Motivation Große Softwareprojekte werden schnell unübersichtlich. Änderungen im Code können leicht
MehrKurzanleitung MAN E-Learning (WBT)
Kurzanleitung MAN E-Learning (WBT) Um Ihr gebuchtes E-Learning zu bearbeiten, starten Sie bitte das MAN Online- Buchungssystem (ICPM / Seminaris) unter dem Link www.man-academy.eu Klicken Sie dann auf
MehrFachhochschule Deggendorf Platzziffer:...
Sommersemester 2008 Zahl der Blätter: 9 Fachbereich: Betriebswirtschaft WI Bachelor Hilfsmittel: alles ohne Computer Zeit: 90 Minuten 1 Betrachten Sie die drei markierten Zeilen. 1. Angenommen Sie hätten
MehrDie Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.
In einer Website haben Seiten oft das gleiche Layout. Speziell beim Einsatz von Tabellen, in denen die Navigation auf der linken oder rechten Seite, oben oder unten eingesetzt wird. Diese Anteile der Website
MehrSAMMEL DEINE IDENTITÄTEN::: NINA FRANK :: 727026 :: WINTERSEMESTER 08 09
SAMMEL DEINE IDENTITÄTEN::: :: IDEE :: Ich selbst habe viele verschiedene Benutzernamen und Passwörter und wenn ich mir diese nicht alle aufschreiben würde, würde ich alle durcheinander bringen oder welche
MehrFülle das erste Bild "Erforderliche Information für das Google-Konto" vollständig aus und auch das nachfolgende Bild.
Erstellen eines Fotoalbum mit "Picasa"-Webalben Wie es geht kannst Du hier in kleinen Schritten nachvollziehen. Rufe im Internet folgenden "LINK" auf: http://picasaweb.google.com Jetzt musst Du folgendes
MehrDatensicherung. Beschreibung der Datensicherung
Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten
MehrYouTube: Video-Untertitel übersetzen
Der Easytrans24.com-Ratgeber YouTube: Video-Untertitel übersetzen Wie Sie mit Hilfe von Easytrans24.com in wenigen Schritten Untertitel für Ihre YouTube- Videos in mehrere Sprachen übersetzen lassen können.
MehrSoftware Engineering Interaktionsdiagramme
Software Engineering Interaktionsdiagramme Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Nachrichtenaustausch Welche Nachrichten werden ausgetauscht? (Methodenaufrufe)
MehrKapiteltests zum Leitprogramm Binäre Suchbäume
Kapiteltests zum Leitprogramm Binäre Suchbäume Björn Steffen Timur Erdag überarbeitet von Christina Class Binäre Suchbäume Kapiteltests für das ETH-Leitprogramm Adressaten und Institutionen Das Leitprogramm
MehrKurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11
Kurzanleitung MEYTON Aufbau einer Internetverbindung 1 Von 11 Inhaltsverzeichnis Installation eines Internetzugangs...3 Ist mein Router bereits im MEYTON Netzwerk?...3 Start des YAST Programms...4 Auswahl
MehrWord austricksen FORTSETZUNG. Serienbriefe Für Word XP. Word austricksen Fortsetzung: Serienbriefe. Roland Egli Educational Solutions
Word austricksen FORTSETZUNG Serienbriefe Für Word XP Roland Egli Educational Solutions Educational Solutions Roland Egli edusol@hispeed.ch Seite 1 Grundlegendes Um Serienbriefe versenden zu können, müssen
MehrEinrichtung eines E-Mail-Zugangs mit Mozilla Thunderbird
Einrichtung eines E-Mail-Zugangs mit Mozilla Thunderbird Inhaltsverzeichnis 1. Vollständige Neueinrichtung eines E-Mail-Kontos 2. Ändern des Servers zum Versenden von E-Mails (Postausgangsserver) 3. Ändern
MehrTevalo Handbuch v 1.1 vom 10.11.2011
Tevalo Handbuch v 1.1 vom 10.11.2011 Inhalt Registrierung... 3 Kennwort vergessen... 3 Startseite nach dem Login... 4 Umfrage erstellen... 4 Fragebogen Vorschau... 7 Umfrage fertigstellen... 7 Öffentliche
MehrGruppenrichtlinien und Softwareverteilung
Gruppenrichtlinien und Softwareverteilung Ergänzungen zur Musterlösung Bitte lesen Sie zuerst die gesamte Anleitung durch! Vorbemerkung: Die Begriffe OU (Organizational Unit) und Raum werden in der folgenden
MehrKapitel 3 Frames Seite 1
Kapitel 3 Frames Seite 1 3 Frames 3.1 Allgemeines Mit Frames teilt man eine HTML-Seite in mehrere Bereiche ein. Eine Seite, die mit Frames aufgeteilt ist, besteht aus mehreren Einzelseiten, die sich den
MehrAnmeldung bei einem registrierten Konto (Account)
Anmeldung bei einem registrierten Konto (Account) Aufrufen des Anmeldefensters Geben sie in die Adresszeile ihres Internet-Browsers die Adresse (http://www.quid4bid.com) ein. Sie können entweder auf die
MehrDatenbank-Verschlüsselung mit DbDefence und Webanwendungen.
Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. In diesem Artikel werden wir Ihnen zeigen, wie Sie eine Datenbank verschlüsseln können, um den Zugriff einzuschränken, aber trotzdem noch eine
MehrBedienungsanleitung. Stand: 26.05.2011. Copyright 2011 by GEVITAS GmbH www.gevitas.de
GEVITAS-Sync Bedienungsanleitung Stand: 26.05.2011 Copyright 2011 by GEVITAS GmbH www.gevitas.de Inhalt 1. Einleitung... 3 1.1. Installation... 3 1.2. Zugriffsrechte... 3 1.3. Starten... 4 1.4. Die Menü-Leiste...
MehrMORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH
MORE Profile Pass- und Lizenzverwaltungssystem erstellt von: Thorsten Schumann erreichbar unter: thorsten.schumann@more-projects.de Stand: MORE Projects GmbH Einführung Die in More Profile integrierte
MehrComic Life 2.x. Fortbildung zum Mediencurriculum
Comic Life 2.x Fortbildung zum Mediencurriculum - 1 - Comic Life Eine kurze Einführung in die Bedienung von Comic Life 2.x. - 2 - Starten von Comic Life Bitte starte das Programm Comic Life. Es befindet
MehrArtikel Schnittstelle über CSV
Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte
MehrAnwendungspraktikum aus JAVA Programmierung im SS 2006 Leitung: Albert Weichselbraun. Java Projekt. Schiffe Versenken mit GUI
Anwendungspraktikum aus JAVA Programmierung im SS 2006 Leitung: Albert Weichselbraun Java Projekt Schiffe Versenken mit GUI 1. Über den Autor: Name: Marija Matejic Matrikelnummer: 9352571 E-mail: marijamatejic@yahoo.com
MehrUpdatehinweise für die Version forma 5.5.5
Updatehinweise für die Version forma 5.5.5 Seit der Version forma 5.5.0 aus 2012 gibt es nur noch eine Office-Version und keine StandAlone-Version mehr. Wenn Sie noch mit der alten Version forma 5.0.x
MehrDas Leitbild vom Verein WIR
Das Leitbild vom Verein WIR Dieses Zeichen ist ein Gütesiegel. Texte mit diesem Gütesiegel sind leicht verständlich. Leicht Lesen gibt es in drei Stufen. B1: leicht verständlich A2: noch leichter verständlich
MehrNicht über uns ohne uns
Nicht über uns ohne uns Das bedeutet: Es soll nichts über Menschen mit Behinderung entschieden werden, wenn sie nicht mit dabei sind. Dieser Text ist in leicht verständlicher Sprache geschrieben. Die Parteien
Mehr