F5 Kodkvalitet. Programutveckling sker i faser. Livscykel, vidareutveckling och återanvändning

Relevanta dokument
Klass och metoddesign. Skapa en OO-design. Kodkonvention. Hur kan man jobba med kodkvalité? Implementation. Bra klasser är grunden

Abstrakta Klasser 2. Kodning är bara en liten del i programvaruutvecklingen 6% 1% 6% Abstrakta Klasser - deklaration. Programutveckling sker i faser

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Problemlösning. Analys och design OOA&D. Programutveckling sker i faser OOA&D. Fastställa och analysera förutsättningarna/ kraven.

Fördjupad Java. Undantagshantering. Fel

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Språkkonventioner och redigering av tal.

Analys och design. Objekt. Klass. med hjälp av CRC. Klassdiagram

JAVAUTVECKLING LEKTION 7

Att skriva till och läsa från terminalfönstret

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

OOP Objekt-orienterad programmering

Föreläsnings 9 - Exceptions, I/O

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 14. Filhantering

Klasser och objekt? Objekt och klasser. Analys och design. Objekt. Klass. Programmering?

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

Tentamen , Introduktion till Java, dtaa98, dtea53

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 7 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen OOP

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

DAT043 Objektorienterad Programmering

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

Föreläsning 2, vecka 8: Repetition

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

System.out.println("Jaså du har "+ antaldollar + " stycken.");

Objektorienterad Programmering (TDDC77)

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Classes och Interfaces, Objects och References, Initialization

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Inre klasser Anonyma klasser Kloning I/O-ramverket. anonyma klasser

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 6: Metoder och fält (arrays)

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

OOP Objekt-orienterad programmering

Föreläsning 3-4 Innehåll

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Programmering för språkteknologer I, VT2012. Rum

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java

F4. programmeringsteknik och Matlab

Vad gör vi idag? F8 Uppsamling/Repetition. Tentamen. Detta har vi gått igenom. Detta kommer vi att gå igenom. Detta har vi gått igenom.

Lösningar för tenta 2 DAT043,

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Föreläsning 9-10 Innehåll

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Del A (obligatorisk för alla)

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Ingenjörsfirman Stéen Java Sida 1 av 1

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Typkonvertering. Java versus C

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

TENTAMEN OOP

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

1 Programmering i Java. Program element - Introduktion. Exempel. Exempel. Kapitel 3:

Arrayer. results

Malmö högskola 2007/2008 Teknik och samhälle

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

JAVA Mer om klasser och objektorientering

SMD 134 Objektorienterad programmering

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Dagens föreläsning. Sett i datorsalarna. Mer om arrayer. Matriser. Formatering av utskrifter. Inläsning med hjälp av Scanner-klassen

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Skillnader mellan Python och Java

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Transkript:

F5 Kodkvalitet 151 Programutveckling sker i faser Här: starkt förenklat version Passar bara mindre projekt Fem delmoment: Fastställa och analysera förutsättningarna/kraven Skapa en design Implementera koden Testning Dokumentation OBS! Testning och dokumentation ska ske parallellt med de övriga momenten. 152 Livscykel, vidareutveckling och återanvändning Scenario 1: Nyproduktion av ett hus, som ska fungera som skola Scenario 2: Ombyggnation av ett modernt hus, byggt 2010 används som en förskola och ska fortsätta att användas som F-9 skola Scenario 3: Ombyggnation av ett gammal K- märkt skola byggt 1870, till kontor Scenario 4: Åtgärda en skola som är klassat som ett sjukt hus. Skolan är bygg 1990. 153

Legacy code - ärvd kod Skriva kod som lever i flera generationer och varianter, som andra än du själv jobbar med. Ändra/jobba med kod som andra (eller du själv) har utvecklat, tex.» Bygga vidare» Ny version» Kundanpassa» Rätta fel 154 Legacy code - ärv kod Vad är viktigt då för att minimera kostnader och risker? Systemen/koden är lätt att förstå Lätt att testa det nya utan att ha sönder det gamla Samt Färdigheten att läsa och förstå andras system och kod, 155 dokumentation, etc. Livscykel, vidareutveckling och återanvändning Scenario 1: Nytt system som ska byggas från grunden Scenario 2: Utökning av funktionalitet i RSV system för folkbokföring som påbörjades 1985 Scenario 3: Anpassning ett system mot en helt ny kund, systemet utvecklat sedan 2010 Scenario 4: Jobba bort felrapporter som kommer in på mobiltelefonsystem, för att komma ut med en helt ny release. 156

Sträva efter kod som är kod som är bra, dvs, hög kodkvalitet kod som är man kan stå för, för man kan garantera att den gör det den ska göra och inget annat, bra testad kod som är beskriven på ett bra och tydligt sätt, dvs bra dokumenterad 157 Kodkvalitet Vad är god kodkvalitet? Vad är dålig kodkvalitet? Hur mäter vi kodkvalitet? Vem bär ansvaret för kvalitet på koden? 158 Kodkvalitet Hur kan man jobba för att nå hög kvalité? Vems ansvar är det om en klass eller metod beter sig konstigt och orsakar fel? 159

Hur kan man jobba med kodkvalité? 1. Jobba strukturerat genom hela processen 160 Hur kan man jobba med kodkvalité? Fokusera på kvalité och inte kvantitet Bygg det viktigaste först Jobba tillsammans Gemensamt ansvar en för alla alla för en Kontinuerlig uppföljning av processen Kod-granskning Lätt att läsa, lätt att testa, förklara Koden följer grundläggande kodprinciper Koden, systemet är inte onödig svårt att förstå Involvera testning i ett tidigt skede av processen 161 Hur kan man jobba med kodkvalité? Tydlighet i förväntningar Tydliga krav vad som ska systemet ska kunna göra Tydliga definitioner när en funktion/del fungerar som den ska både i det lilla och i det stora Tydliga definitioner på när det inte fungerar (undantag, fel, etc) Bra design System/klassdesign/metoddesign Systemarkitektur, klasser, metoder, etc Dokumenterad testning på många nivåer Enhets, integrering, system, acceptans-test Hur ska man följa upp/garantera att koden fungerar även efter flera generationer Mer om det senare 162

163 Johan Eliasson F6 Klass och metoddesign 165

Hur kan man jobba med kodkvalité? 1. Jobba strukturerat genom hela processen 166 Skapa en OO-design Bestäm klasser, objekt och metoder som behövs Vad finns redan? Bestäm algoritmer för problemlösningen I princip oberoende av programmeringsspråk Diagram Pseudokod Designa för återanvändning? Det är svårare att göra generella lösningar Kan löna sig i framtiden Återanvändning har varit en stor anledning till OOboomen 167 Implementation När man kommer till detta steg så har man ritning klar, det mesta av materialvalen är gjorda Översättning av design till källkod Implementationen fokuserar på kod-detaljer Alla viktiga beslut tas vid analys och design 168

Kodkonvention Klasser påbörjas med stor bokstav (i övrigt små utom om flera ord då Inledande bokstav i övriga ord också görs stor) AClass Metoder/attribut inleds med liten bokstav (i övrigt små utom om flera ord då inledande bokstav i övriga ord också görs stor) amethod(), avariable Konstanter Bara stora bokstäver. Ord åtskiljs med _ PI Följer man dessa konventioner så kommer ens egna klasser att se ut som javas inbyggda. 169 Bra klasser är grunden Bra namn som säger vad den gör eller är till för Hanterar undantag och fel på ett bra sätt Väldokumenterad Vad den gör Hur dess relation är till andra klasser Publika metoder är dokumenterad Minimera möjligheten att ändra tillstånden använd setter och getters för att jobba med tillståndsförändring tänk efter om det behövs setters, eller fungerar det utan Undvik statiska attribut och metoder i så stor utsträckning det bara går 170 Bra klasser är grunden Typer av klasser Actor-classes Utility-classes Oförändliga klasser, dvs man kan bara skapa objekt med värden och man har inga setters för att ändra tillståndet -String är en sådan klass Inte för stora ansvar för en klass -> avspeglar sig i det publika interfacet Synligheten ligger på rätt nivå Minska beroendet till andra klasser Tex. undvik att lägga in metoder för utskrift i klasser försök att lägga dom så högt upp i klasshierarkin som det bara går helst i main-klassen. System.out.println finns inte i alla miljöer 171

Några olika typer av klasser Actor-classes Gör saker med objekten, ändrar tillstånd, har ett beteende, mm Utility-classes Ofta statiska klasser som inte jobbar med att förändra objekts tillstånd, typ Math-klassen Oföränderliga klasser Klasser med ett fast tillstånd Man kan bara skapa objekt med värden och man har inga setters för att ändra tillståndet - String är en sådan klass 172 Vad kännetecknar en god klass Med andra ord En odelad, väldefinierad abstraktion Coupling Uppgiften kan beskrivas kort och tydlig Namnet är en substantiv eller adjektiv som beskriver abstraktionen på ett adekvat sätt Har ett koncist och sammanhängande gränssnitt Cohesion Har tillstånd och beteende 173 Coupling Klasserna ska vara så oberoende som möjligt av varandra Löst kopplade Coupling mäter hur starkt klasserna är kopplade Ju lösare klasserna är kopplade, desto enklare är det att förstå en enstaka klass enklare och förståeligare blir systemet som helhet Klasserna med lös koppling kan lättare ändras utan att andra klasser påverkas Systemet blir lättare att ändra Dvs, Mera flexibilitet 174

UML: Klassrelationer svag koppling stark koppling 175 Klassdiagram Johan Eliasson Metoddesign Konsistens när det gäller parametrar och namn Följ en kodkonversion Undvik sidoeffekter i metoder om det går, beräknar och returnera ett värde Undvik att förändra objekten som parametrarna refererar till, returnera ett nytt objekt om det är görbart Ibland använder man returvärdet för att säga något om beräkningen hur den gick, trots att metoden inte returnerar något riktigt värda Exceptions så långt det går jobba med undantag för att tala om att det har skett något som anroparen behöver veta för att hantera ev. konstigheter 177

Kategorier av metoder Konstruktorer Skapa instanser Selektor (get-metod) Returnerar information om objektets tillstånd Mutator (set-metod) Ändra objektets tillstånd Annat Gör någonting En metod ska tillhöra bara en kategori 178 Metoddesign Java jobbar med Call-By-Value på attributen, dvs värdet från anropssidan kopieras till attributen i metoden Undvik att förändra värdet på de anropade attributen, speciellt när de är av referenstyp. Vad händer på anropssidan om du ändrar på parametern/ attributet inne i en metod använd final i attribut-listan för att göra det omöjligt att ändra attributen inne i metoden Java kan inte förändra innehållet i variabeln som används för anropet Java förändrar objektet som variabeln refererar till inne i en metod 179 package callbyvalue; import figures.triangle; public class CallByValue { public static void main(string args[]){ int a = 42; System.out.println("a before somemethod(a): " + a); // a is copied and the copy is passed into the method somemethod(a); System.out.println("a after somemethod(a): " + a); Triangle triangle = new Triangle(); System.out.println("triangle before trianglemethod(triangle): " + triangle); // triangle ref is copied and the copy is passed into the method trianglemethod(triangle); System.out.println("triangle after trianglemethod(triangle): " + triangle); public static void somemethod(int a){ a = 23; System.out.println("a within somemethod(a) after changing it: " + a); public static void trianglemethod(triangle triangle){ triangle.changesize(10, 400); System.out.println("triangle within trianglemethod(triangle) after changing it: " + triangle); triangle = new Triangle(); System.out.println("a within trianglemethod(triangle) after created a new triagle: " + triangle); 180

Cohesion Varje metod ska vara ansvarig för bara en uppgift Cohesion mäter huruvida en metod uppfyller detta krav Ju mer en metod fokuserar på en enda uppgift, desto enklare är det att finna ett bra namn enklare och förståeligare blir koden Metoder med stark samhörighet kan lättare ändras utan att andra metoder påverkas Det ska vara möjligt att beskriva en metod med en enkel mening med ett verb och ett objekt 181 Exempel 1: Cohesion: Exempel 1 public void setnameandage (String name, int age); Bättre: public void setname (String name); public void setage (int age); Exempel 2: /* Anropas en gång om året */ public void calculateholidays(); { holidays += new Holidays(); age++; Bättre: public void calculateholidays(); public void incrementage(); 182 Exempel 3: Cohesion: Exempel 2 public void setfirstname (String name){ firstname = name; public void setlastname (String name){ lastname = name; fullname = firstname + + lastname; Bättre: public void setfirstname (String name) { firstname = name; fullname = firstname + + lastname; public void setlastname (String name){ lastname = name; fullname = firstname + + lastname; 183

F6 Filer och IO 184 Input/ output Utströmmar från programmet Inströmmar till programmet 185 Input/output Externa data kan tillhandahållas på många sätt i Java : Via GUI Läsas och skrivas direkt till och från tangentbord och bildskärm Läsas och skrivas till och från filer Läsas och skrivas till och från databaser Java API tillhandahåller paketet java.io Klasser som stöder input/output Klasser för att hantera när I/O-operationer går fel Typfel En fil som inte går att hitta/öppna 186

Filer Filer kan användas för att lagra data permanent mellan programkörningar eller för utbyte an information mellan program. Textfiler läsbara även för oss (med tex en texteditor) till skillnad från binära filer som lagrar datat mer som i datorns minne. 187 Skriva och läsa textfiler Strömmarna betraktas som innehållande värden av typen char Klasser som hanterar textfiler kallas readers och writers Tre viktiga åtgärder Öppna filen Skriv/läs data Stäng filen Samtliga dessa kan misslyckas Man måste förutse undantag! 188 Öppna/Skriva/Stänga Skapa ett FileWriter objekt En konstruktor tar filnamnet som parameter (String) FileWriter writer = new FileWriter( testfil.txt ); Skriv med metoden write() Överlagrad, tex. med signaturen write(string str) writer.write("första raden\n"); Stäng filen med metoden close() writer.close(); //(Obs stäng ej System.in) 189

Läsa från filer Scanner har en konstruktor som tar ett Fileobjekt som parameter Alternativt kan man koppla ihop den med En Reader klass File f=new File( minfil.txt ); Scanner in=new Scanner(f); //Kastar ett kontrollerat undantag Scanner in2=new Scanner(new FileReader( minfil.txt )); String str=in2.next(); in2.close(); 190 Exempel import java.io.fileinputstream; import java.io.fileoutputstream; import java.io.ioexception; public class CopyBytes { public static void main(string[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("xanadu.txt"); out = new FileOutputStream("outagain.txt"); int c; while ((c = in.read())!= -1) { out.write(c); finally { if (in!= null) { in.close(); if (out!= null) { out.close(); 191 Input/ output Java I/O baseras på streams (strömmar) En ström är en sekvens av bytes som flödar från en källa till ett mål Fördefinierade standardströmmar: ström System.in System.out syfte läsa input skriva output enhet tangentbord bildskärm System.err skriva fel bildskärm Standard strömmarna kan läggas om med System.setIn/Out/Err metoderna datatyp InputStream PrintStream PrintStream 192

InputStream Inputströmmar är mera komplicerade InputStream är en abstrakt klass InputStream har väldigt begränsad mängd metoder för att hantera inläsning System.in måste därför ofta kapslas in i en mer specifik ström med de egenskaper man vill ha Läsa in strängar Läsa in heltal Läsa in Vi kommer titta på några olika klasser vi kan använda till detta tex Scanner 193 Scanner Osmidigt att läsa in en hel rad som sträng! Bättre med ett ord i taget. Vad är ett ord? Tecknen måste grupperas till s.k. Tokens Tidigare mycket eget jobb Sedan Java 1.5 (5.0) finns klassen Scanner... Man kopplar en scanner till en ström Scanner myscan = new Scanner(System.in); Finns metoder för att läsa in heltal, flyttal, ord, rader etc. Se metoder i API:n https://docs.oracle.com/javase/7/docs/api/java/util/ Scanner.html 194 Koppla ihop strömmar För mer avancerat beteende kan de enkla strömmarna som läser/skriver från någon kopplas ihop med mer avancerade strömmar. Ex: PrintWriter out=new PrintWriter(new out.println( hej ); out.close(); FileWriter( filnamn.txt )); Strömmar finns tex för buffring, hantera radnummer, komprimering och kryptering https://docs.oracle.com/javase/7/docs/api/java/io/ PrintWriter.html 195

Exempel import java.io.filereader; import java.io.bufferedreader; import java.io.ioexception; import java.util.scanner; import java.util.locale; public class ScanSum { public static void main(string[] args) throws IOException { Scanner s = null; double sum = 0; try { s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt"))); s.uselocale(locale.us); while (s.hasnext()) { if (s.hasnextdouble()) { sum += s.nextdouble(); else { s.next(); finally { s.close(); System.out.println(sum); 196 Object Serialization Object serialization är ett sätt att spara ett objekts tillstånd (tex i en fil) så att vi sedan kan komma åt det. Även efter att programmet avslutats. Object serialization åstadkoms mha Serializable interfacet och klasserna ObjectOutputStream och ObjectInputStream writeobject metoden används för att serializera ett objekt readobject används för att återskapa objektet 197 Input Streams Output Streams Data Streams I/O Streams Processing Streams Character Streams Byte Streams Byte Streams handle I/O of raw binary data. Character Streams handle I/O of character data, automatically handling translation to and from the local character set. Buffered Streams optimize input and output by reducing the number of calls to the native API. Scanning and Formatting allows a program to read and write formatted text. I/O from the Command Line describes the Standard Streams and the Console object. Data Streams handle binary I/O of primitive data type and String values. Object Streams handle binary I/O of objects. 198