Hjälp med klasser samt get set metod

Permalänk
Medlem

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.

Permalänk
Medlem

@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.

Visa signatur

Computer says no...

Permalänk
Hedersmedlem

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

Visa signatur

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

Permalänk
Medlem

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?

Visa signatur

ASUS ROG Strix G15 G513QM | Pixel 7

Permalänk
Keeper of Traditions
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.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || 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.

Permalänk
Keeper of Traditions
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?

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || 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.

Permalänk
Medlem
Skrivet av Dunder:

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. ^^

Visa signatur

ASUS ROG Strix G15 G513QM | Pixel 7

Permalänk
Medlem

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.

Permalänk
99:e percentilen

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.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

@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; } }

@Dunder:

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.
Visa signatur

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

Permalänk
Keeper of Traditions
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å?

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || 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.

Permalänk
Medlem
Skrivet av Dunder:

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.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Keeper of Traditions
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.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || 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.

Permalänk
Medlem
Skrivet av Dunder:

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.

Visa signatur

Kom-pa-TI-bilitet