Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Refactoring: Unterschied zwischen den Versionen

(Teil 1 hinzugefügt.)
K (verschob „Ckurs/Refactoring“ nach „C-Kurs/Refactoring“)
 
(12 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
= Teil 1 =
 
= Teil 1 =
  
Das gegebene Programm ist eine Hashtabelle. Leider ist es etwas unübersichtlich, da es eine Funktion enthält, die ca. 150 Zeilen lang ist. Schaffe mehr übersicht indem du Codefragmente die zusammengehören oder mehrmals im Quelltext auftauche in kleinere Funktionen auslagerst. Wie zum beispiel diese:
+
<div style="padding:10px;background:#FAA;">
 +
Bei dem Programm ist ein Problem aufgetreten, das scheinbar mit der Funktione fgetc() auf verschiedenen Systemen (Linux und Solaris) auftritt. Falls etwas nitcht so ganz hinhaut, verzweifelt nicht und macht einfach eine andere Aufgabe.
 +
</div>
  
static int calcHashKey(const char *pszHash);
+
Das gegebene Programm ist eine Hashtabelle. Leider ist es etwas unübersichtlich, da es eine Funktion enthält, die ca. 150 Zeilen lang ist. Schaffe mehr Übersicht indem du zusammengehörige Codefragmente oder mehrfach im Quelltext auftauchen in kleinere Funktionen auslagerst. Wie zum Beispiel diese:
static PHASHITEM getItemFromHash(const char *pszHash);
 
static void execGetHash(const char *pszHash);
 
static void execRemoveHash(const char *pszHash);
 
static void execInsertHash(const char *pszHash, char *pszData);
 
static int parseCmd(const char *pszCmdLine);
 
  
 +
int calcHashKey(const char *pszHash)
 +
{
 +
 
 +
}
 +
 +
PHASHITEM getItemFromHash(const char *pszHash)
 +
{
 +
 
 +
}
 +
 +
void execGetHash(const char *pszHash)
 +
{
 +
 
 +
}
 +
 +
void execRemoveHash(const char *pszHash)
 +
{
 +
 
 +
}
 +
 +
void execInsertHash(const char *pszHash, char *pszData)
 +
{
 +
 
 +
}
 +
 +
int parseCmd(const char *pszCmdLine)
 +
{
 +
 
 +
}
 +
 +
char *readLine(size_t *pcbRead)
 +
{
 +
 
 +
}
 +
 +
Halte dich dabei an die Namenskonvention der [http://de.wikipedia.org/wiki/Ungarische_Notation Ungarischen Notation] und [http://de.wikipedia.org/wiki/Binnenmajuskel#Verwendung_in_Programmiersprachen Camel Case].
  
halte dich dabei an die Namenskonvention der [http://de.wikipedia.org/wiki/Ungarische_Notation Ungarischen Notation] und [http://de.wikipedia.org/wiki/Binnenmajuskel#Verwendung_in_Programmiersprachen Camel Case].
+
Dokumentiere Jede Funktion und beschreiben genau, was sie macht und welche Ein- und Ausgaben sie hat.
  
 
Hier ist die Vorlage: [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2009/vorgaben/HashTableRefactor.c HashTableRefactor.c]
 
Hier ist die Vorlage: [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2009/vorgaben/HashTableRefactor.c HashTableRefactor.c]
Zeile 17: Zeile 50:
 
= Teil 2 =
 
= Teil 2 =
  
Den Algorythmus zum encodieren eines Strings nach base64 aus einer anderen [[Ckurs2009/Base64|Aufgabe]] kann man auch noch etwas eleganter und knapper schreiben.
+
Den Algorithmus zum Codieren eines Strings nach base64 aus einer anderen [[Ckurs2009/Base64|Aufgabe]] kann man auch noch etwas eleganter und knapper schreiben.
  
 
Das Programm erwatet genau einen Kommandozeilenparameter und convertiert diesen nach Base64.
 
Das Programm erwatet genau einen Kommandozeilenparameter und convertiert diesen nach Base64.
Zeile 25: Zeile 58:
  
 
Hier ist die Vorlage: [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2009/vorgaben/base64_refactor.c base64_refactor.c]
 
Hier ist die Vorlage: [http://docs.freitagsrunde.org/Veranstaltungen/ckurs_2009/vorgaben/base64_refactor.c base64_refactor.c]
 
== Schritt 1 ==
 
  
 
Schreibe eine Funktion encode_block(), die die vier gegebenen encode_*_output() Funktionen ersetzt.
 
Schreibe eine Funktion encode_block(), die die vier gegebenen encode_*_output() Funktionen ersetzt.
Zeile 41: Zeile 72:
 
  }
 
  }
  
Ersetze die Aufrufe der vier Funktionen an den drei stellen im Code durch den einmaligen Aufruf der Funktion encode_block().
+
Ersetze die Aufrufe der vier Funktionen an den drei Stellen im Code durch einen Aufruf der Funktion encode_block().
  
== Schritt 2 ==
+
== Zusatz ==
  
Vereinfache den Code so, dass die Funktion encode_block() nur ein einziges mal aufgerufen wird. Lagere den Algorithmus zum encodieren in eine Extra Funktion encode() aus. Alles was die ein und Ausgabe mit dem Benutzer und Initialisierung von Variablen betrifft soll in der Funktion main() bleiben.
+
Vereinfache den Code so, dass die Funktion encode_block() nur einmal aufgerufen wird. Lagere den Algorithmus zum Codieren in eine Funktion encode() aus. Initialisierung und Benutzerinteraktion soll in der main() umgesetzt werden.
  
 
  /**
 
  /**

Aktuelle Version vom 5. März 2013, 17:37 Uhr

Teil 1

Bei dem Programm ist ein Problem aufgetreten, das scheinbar mit der Funktione fgetc() auf verschiedenen Systemen (Linux und Solaris) auftritt. Falls etwas nitcht so ganz hinhaut, verzweifelt nicht und macht einfach eine andere Aufgabe.

Das gegebene Programm ist eine Hashtabelle. Leider ist es etwas unübersichtlich, da es eine Funktion enthält, die ca. 150 Zeilen lang ist. Schaffe mehr Übersicht indem du zusammengehörige Codefragmente oder mehrfach im Quelltext auftauchen in kleinere Funktionen auslagerst. Wie zum Beispiel diese:

int calcHashKey(const char *pszHash)
{
  
}

PHASHITEM getItemFromHash(const char *pszHash)
{
  
}

void execGetHash(const char *pszHash)
{
  
}

void execRemoveHash(const char *pszHash)
{
  
}

void execInsertHash(const char *pszHash, char *pszData)
{
  
}

int parseCmd(const char *pszCmdLine)
{
  
}

char *readLine(size_t *pcbRead)
{
  
}

Halte dich dabei an die Namenskonvention der Ungarischen Notation und Camel Case.

Dokumentiere Jede Funktion und beschreiben genau, was sie macht und welche Ein- und Ausgaben sie hat.

Hier ist die Vorlage: HashTableRefactor.c

Teil 2

Den Algorithmus zum Codieren eines Strings nach base64 aus einer anderen Aufgabe kann man auch noch etwas eleganter und knapper schreiben.

Das Programm erwatet genau einen Kommandozeilenparameter und convertiert diesen nach Base64.

$ ./base64 "Das ist ein Test"
RGFzIGlzdCBlaW4gVGVzdA==

Hier ist die Vorlage: base64_refactor.c

Schreibe eine Funktion encode_block(), die die vier gegebenen encode_*_output() Funktionen ersetzt.

/**
 * Encodes three input chars into four output chars based on the base64 scheme.
 * @param in chararray with input characters
 * @param out chararray where the output is written to
 * @param len number of chars to be used from input
 */
void encode_block( unsigned char in[3], unsigned char out[4], int len )
{
  /* ... */
}

Ersetze die Aufrufe der vier Funktionen an den drei Stellen im Code durch einen Aufruf der Funktion encode_block().

Zusatz

Vereinfache den Code so, dass die Funktion encode_block() nur einmal aufgerufen wird. Lagere den Algorithmus zum Codieren in eine Funktion encode() aus. Initialisierung und Benutzerinteraktion soll in der main() umgesetzt werden.

/**
 * Encodes the input string into an output string based on the base64 scheme.
 * @param length size of input string
 * @param input string with input characters
 * @param output string where the output is written to. It has to be long enough to hold the output
 */
void encode(int length, char *input, char *output)
{
  /* ... */
}