Hjälp med klasser samt get set metod

Trädvy Permalänk
Medlem
Registrerad
Apr 2012

Hjälp med klasser samt get set metod

Har gjort 3/4 uppgifter på veckans inlämning men det är en uppgift som jag behöver hjälp med då jag inte är så skicklig på objektorienterad programmering så behöver jag Er hjälp.. Vill inte att ni ska göra uppgiften åt mig utan bara ge mig en knuff i rätt riktning, vet inte riktigt vart jag ska börja och kurslitteraturen tar inte upp get, set metoderna men läraren vill att jag ska lära mig det..

4. Objekorienterad programmering
Skapa en klass Bil för att lagra information om en bil (märke, färg, årsmodell, pris).

Vidareutveckla klassen så att instansvariablerna blir privata och att det finns åtkomstmetoder för att läsa av (get metoder) och ändra värdet (set metoder) för respektive egenskap.

Någon som skulle kunna ge mig en knuff i rätt riktning? Kanske med hjälp av lite pseudokod jag kan tolka och bygga via?

Tack på förhand.

Trädvy Permalänk
Medlem
Plats
Kungsbacka
Registrerad
Jun 2013

@KENUBBE:

public class Bil { private String brand private String color private int year private int price Fortsätt skriva din kod här...

Då våra föreläsare sa att vi absolut inte skulle använda oss av get/set metoder så kan jag tyvärr inte hjälpa dig med det. Finns dock mycket hjälp om du bara googlar lite.

Computer says no...

Trädvy Permalänk
Moderator
Registrerad
Aug 2007

Har du provat att googla? Det bästa verktyg en programmerare kan ha är Google! Så många problem är redan lösta och lösningarna finns beskrivna. För den som inte orkar söka själv så har jag handplockat ett bra sökresultat till dig.

https://msdn.microsoft.com/en-us/library/w86s7x04.aspx

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Medlem
Plats
Sunshine Coast, Australia
Registrerad
Jan 2007

Jag skulle personligen använda en konstruktor för att få tillgång till mina privata variabler. Blir nyfiken då jag inte är speciellt kunnig inom get/set-metoder. Finns det några fördelar med att använda denna typ av metod jämfört med konstruktor?

I5-6400 | GTX 960 | 8 GB RAM | 256GB SSD | Asus VG248QE | Logitech G710+ | Logitech G400s | MacBook Pro 13" Late 2016 | I5-6200U | 8GB DDR3 | 256GB SSD |

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av Vimsig:

Då våra föreläsare sa att vi absolut inte skulle använda oss av get/set metoder så kan jag tyvärr inte hjälpa dig med det. Finns dock mycket hjälp om du bara googlar lite.

Wut?
Varför skulle man inte göra det?

Det låter som en konstig sak att lära ut.

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Samsung 960 EVO 250GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av El1min4tor:

Jag skulle personligen använda en konstruktor för att få tillgång till mina privata variabler. Blir nyfiken då jag inte är speciellt kunnig inom get/set-metoder. Finns det några fördelar med att använda denna typ av metod jämfört med konstruktor?

Du vet inte alltid vilka värden variabler skall ha när du instantierar objekter. Sen kanske du vill kunna ändra dessa i efterhand. Get-metoder måste du ha för att läsa variablerna.

Hur ska du annars göra när de är privata?

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Samsung 960 EVO 250GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Plats
Sunshine Coast, Australia
Registrerad
Jan 2007
Skrivet av DunderKlumpen:

Du vet inte alltid vilka värden variabler skall ha när du instantierar objekter. Sen kanske du vill kunna ändra dessa i efterhand. Get-metoder måste du ha för att läsa variablerna.

Hur ska du annars göra när de är privata?

Tack för svar! Är själv nybörjare inom Java. Gick tillbaka och kollade på lite uppgifter jag gjort och visst sjutton har jag redan använt get/set-metoder. Jag har bara förträngt det lika fort igen. ^^

I5-6400 | GTX 960 | 8 GB RAM | 256GB SSD | Asus VG248QE | Logitech G710+ | Logitech G400s | MacBook Pro 13" Late 2016 | I5-6200U | 8GB DDR3 | 256GB SSD |

Trädvy Permalänk
Medlem
Registrerad
Aug 2007

public class Bil { private String brand private String color private int year private int price public void setBrand(String brand){ this.brand = brand; } public String getBrand(){ return brand; } osv osv.

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011

Inom OOP är en setter en metod som modifierar en viss instans- eller klassvariabel, medan en getter normalt enbart returnerar den. En setter för en instansvariabel kan se ut så här:

private int age; public void setAge(int newAge) { age = newAge; }

Notera att instansvariabeln är privat medan settern är publik.

Notera även att framförallt setters är exempel på extremt imperativ programmering, vilket är vanligt förekommande inom OOP, men i många fall (när koden växer) leder till mjukvara som är mycket svår att förstå, debugga och modifiera.

5930K • Corsair DP 32 GiB • EVGA GTX 980 • 2x Swift PG278Q
Better SweClockersDisplayPort över USB-C

Köp processor för framtiden™, men inte grafikkort.

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Nov 2008

@KENUBBE:

Kika på det här, skriven i Java. Kan innehålla något korrekturfel, fråga gärna om det är något du inte förstår.

public class Car(){ //Här deklareras attributen, alla privata, som specat private String make; private String color; private int year; private int price; //Konstruktor, ganska standard public Car(String make, String color, int year, int price){ this.make = make; this.color = color; this.year = year; this.price = price; } //En setter, tar in det nya värdet som attributet ska ha och skriver det. //Tänk på att parameters typ måste vara av den typen som du vill setta, //dvs String här och int i tex setYear() //void eftersom metoden inte returnerar något //public eftersom den ska gå att nå från andra klasser public void setMake(String newMake){ this.make = newMake; } //En getter, returnerar värdet på ett attribut. //Tänk på att returtypen måste matcha den typen du vill hämta, dvs String här //och int i getYear(). //String eftersom metoden returnerar just en String //public eftersom den ska gå att nå från andra klasser public String getMake(){ return this.make; } public void setColor(String newColor){ this.color = newColor; } public String getColor(){ return this.color; } public void setYear(int newYear){ this.year = newYear; } public int getYear(){ return this.year; } public void setPrice(int newPrice){ this.price = newPrice; } public int getPrice(){ return this.price; } }

@DunderKlumpen:

Getters och setters är inte nödvändigtvis dåliga, men kan bidra till dålig struktur. Vår föreläsare menade att det är mycket bättre att lägga logiken i klasserna än att hämta värden och köra logiken någon annan stans. Till exempel kan man tänka sig att det är bättre att lägga en metod för att ta reda på avstånd till en annan punkt i själva punktklassen än att hämta ut x och y och sedan beräkna i main eller dylikt.

typ

class Point{ ... public double distanceTo(Point otherPoint){ plocka ut koordinater från andra punkten beräkna avståndet med pythagoras sats eller liknande returnera avståndet } }

snarare än

main{ int x1 = p1.getX(); int y1 = p1.getY(); int x2 = p2.getX(); int y2 = p2.getY(); //beräkna osv

Man kan ju få tycka olika, men jag håller med vår föreläsare om att det är mer OOP att lägga sånt i själva klassen.

Gudars skymning vad fult det blev utan korrekt indentation.

Mina ögon blöder.

OS: Win 7 | Chassi: Antec 1200 | Mobo: M3A32-MVP Deluxe Wi-fi | Cpu: Amd Phenom II 940 x4 @ 3.0 Ghz | Gpu: Nvidia 560 ti 448 core | 8 gb blandad ddr2-ram | Psu: Corsair 620W HX | Citera för svar

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av Commander31:

@DunderKlumpen:

Getters och setters är inte nödvändigtvis dåliga, men kan bidra till dålig struktur. Vår föreläsare menade att det är mycket bättre att lägga logiken i klasserna än att hämta värden och köra logiken någon annan stans. Till exempel kan man tänka sig att det är bättre att lägga en metod för att ta reda på avstånd till en annan punkt i själva punktklassen än att hämta ut x och y och sedan beräkna i main eller dylikt.

typ

Man kan ju få tycka olika, men jag håller med vår föreläsare om att det är mer OOP att lägga sånt i själva klassen.

Gudars skymning vad fult det blev utan korrekt indentation.

Fast det där känns snarare som att man försöker visa att något är dåligt genom att använda ett dåligt exempel

Självklart ska man lägga all logik i den klass den hör till, detta är en av anledningarna till att ha getters/setters. Att hämta värden och lagra i lokala variabler fyller ju ingen funktion.

Alla klassvariabler behöver inte ha getters/setters, men tänk om din Point har ett namn/ID/färg/whatever, ska man inte kunna hämta det då?

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Samsung 960 EVO 250GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Fast det där känns snarare som att man försöker visa att något är dåligt genom att använda ett dåligt exempel

Självklart ska man lägga all logik i den klass den hör till, detta är en av anledningarna till att ha getters/setters. Att hämta värden och lagra i lokala variabler fyller ju ingen funktion.

Alla klassvariabler behöver inte ha getters/setters, men tänk om din Point har ett namn/ID/färg/whatever, ska man inte kunna hämta det då?

Klassinstanser bör initialiseras genom konstruktorn. Med setters är det mycket svårare att kontrollera att klassen inte har dåligt state eftersom det när som helst kan bytas. Detta komplicerar bland annat flertrådad programmering. Därtill blir det lättare att se om en klass håller på att bli för stor när alla dependencies måste sättas genom konstruktorn.

I Scala arbetar man nästan uteslutande med så kallade omuterbara instanser, det vill säga när en klassinstans väl skapats går det inte att ändra variablerna i den. Detta låter kanske som en begränsning men är inte lika konstigt som man kan tro.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009
Skrivet av Teknocide:

Klassinstanser bör initialiseras genom konstruktorn. Med setters är det mycket svårare att kontrollera att klassen inte har dåligt state eftersom det när som helst kan bytas. Detta komplicerar bland annat flertrådad programmering. Därtill blir det lättare att se om en klass håller på att bli för stor när alla dependencies måste sättas genom konstruktorn.

I Scala arbetar man nästan uteslutande med så kallade omuterbara instanser, det vill säga när en klassinstans väl skapats går det inte att ändra variablerna i den. Detta låter kanske som en begränsning men är inte lika konstigt som man kan tro.

Ja, det är ju hela poängen med konstruktorn, men somliga värden är omöjliga att veta i början av livscykeln.

Nu var det ett tag sen jag satt med Scala men vad jag minns så genereras getters/setters till och med automatiskt där?
Visst, det går att lägga till private, men huruvida man arbetar med omuterbara instanser eller inte verkar skilja från person till person (och från tutorial till tutorial).

Jag skulle säga att man inte kan dra allt över en kam; vissa klasser vill man ha omuterbara, andra inte.

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Samsung 960 EVO 250GB & Crucial V4 256GB || XFX XXX 650W || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av DunderKlumpen:

Ja, det är ju hela poängen med konstruktorn, men somliga värden är omöjliga att veta i början av livscykeln.

Nu var det ett tag sen jag satt med Scala men vad jag minns så genereras getters/setters till och med automatiskt där?
Visst, det går att lägga till private, men huruvida man arbetar med omuterbara instanser eller inte verkar skilja från person till person (och från tutorial till tutorial).

Jag skulle säga att man inte kan dra allt över en kam; vissa klasser vill man ha omuterbara, andra inte.

Om de är omöjliga att veta i början av livscykeln går det ofta att flytta dem till en annan klass som kapslar in de värdena när de är kända.

Det mesta är omuterbart som standard i Scala. Du kan använda var när du deklarerar en instansvariabel för att säga att den ska vara muterbar — Scala genererar mycket riktigt en setter i detta fall — men det görs som sagt i princip aldrig. På en höft skulle jag säga att omuterbart används i upp till 98% av all kod.

Muterbara variabler används främst inuti metoder för att optimera tighta loopar, men utifrån sett kommer anroparen aldrig i direkt kontakt med dessa variabler. En uppsjö buggar elimineras på detta vis.

Bilanaloger är som Volvo — varenda svenne kör med dem