Inlämningsuppgift 2

Deadline 1:a oktober 23:55

Denna uppgift handlar om grundläggande objektorientering och består av två delar: objektorienterad programmering i C# och objektorienterad analys/design. Båda delarna är obligatoriska.

Om någon del av beskrivningen nedan är otydlig, kontakta mig för förtydligande. Om beskrivningen är tydlig men ni kan tänka er mer än ett sätt att lösa ett problem så får ni själva välja vilken lösning som ni tycker är bäst.

Del 1: objektorienterad programmering i C#

Filen Program.cs innehåller ett fullständigt program som simulerar en enkel nätbutik. Skriv om koden till programmet så att den endast innehåller två klassmetoder: Main och Process. Använd objektorienterad programmering (instansmetoder och properties) för att åstadkomma detta.

Programmets beteende ska vara oförändrat; denna del av uppgiften handlar enbart om att strukturera om koden som redan finns där. Ni ska inte heller lägga till några nya klasser utan bara göra om metoderna som redan finns (förutom Main och Process) till instansmetoder och properties i lämpliga befintliga klasser.

Del 2: objektorienterad analys och design

Utgå från följande beskrivning av en biograf, som vill ha ett program utvecklat för att sköta biljettförsäljning:

Biografen består av flera olika salonger som i sin tur är uppdelade i numrerade sittplatser. Antalet sittplatser varierar för varje salong men deras fysiska placering är inte viktiga för detta system, endast deras nummer i salongen. (Radnummer är inte heller viktiga.) Varje salong kan användas flera gånger per dag för att visa filmer.

Varje film har en titel, en längd, en eller flera genrer och en eller flera skådespelare. Filmer kan också ha åldersgränser (baserade på de svenska: 7 år, 11 år, 15 år och 18 år) men vissa filmer är tillåtna för alla. Slutligen har varje film ett biljettpris.

En kund har grundläggande personuppgifter samt en epostadress och ett telefonnummer som behövs för biljettköp. Kunder kan köpa biljetter till visningar, som äger rum i en bestämd salong vid ett bestämt datum och klockslag. Som ovan nämnt är biljettpriset på en visning knutet till själva filmen, men vissa visningar sker i 3D och har således högre biljettpris (en fix ökning oavsett film).

Utifrån beskrivningen ovan, gör nu följande:

  1. Föreslå en objektorienterad design med klasser och properties baserat på beskrivningen ovan och uttryck denna med C#-kod. Klasserna ska enbart ha properties, inte metoder, och för samtliga properties räcker det att ange { get; set; }. Om ni kan tänka er flera sätt att åstadkomma något, välj lösningen som ni tycker verkar bäst och förklara kortfattat ert beslut med kommentarer.
  2. Beskriv kortfattat (omkring 10 meningar, max 20 meningar) hur klasserna i er design skulle kunna bete sig och interagera genom metoder. Ge enkla exempel om det passar. Ni ska inte skriva ett program, men om ni vill kan ni uttrycka exempel med hjälp av enstaka rader kod eller metodsignaturer. Skriv detta i form av en kommentar i början eller slutet av filen som ni skrev i föregående punkt.

Inlämning

Er lösning ska lämnas in via PingPong senast klockan 23:55 den 1:a oktober. Lösningen ska lämnas in i form av två textfiler: Part1.cs som ska innehålla er lösning på del 1, och Part2.cs som ska innehålla er lösning på del 2.

Övrigt

Exempel

Nedan följer korta exempel på vad ni förväntas lämna in i de olika delarna.

Del 1

Om uppgiften exempelvis är att skriva om följande program på ett objektorienterat sätt:

  1. class Account {
  2. public double Balance;
  3. }
  4. static void Deposit(Account a, double amount) {
  5. a.Balance += amount;
  6. }
  7. static void Withdraw(Account a, double amount) {
  8. a.Balance -= amount;
  9. }
  10. static void Main(string[] args) {
  11. Account account = new Account {
  12. Balance = 0
  13. };
  14. Deposit(account, 500);
  15. Withdraw(account, 200);
  16. }

så skulle följande vara en möjlig lösning:

  1. class Account {
  2. // We decided to make the balance "settable"; you could also argue that it should be private and only changeable from the "Deposit" and "Withdraw" methods, to increase encapsulation.
  3. public double Balance { get; set; };
  4. public void Deposit(double amount) {
  5. Balance += amount;
  6. }
  7. public void Withdraw(double amount) {
  8. Balance -= amount;
  9. }
  10. }
  11. static void Main(string[] args) {
  12. Account account = new Account {
  13. Balance = 0
  14. };
  15. account.Deposit(500);
  16. account.Withdraw(200);
  17. }

Del 2

Om uppgiften exempelvis är att föreslå en objektorienterad design för följande beskrivning:

En skola består av utbildningar och studenter med namn och hemort. Studenter kan välja utbildningar förutsatt att deras gymnasiepoäng är höga nog. Varje utbildning består av en eller flera kurser.

så skulle följande vara en möjlig lösning på första punkten:

  1. class Student {
  2. public string Name { get; set; }
  3. public string City { get; set; }
  4. public double Score { get; set; }
  5. }
  6. class Curriculum {
  7. public double MinimumScore { get; set; }
  8. public string[] Courses { get; set; }
  9. public Student[] Students { get; set; };
  10. }

och följande en möjlig lösning på andra punkten:

Curriculum-klassen skulle kunna ha en metod som skriver upp en student på utbildningen om deras Score är hög nog, och en metod som tar bort dem från utbildningen och skickar ett mejl till utbildningsledaren. Student-klassen skulle kunna ha en metod med signaturen "Student[] StudyMates(Curriculum c)" som returnerar alla studenter på en utbildning som bor på samma ort som studenten i fråga.