Objektorienterad systemutveckling 1

studied byStudied by 7 people
4.0(1)
Get a hint
Hint

Vad innebär objekt?

1 / 165

flashcard set

Earn XP

Description and Tags

Inför tentamen

166 Terms

1

Vad innebär objekt?

En designkonstruktion som specificerar :

  • Identititet

  • Tillstånd

  • Tjänster

New cards
2

Vilka två delar består objekt av?

Data och metoder.

New cards
3

Vad innebär klass?

En beskrivning av objekttyp, egenskaper och beteende.

New cards
4

Man säger att klass är vad till ett objekt?

En mall, eller ritning.

New cards
5

Vad kallas det när man skapar ett objekt?

Instantiering.

New cards
6

Vad är bra att tänka på vid namngivning av klassnamn?

Ett substantiv givet av uppdragsgivaren, eller från verkligheten som programmet modellerar. Inleds med versal, följt av gemener. Tex BankAccount

New cards
7

Det finns två olika typer av klasser, vilka?

Abstrakt och konkret klass.

New cards
8

Vad är bra att tänka på vid namngivning av metodnamn?

Inleds med en gemen, och om sammansatta ord, börjar nästa med versal. Tex accountName

New cards
9

När bör ett metodnamn vara ett verb?

När det förändrar objektets tillstånd. Tex bytPin()

New cards
10

Det finns 2 olika metoder i en klass, vilka?

Instansmetod och klassmetod.

New cards
11

Vad innebär instansmetod?

Att varje instans har sin egna unika uppsättning.

New cards
12

Vad innebär klassmetod?

Finns endast en uppsättning, som delas mellan samtliga instanser.

New cards
13

Vilka är de fyra grundläggande principerna i objektorienterad design?

  • Inkapsling

  • Abstraktion

  • Arv

  • Polymorfism

New cards
14

Vad menas med abstraktion?

Man bryter ner problemet.

New cards
15

Vad innebär inkapsling?

  • Att dölja information som är oväsentlig.

  • Inkapsling möjliggör abstraktion.

New cards
16

Vad är .NET plattformen?

Ett mjukvaruramverk som tillåter skapandet av de flesta applikationer (AI, webb, moln, spel, m.m.) på Windows-operativsystem.

New cards
17

Vilka 2 delar består .NET plattformen av?

En körtidsmiljö och ett standardbibliotek.

New cards
18

vad ansvarar körtidsmiljön för?

Att lokalisera, ladda och hantera .NET-objekt.

New cards
19
<p>Vad innehåller standardbibliotek? Ge några exempel.</p>

Vad innehåller standardbibliotek? Ge några exempel.

Trådar, fil I/O (input/output), databastillgång, m.m.

New cards
20

Vad är “unmanaged“ kod?

Kod som inte kan köras direkt av .NET runtime.

New cards
21

Vad är “managed“ kod?

Kod som kan köras i .NET runtime.

New cards
22

Vad är assembly?

En binärfil (.exe eller. dll) som innehåller “managed“ kod.

New cards
23

Vad är det .NET kod kompileras till?

Binärfiler, eller “assemblies“.

New cards
24

Vilka tre delar innehåller en assembly?

  1. CIL-kod

  2. Metadata

  3. Manifest

New cards
25

Vad innebär metadata i .NET?

Det är en fullständig beskrivning av varje typ (klass, interface m.m.) som finns i binärfilen, och varje medlem (fält, metoder, events m.m.) i varje typ.

New cards
26

Vad är manifest i .NET?

Metadata som beskriver själva assemblyn.

Tex assemblyns namn och versionnummer, copyright information, och vilka externa assemblies denna assemblyn behöver.

New cards
27

Vad är CTS?

En specifiktation som beskriver hur typer (class, struct, interface, enum, delegate) måste defineras för att kunna köras i CLR.

New cards
28

Vilka medlemmar kan en klass i CTS innehålla?

  • Fält/attribut

  • Properties

  • Konstruktorer

  • Metoder

  • Events

New cards
29
<p>Vilka modifierare kan CTS innehålla?</p>

Vilka modifierare kan CTS innehålla?

  • Public

  • Internal

  • Abstract

  • Sealed

New cards
30

Vad innebär interface?

Det är namngivna samlingar av abstrakta medlemmar som kan implementeras av en class eller struct.

New cards
31

Vilken konstruktion möjliggörs när en class eller struct implementerar ett interface?

Interface-baserad polymorfism.

New cards
32
<p>Vad är enumerationer?</p>

Vad är enumerationer?

Namngivna samlingar av namn-värdepar.

New cards
33

Vad ansvarar körtidsmiljön för?

  1. Att lokalisera en given assembly på hårddisken

  2. Hitta den relevanta typen i assemblyn genom metadata

  3. Lägga ut aktuell typ i minnet

  4. Kompilera tillhörande CIL till plattformsspecifika instruktioner

  5. Utföra säkerhetskontroller

  6. Köra de plattformsspecifika instruktionerna

New cards
34
<p>Vad är en namespace?</p>

Vad är en namespace?

En grupp av semantisk relaterade typer som finns i en assembly.

New cards
35

Vad står UML för?

Unified Modeling Language

New cards
36

Vad används UML för?

Att beskriva olika aspekter av objektorienterade system. Genom att :

  • visualisera

  • specificera

  • konstruera

  • dokumentera

New cards
37

Varför modellerar man?

För att minska komplexitet av problem och öka förståelse av ett system.

New cards
38
<p>Vad är syntax inom UML?</p>

Vad är syntax inom UML?

Hur symbolen får se ut och kombineras.

New cards
39
<p>Vad är semantik inom UML?</p>

Vad är semantik inom UML?

Symbolernas betydelse.

New cards
40
<p>Vilka 6 symboler finns för att förklara klassrelatioer?</p>

Vilka 6 symboler finns för att förklara klassrelatioer?

  1. Association

  2. Arv

  3. Realisera

  4. Beroende

  5. Aggregation

  6. Komposition

New cards
41

Varför har man Use-Case?

För att kunna fånga kunders och användares mål och behov.

New cards
42

Vad är en aktör?

Någon med ett beteende (Person, datorsystem, organisation, databas m.m.)

New cards
43

Vilka fyra delar innefattar den övergripande utvecklingsmodellen?

  • Inception

  • Elaboration

  • Construction

  • Transition

New cards
44

Vad innefattar inception delen?

  • Vision

  • Affärsmodell

  • Omfattning

  • Affärsmodellering

  • Kravspecifikation

Resulterar i en konceptuell domänmodell.

Säkerställer att vi löser rätt problem.

New cards
45

Vad innefattar elaboration delen?

Samma steg som i inceptions delen:

  • Vision

  • Affärsmodell

  • Omfattning

  • Affärsmodellering

  • Kravspecifikation

Men resulterar i en Designmodell.

För att säkerställa att vi utvecklar lösningen på rätt sätt.

New cards
46

Vad innefattar construction delen?

Man fokusera på implementationen av designmodellen. Översätta lösningen till kod (tex C#). För att realisera en bra lösning på problemet.

New cards
47

Vad innefattar transition delen?

Överlämning av mjukvaran till de nya ägarna.

New cards
48

Vad är viktigt i analys av en problembeskrivning?

  • Vilka begrepp beskriver problemet?

  • Vilken information används (attribut, fält eller parametrar)?

  • Vilken relation/samband finns mellan dessa?

New cards
49

När anses ett mjukvarusystem vara komplext?

  • Domänen är svår att begripa

  • Utvecklingsprocessen är svår att hantera

  • Mjukvaruprogram möjliggör flexibilitet i stor utsträckning

  • Beteendet utgörs av interaktion mellan diskreta system

New cards
50

Vilka egenskaper har komplexa system?

  • En hierarkisk struktur (rankade komponenter)

  • Primitiva komponenter (tolkning av abstrakt-valbara)

  • Intra- och inter- komponenter (lätt uppdelning med tydliga gränser)

  • Gemensamma mönster (tydliga mönster)

  • Stabilt mellanliggande former (komponenter som är starkt kopplade)

<ul><li><p>En hierarkisk struktur (rankade komponenter)</p></li><li><p>Primitiva komponenter (tolkning av abstrakt-valbara)</p></li><li><p>Intra- och inter- komponenter (lätt uppdelning med tydliga gränser)</p></li><li><p>Gemensamma mönster (tydliga mönster)</p></li><li><p>Stabilt mellanliggande former (komponenter som är starkt kopplade)</p></li></ul>
New cards
51

Vilka 4 steg följer man i nedbrytningen av en process?

  1. Textanalys (Hitta substantiv och attribut)

  2. Identifiera roller

  3. Hitta relevanta abstraktion

  4. Rangordna abstraktioner i hierarki

New cards
52

Vad är objektorienterad design?

Ett tankesätt för att designa objektorienterade system

New cards
53

Vad resulterar en objektorienterad analys (OOA) i?

En domänmodell, dvs klasser med associationer och kardinaliteter

<p>En domänmodell, dvs klasser med associationer och kardinaliteter</p>
New cards
54

Vad ligger i fokus i objektorienterad design (OOD)?

Klasser och objekt på substantiv från problemdomänen. Riktas mer inpå hur lösningen ska se ut.

<p>Klasser och objekt på substantiv från problemdomänen. Riktas mer inpå hur lösningen ska se ut.</p>
New cards
55

Vad innebär objektorienterad programmering (OOP)?

Programkod som består av klasser och objekt, där varje objekt är en instans av en klass (eller en mall)

<p>Programkod som består av klasser och objekt, där varje objekt är en instans av en klass (eller en mall)</p>
New cards
56

Vad innebär abstraktion?

Man väljer ut och fokuserar på systemets relevanta komponenter.

New cards
57

Vad innebär inkapsling?

Principen att objekts inre uppbyggnad ska vara ointressant för den som använder objektet i programmering. Allt en programmerare behöver veta är vad objektet kan göra och hur man instruerar objektet att göra.

New cards
58

Vad innebär modularitet?

Det att något är uppdelat i delar (moduler, komponenter), så att det kan tas i sär och sättas ihop på olika sätt.

New cards
59

Vad innebär hierarki?

Mm strukturering av information: med underavdelningar i flera led (i en hierarki). Exempel: katalogerna (mapparna) i ett filsystem, domänerna i internets adressystem DNS.

New cards
60

Vad används undantagshantering till?

Om ett fel inträffar i ett program under körtid, kommer programmet att avslutas på ett okontrollerat sätt.

Felet kan hanteras med ett undantag(Exception) och undantagshantering (Exception Handling)

Genom att tillämpa undantagshantering, kan man hantera fel som uppstår under körtid så att programmet kan fortsätta sin exekvering eller avslutas på ett kontrollerat sätt.

New cards
61

Vilka fördelar finns med Undantagshantering?

  • Den tillåter en metod att kasta ett undantag till dess anropande metod, varpå den anropande metoden kan hantera undantaget.

  • Utan denna konstruktion, måste en metod antingen hantera felet eller avsluta programmet.

New cards
62

Vad gör undantag inom undantagstyper och undantagshierarkin?

Undantag representerar fel som orsakas av ett program samt av externa omständigheter som kan “fångas“ och hanteras av programmet.

<p>Undantag representerar fel som orsakas av ett program samt av externa omständigheter som kan “fångas“ och hanteras av programmet.</p>
New cards
63

Vad innebär att “Kasta undantag“?

  • När en metod upptäcker ett fel, kan metoden skapa en instans av ett lämpligt undantag och kasta den.

  • En metod kastar ett undantag genom att ange det reserverade ordet “throw“ efterföljt av undantagsinstansen.

<ul><li><p>När en metod upptäcker ett fel, kan metoden skapa en instans av ett lämpligt undantag och kasta den.</p></li><li><p>En metod kastar ett undantag genom att ange det reserverade ordet “throw“ efterföljt av undantagsinstansen.</p></li></ul>
New cards
64

Hur fångar man undantag (catching exceptions)?

Undantag fångas genom att använda try…catch block

  • Koden som ska kasta undantag, innesluts i ett try block

  • Varje undantagstyp som skall fångas, anges i ett eget catch block

<p>Undantag fångas genom att använda try…catch block</p><ul><li><p>Koden som ska kasta undantag, innesluts i ett try block</p></li><li><p>Varje undantagstyp som skall fångas, anges i ett eget catch block</p></li></ul>
New cards
65

Vilken information finns i undantag?

Message

  • Innehåller meddelandet som beskriver undantaget.

StackTrace

  • Innehåller information om anropsstacken.

ToString()

  • Returnerar

New cards
66

Vad för funktioner kan undantag göra?

  1. Kasta

  2. Fånga

  3. Kasta vidare

  4. Länka

New cards
67

Vad används ett finally klausal?

Används ihop med try eller try…catch för att skapa ett try…finally block eller ett try…catch…finally block

Ett finally block exekveras alltid, oberoende av om undantag kastas eller inte.

<p>Används ihop med try eller try…catch för att skapa ett try…finally block eller ett try…catch…finally block</p><p></p><p>Ett finally block exekveras alltid, oberoende av om undantag kastas eller inte.</p>
New cards
68

Nämn en fördel och en nackdel med undantag…

Fördel:

  • Undantagshantering separerar felhanteringen från det normala programflödet, vilket gör det lättare att läsa samt underhålla kod.

Nackdel:

  • Undantagshantering kräver längre exekveringstid samt fler resurser

New cards
69

När ska man kasta undantag?

  • När ett systemfel inträffar

  • När ett fel inträffar som metoden vet om

Om felet kan hanteras i metoden, kasta INTE ett undantag.

New cards
70

När ska man använda undantag?

  • Använd undantagshantering i koden för att hantera oförutsedda feltillstånd.

  • Undvik undantagshantering i koden för att hantera förutsedda feltillstånd.

Ex

Använd hellre if… else än try…catch som i bilden.

<ul><li><p>Använd undantagshantering i koden för att hantera oförutsedda feltillstånd.</p></li><li><p>Undvik undantagshantering i koden för att hantera förutsedda feltillstånd.</p></li></ul><p></p><p>Ex</p><p>Använd hellre if… else än try…catch som i bilden.</p>
New cards
71

Namespace System.IO innehåller typer för att?

Manipulera: diskenheter, foldrar och filer

Läsa & skriva till/från

  • Filer

  • Minne

  • Strängar

New cards
72

Vad måste inkluderas för att kunna använda typerna från namespace System.IO?

System.IO måste inkluderas längst upp i källkodsfilen med nyckelordet “using“.

Ex. kolla bild.

<p>System.IO måste inkluderas längst upp i källkodsfilen med nyckelordet “using“.</p><p></p><p>Ex. kolla bild.</p>
New cards
73

System.IO innehåller fyra klasser, vilka och varför?

  1. Directory

  2. File

  3. DirectoryInfo

  4. FileInfo

Dessa för att manipulera filer samt integrera med datorns filsystem.

New cards
74

Directory och File, ärvs av? och innebär vad?

Ärver från Objekt

  • Är statiska klasser

  • Innehåller statiska medlemmar för att skapa, ta bort, kopiera och flytta foldrar/filer.

New cards
75

DirectoryInfo & FileInfo, ärvs av? och innebär?

Ärver från FileSystemInfo

  • Har liknande funktionalitet som Directory och File men via instansmedlemmar.

  • Returnerar strängar

New cards
76

Vad för egenskap har DirectoryInfo?

När man har skapat en DirectoryInfo instans, kan man använda de ärvda medlemmerna från FileSystemInfo för att undersöka folderns innehåll.

New cards
77

DriveInfo innehåller vad ?

DriveInfo klassen innehåller en statisk metod DriveInfo.GetDrives() som också listar datorns enheter, men returnerar DriveInfo objekt med detaljerad information.

New cards
78

Vad används DriveInfo till?

Används för att erhålla information om diskenheter.

New cards
79

Vad för skillnader finns mellan textfiler och binärfiler?

  • Data som lagras som textfiler kan läsas av en människa via en texteditor.

  • C# kod lagras i textfiler.

  • Data som lagras som binärfiler kan inte läsas av en människa via en texteditor.

  • Binärfiler är designade att läsas av ett program, och processas därför mycket effektivare än textfiler.

  • C# kompilerad kod kan lagras som bytekod i binärfiler (.dll, .exe)

New cards
80

Vad gör en filpekare?

  • Är en speciell pekare, kallad filpekaren, pekar alltid på en viss byte i filen.

  • En läs-/skrivoperation utförs alltid för den byte som filpekaren pekar på.

  • När en fil öppnas, pekar filpekaren på första byten i filen.

  • När en läs-/skrivoperation utförs, flyttas filpekaren automatiskt fram i filen.

New cards
81

Vad är serialisering?

  • Den beskriver processen att konventera ett objekt till en sekvens av bytes som kan skickas till en ström.

  • All nödvändig information för att återskapa ett objekt serialiseras.

  • Serialisering leder oftast till mindre kod.

  • För att en klass ska vara vara seraliserbar måste klassen märkas med attributet [Seralizable] (kolla bilden)

<ul><li><p>Den beskriver processen att konventera ett objekt till en sekvens av bytes som kan skickas till en ström.</p></li><li><p>All nödvändig information för att återskapa ett objekt serialiseras.</p></li><li><p>Serialisering leder oftast till mindre kod.</p></li><li><p>För att en klass ska vara vara seraliserbar måste klassen märkas med attributet [Seralizable] (kolla bilden)</p></li></ul>
New cards
82

Vad gör deseralisering?

Beskriver processen att återskapa ett objekt från en sekvens av bytes som kan tas emot från en ström.

New cards
83

Vad är en Delegate?

I.NET är en delegate en klass som representerar en funktionspekare, och innehåller:

  • Adressen av metoden som den anropar

  • Metodens parametrar

  • Metodens returtyp

  • Delegates kan peka på både statiska och instansmetoder

  • Delagates kan även peka på flera metoder samtidigt, så länge de har samma signatur.

New cards
84

Hur derfinerar man en Delegate?

Defineras med nyckelordet delegate efterföljt av en metodsignatur.

New cards
85

Hur använder man Delegates för bitufuerubgar från ett objekt?

Delegates tillämpas normalt så att ett objekt kan notifiera andra objekt om dess tillståndsförändringar:

  1. Definiera en delegate typ i klassen som används för att notifiera andra objekt.

  2. Skapa ett attribut med delegate typen som datatyp i klassen.

  3. Skapa en metod i klassen som andra objekt kan använda för att registrera sig (dvs de registrerar en metod som delegaten kan anropa vid tillståndsförändringar).

  4. Anropa delegaten i klassen när tillståndsförändringar sker för att notifiera \n registrerade objekt.

New cards
86

Vilka två generiska delegate typerna finns?

  1. Action<>

  2. Func<>

New cards
87

Varför använder man de två generiska delegate typerna?

För att slippa skriva egen definierade delegates.

New cards
88

Vad innebär nyckelordet Event?

Kan användas för att göra processen mycket simplare och säkrare.

New cards
89

Vad representerar klassen EventArgs?

Ett händelseargument utan någon extra information.

Man kan skapa egendefinerade händelseargument genom att ärva från EventArgs.

New cards
90

Hur gör man en “anonym metod“ i C#?

Skapas genom att ersätta metodnamnet med nyckelordet delegate.

<p>Skapas genom att ersätta metodnamnet med nyckelordet delegate.</p>
New cards
91

Vad är lambdauttryck?

Ännu ett sätt att skriva anonyma metoder på, och på ett ännu simplare sätt att jobba med delegates.

New cards
92

Vad gäller för anonyma typer?

  • Programmeraren vet inte namnet på den anonyma typen

  • Ärver alltid direkt från System.Object

  • Alla attribut och properties är endast läsbara

  • Har inga egendefinierade metoder, events, osv.

  • Går ej att ärva från

  • Skapas alltid med defaultkonstruktorn

New cards
93

Vad är designmönster?

  • Mikroarkitekturer som ofta förekommer i väl designade applikationer.

  • Ett sätt att återanvända tidigare lösningar på vanligt förekommande problem.

  • En namngiven beskrivning av ett problem och en lösning som kan tillämpas i olika situationer.

  • Ett gemensamt språk för vanligt förekommande problem-lösning par.

  • Myntades av arkitekten Christopher Alexander.

New cards
94

Vad består designmönster huvudsakligen av?

  • Ett namn

  • Ett problem

  • En lösning

  • En konsekvens

New cards
95

Designmönster bygger på något eller några koncept, vilka finns?

  • Interface

  • Abstrakta klasser

  • Arv

  • Delegering

New cards
96

“GoF” designmönster står för?

“The gang of four“

New cards
97

GoF har 23 designmönster enligt boken, vilka tre kategorier indelas dem i?

  1. Skapelsemönster (Creational Patterns)

  2. Strukturella mönster (Structural Patterns)

  3. Beteendemönster (Behavioral Patterns)

New cards
98

Vad gör skapelsemönster?

Beskriver olika sätt att styra skapandet av objekt.

  • Abstract Factory \n Förser klienten med en familj av relaterade eller beroende objekt (runtime).

  • Builder \n Skapar komplexa objekt, uppbyggda av delobjekt som skapas enligt någon algoritm.

  • Factory Method \n Abstraherar skapelseprocessen av objekt genom att ersätta konstruktorer (runtime).

  • Prototype \n Instansierar ett nytt objekt genom att klona ett befintligt objekt.

  • Singleton \n Ser till så att endast 1 instans av en klass skapas.

New cards
99

Vad gör Strukturella mönster?

Beskriver hur klasser och objekt kan kombineras för att bilda större strukturer.

  • Adapter

Används för att göra en annars inkompatibel klass kompatibel med klienten genom att innesluta den inkompatibla klassen i en kompatibel klass (dvs som implementerar ett interface som klienten kräver).

  • Bridge

Används för att separera de abstrakta elementen i en klass från implementationen, så att implementationen kan ändras utan att behöva ändra på abstraktionen.

  • Composite

Används för att skapa hierarkiska, rekursiva strukturer av relaterade objekt, där ett godtyckligt \n element i strukturen kan accessas och användas på vanligt sätt.

  • Decorator

Används för att utöka eller ändra objekts funktionalitet under körtid genom att innesluta dem i en Decorator klass (alternativ till att använda arv).

  • Façade

Används för att definiera ett enklare interface till ett mera komplext delsystem.

  • Flyweight

Används för att minska resursanvändning för komplexa modeller som innehåller många liknande objekt.

  • Proxy

Används för att skapa en surrogat-objekt, som refererar till ett underliggade objekt, och som implementerar samma interface som det underliggande objektet. Surrogat-objektet vidarebefordrar anrop från klienten till det underliggade objektet vid behov.

New cards
100

Vad gör Beteendemönster?

Beskriver olika sätt för klasser och objekt att kommunicera med varandra.

  • Chain of Responsibility \n Används för att processera data i en pipeline där flera hanterare kan processera datan

  • Command \n Kapslar in ett kommando, med argument, där kommandot kan exekveras eller sparas.

  • Interpreter \n Används för att definiera en grammatik för instruktioner som tillhör ett språk.

  • Iterator \n Används för att skapa ett standardinterface för att traversera en samling objekt.

  • Mediator \n Används för att minska beroendet mellan klasser som kommunicerar med varandra \n (meddelanden mellan klasserna skickas via ett Mediator objekt).

  • Memento \n Används för att lagra tillståndet för ett objekt, så att det kan återskapas senare.

  • Observer \n Används för att tillåta ett objekt att notifiera andra objekt om interna förändringar.

  • State \n Används för att förändra beteendet av ett objekt då dess inre tillstånd förändras.

  • Strategy \n Används för att skapa en familj av algoritmer som kan väljas under körtid.

  • Template \n Används för att definiera stegen i en algoritm, där implementationen kan ändras.

  • Visitor \n Används för att separera en komplex mängd strukturerad data från funktionaliteten som kan \n utföras på datan som de innesluter.

New cards

Explore top notes

note Note
studied byStudied by 63 people
... ago
5.0(1)
note Note
studied byStudied by 21 people
... ago
4.0(1)
note Note
studied byStudied by 43 people
... ago
5.0(1)
note Note
studied byStudied by 1 person
... ago
5.0(1)
note Note
studied byStudied by 58 people
... ago
5.0(1)
note Note
studied byStudied by 126 people
... ago
4.5(2)
note Note
studied byStudied by 163 people
... ago
5.0(1)

Explore top flashcards

flashcards Flashcard (58)
studied byStudied by 29 people
... ago
5.0(1)
flashcards Flashcard (62)
studied byStudied by 34 people
... ago
5.0(4)
flashcards Flashcard (30)
studied byStudied by 10 people
... ago
5.0(2)
flashcards Flashcard (74)
studied byStudied by 3 people
... ago
5.0(1)
flashcards Flashcard (57)
studied byStudied by 2 people
... ago
5.0(1)
flashcards Flashcard (173)
studied byStudied by 119 people
... ago
5.0(2)
flashcards Flashcard (80)
studied byStudied by 5 people
... ago
5.0(1)
flashcards Flashcard (61)
studied byStudied by 3 people
... ago
5.0(1)
robot