Get och Set metoder, varför programmerar man på det sättet, vad är syftet?

Permalänk
Avstängd

Get och Set metoder, varför programmerar man på det sättet, vad är syftet?

Hej,

jag undrar Get och Set metoder, varför programmerar man på det sättet, vad är syftet?

Tänkte kolla mer er först och sedan kolla på Microsofts hemsida så jag får dubbla uppfattningar om saken.

Permalänk
Medlem
Skrivet av Daygamerme:

Hej,

jag undrar Get och Set metoder, varför programmerar man på det sättet, vad är syftet?

Tänkte kolla mer er först och sedan kolla på Microsofts hemsida så jag får dubbla uppfattningar om saken.

Poängen med getters och setters är för att "good code practice" säger att du ska aldrig lämna ut attribut. Typ:

public class bla { private Arraylist<E> lista; public Bla(){ lista = new ArrayList<E>(); } public void getElement(int i){ return lista.get(i); } public void addElement(){ lista.add(i); } }

Vad som hade varit felaktigt hade istället varit att ha antingen lista som public och hämta den genom att ta Bla.lista eller att lämna ut hela listan genom en metod.

(folk får rätta mig om jag har fel men det är det jag har fått lära mig)

Visa signatur

CPU: Ryzen 5600xGPU: 1080 TI ROG Strix RAM:2x16GB G.skill Trident @ 3600MHz MoBo: Asus B550FPSU: Corsair SF750
En resa till Nordkorea
2 dagar i Tjernobyl

Permalänk
Avstängd

Okej jag kollade Microsofts hemsida snabbt och uppfattade det som att med get set funktionen kan man framkalla en variabel samtidigt som man ger den värden på flera punkter, tex att en månad finns mellan spannet 1-12 på ett år.

Kan man säga såhär?

Permalänk
Medlem

Du skapar detta lager av abstraktion av flera anledningar, t.ex. så kan du dölja objektets interna struktur, du kan lägga på simpel logik vid hämtning av vissa värden och du kan även implementera en "immutable" version av ett objekt där du endast kan hämta värden (Du har alltså tillgång till alla getters men inga setters).

Permalänk
Medlem
Skrivet av Daygamerme:

Okej jag kollade Microsofts hemsida snabbt och uppfattade det som att med get set funktionen kan man framkalla en variabel samtidigt som man ger den värden på flera punkter, tex att en månad finns mellan spannet 1-12 på ett år.

Kan man säga såhär?

Det är en av fördelarna. Du måste inte bygga in denna typ av check men det är bra i vissa fall, i andra inte.
Det är helt enkelt som föregående talare skrivit ett sätt att tvinga fram ett enhetlig allmänt vedertagen metod för att sätta värden på ett sätt man vet är om inte säkert så i alla fall möjligt att göra säkert.

Visa signatur

8700K 5Ghz | 32GB 3200Mhz | 2080Ti 11GB | Phanteks Enthoo | Asus PG27AQ

Permalänk
Medlem

Läs på om Encapsulation! Det gör ihop. Då får du nog bra information.

Permalänk
Medlem
Skrivet av Daygamerme:

Okej jag kollade Microsofts hemsida snabbt och uppfattade det som att med get set funktionen kan man framkalla en variabel samtidigt som man ger den värden på flera punkter, tex att en månad finns mellan spannet 1-12 på ett år.

Just månad är ett bra exempel, eftersom man då i set-metoden kan säkerställa att månad alltid har ett giltigt värde genom att bara tillåta värdena 1-12. Men även för variabler som inte har några särskilda gränser så bör man alltid använda get/set ändå. För om man senare kommer på att man ändå behöver gränser eller t.ex. behöver veta när en variabel ändrat värde så måste man gå igenom all kod och ändra på alla åtkomster av den variabeln om man inte har get/set-metoder. Använder man istället get/set överallt så behöver man bara ändra i just get/set-metoderna, d.v.s. på ett enda ställe.

Det finns också bra argument för att man bör försöka undvika att använda get/set-metoder så mycket som möjligt. Det betyder då inte att man bara ska undvika dem och tillåta åtkomst till variabler direkt, utan istället så bör man utforma sina klasser så att man inte behöver get/set. Se t.ex. denna artikel.

Permalänk

Anledningen jag har lärt mig är att då kan du ändra interna datastrukturer utan att riskera att något slutar fungera utifrån. Så utifrån en klass anropar du en get-metod för att få ut värdet i stället för att direkt accessa en array, till exempel. Då kan du, om du vill, ändra i klassen från array till ArrayList, Vector, Stack eller vadhelst du vill utan att det påverkar hur du hämtar värden utifrån.
Dessutom, som nämnts tidigare, är det ett enkelt sätt att kunna göra verifiering på data innan den lämnas ut.

Permalänk
Avstängd

Metod åtkomlighet i objekt

Hej,

Jag undrar hur man i en randomsats random.Next(nr, HÄrinne); kan referera fram en metod?

Låt säga att jag har en metod och vill accessa i "HÄrinne" det går absolut inte framkalla genom Metod2();

Hur gör du ?

Permalänk
Medlem

Va? Jag förstår ingen del av frågan.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Avstängd
Skrivet av LemonIllusion:

Va? Jag förstår ingen del av frågan.

Size W = new Size();
int nr = randomt.Next(1, W);

METODEN:

using System;

namespace ConsoleApp3
{
internal class Size
{
public Size()
{
int.TryParse(Console.ReadLine(), out int write);
}
}
}

Vad gör jag för fel?

Permalänk
Medlem

@Daygamerme: Random.Next tar int som argument, varför förväntar du dig att det ska fungera med W som är av typen Size?

Permalänk
Medlem
Skrivet av Daygamerme:

Size W = new Size();
int nr = randomt.Next(1, W);

METODEN:

using System;

namespace ConsoleApp3
{
internal class Size
{
public Size()
{
int.TryParse(Console.ReadLine(), out int write);
}
}
}

Vad gör jag för fel?

Du behöver en property för åtkomst av den int du läser in från konsollen. Testa något åt det här hållet:

Size W = new Size(); int nr = randomt.Next(1, W.number); //METODEN: using System; namespace ConsoleApp3 { internal class Size { public int number {get; set;} public Size() { int.TryParse(Console.ReadLine(), out int write); number = write; } } }

felaktig kod
Permalänk
Avstängd
Skrivet av modstam:

Du behöver en property för åtkomst av den int du läser in från konsollen. Testa något åt det här hållet:

Size W = new Size(); int nr = randomt.Next(1, W.number); //METODEN: using System; namespace ConsoleApp3 { internal class Size { public int number {get; set;} public Size() { number = int.TryParse(Console.ReadLine(), out int write); } } }

visste att det rörde sig om get set metod här

Permalänk
Avstängd
Skrivet av modstam:

Du behöver en property för åtkomst av den int du läser in från konsollen. Testa något åt det här hållet:

Size W = new Size(); int nr = randomt.Next(1, W.number); //METODEN: using System; namespace ConsoleApp3 { internal class Size { public int number {get; set;} public Size() { number = int.TryParse(Console.ReadLine(), out int write); } } }

jag satte write som set; för jag vill ju få ut int utskrift.

När jag kör programmet för jag denna felmeddelande:

"Process is terminated due to StackOverflowException."

vad gjordes fel?

Permalänk
Medlem
Skrivet av Daygamerme:

jag satte write som set; för jag vill ju få ut int utskrift.

När jag kör programmet för jag denna felmeddelande:

"Process is terminated due to StackOverflowException."

vad gjordes fel?

jag redigerade nyss kodsnutten för att rätta till hur "number" sätts (det var lite fel). Var det något sådant du testade alltså och fick stackoverflow?

edit: Tror jag missförstod vad du testade. Du behöver inte göra en egen implementation av set-metoden för "number". Hämta istället från den propertyn direkt, den sätts redan i konstruktorn.

Permalänk
Medlem

@Daygamerme: Stack overflow betyder oftast att du gjort din kod rekursiv av misstag (t.ex. att du försöker skapa ett Size-object innuti konstruktorn for Size), men du måste visa din kod om vi ska kunna hjälpa med det.

Permalänk
Avstängd
Skrivet av modstam:

jag redigerade nyss kodsnutten för att rätta till hur "number" sätts (det var lite fel). Var det något sådant du testade alltså och fick stackoverflow?

Jag gjorde allt detta på egenhand:

using System;

namespace ConsoleApp3
{
internal class Size
{
private bool nummer;
private int write;

public int number
{
get

{
return number;
}
set
{
write = value ;
}
}
public Size()
{

nummer = int.TryParse(Console.ReadLine(), out int write);
}
}
}

Detta är en partialclass kan man kalla det för, nu inne i mainfunktionen försöker jag komma åt denna kodsträng genom på följande vis:

Size W = new Size();
int nr = random.Next(1, W.number );

Du ser vad jag försöker göra?

Vill sätta in lästa siffran inne i randomobjektet

Permalänk
Avstängd
Skrivet av perost:

@Daygamerme: Stack overflow betyder oftast att du gjort din kod rekursiv av misstag (t.ex. att du försöker skapa ett Size-object innuti konstruktorn for Size), men du måste visa din kod om vi ska kunna hjälpa med det.

Jag har nu visat min kod, ni kan kolla

Permalänk
Medlem
Skrivet av Daygamerme:

Jag gjorde allt detta på egenhand:

using System;

namespace ConsoleApp3
{
internal class Size
{
private bool nummer;
private int write;

public int number
{
get

{
return number;
}
set
{
write = value ;
}
}
public Size()
{

nummer = int.TryParse(Console.ReadLine(), out int write);
}
}
}

Detta är en partialclass kan man kalla det för, nu inne i mainfunktionen försöker jag komma åt denna kodsträng genom på följande vis:

Size W = new Size();
int nr = random.Next(1, W.number );

Du ser vad jag försöker göra?

Vill sätta in lästa siffran inne i randomobjektet

Du gör det lite mer komplicerat än vad det behöver vara. Om du tar kodsnutten här nedanför:

namespace ConsoleApp3 { internal class Size { public int Number { get; set;} public Size() { int.TryParse(Console.ReadLine(), out int write); Number = write; } } }

För att få ut det du skrev i konsollen så behöver du väl då bara göra ett nytt Size()-objekt och sen hämta ut Number? Typ såhär:

Size W = new Size(); int numberFromConsole = W.Number;

Permalänk
Medlem

@Daygamerme: Du har return number; i din get-metod, men number är ju din property som innehåller själva get-metoden. Alla försök att komma åt värdet av number kommer alltså anropa get-metoden, inklusive return number; i själva get-metoden. get-metoden kommer alltså anropa sig själv om och om igen tills programmet kraschar.

Sen är dina variabelnamn lite underliga. write innehåller ju nummret du läst in med try.Parse, medan variabeln nummer indikerar om try.Parse lyckades eller inte.

Ett tips är för övrigt att använda code-taggar, det gör din kod mycket lättare att läsa. D.v.s.:
[code]
kod här
[/code]

Permalänk
Avstängd

GET SET metod fungerar i all oäntlighet, felet?

Hejsan,

Jag har nu lyckats lösa alla A uppgifter förutom en konstig get set partial class som jag fattar absolut 0 utav. Jag vill verkligen lösa den snarast så jag kan gå ut och fika innan det stänger.

using System; namespace ConsoleApp3 { internal class Size { public int Number { get; set; } public Size() { int.TryParse(Console.ReadLine(), out int write); Number = write; } } } Det ovan var metoden Get set som ni ser, här kommer resten av koden där den används i själva Main meny funktionen: Size W = new Size(); int Dice = W.Number; int nr = random.Next(1, Dice); Console.WriteLine(nr); return nr;

Varför fortsätter den att repetera GET SET metoden och vägrar att bara gå vidare i programmet så jag kan köra randomsatsen?

Permalänk
Medlem

Din kod både kompilerar, kör och ger väntat resultat. Vad är problemet?

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Avstängd
Skrivet av LemonIllusion:

Din kod både kompilerar, kör och ger väntat resultat. Vad är problemet?
https://i.imgur.com/nfY9VZ3.png

Det uppstår problem big time för min del när jag använder den funktionen. Först och främst så loopar just den funktionen sig självt och för det andra så har jag som funktion att det ska kasta fram olika antal resultat samtidigt fast när den körs så kastas det fram 1 svar som max alltid

Skickades från m.sweclockers.com

Permalänk
Medlem

@Daygamerme:

Känns som du inte visat hela din kod, det jag ser så ser det ut att funka som det ska.

Att du returnera nr säger ju att något mer saknas som vi inte ser.

Visa signatur

Gaming: MSI X570 MPG Gaming Plus -- AMD Ryzen 9 5900X -- Sapphire Radeon RX 6800 XT NITRO+ -- G.Skill 32GB 3600MHz CL14 -- Samsung 960 EVO 1TB -- 2x ASUS MG278Q -- Arch-based EndeavourOS
VR: ASRock B550M-ITX/ac -- AMD Ryzen 5 5600G -- ASUS RTX 3070 -- Corsair 16GB 3600MHz CL18 -- Kingston A2000 250GB -- Windows 10

Permalänk
Avstängd
Skrivet av Kokefa:

@Daygamerme:

Känns som du inte visat hela din kod, det jag ser så ser det ut att funka som det ska.

Att du returnera nr säger ju att något mer saknas som vi inte ser.

[CODE]
Static int Randomklass(RandomslumoObj)
{
Size W = new Size(); int Dice = W.Number; int nr = random.Next(1, Dice); Console.WriteLine(nr); return nr; [\Code]
}

Så ser det ut just i denna fil.

Men problemet jag bemöter är att jag inte får fler utskrifter än just bara 1 som ni ser ovan. Funktionen går ut på att fler utskrifter ska skrivas ut i samband med funktionen "utöka" Random satsen

Skickades från m.sweclockers.com

Permalänk
Medlem

Låter som en for-loop hade hjälpt i ditt fall, köra din utskrivning samt din random.next inne i for-loopen så borde du få ut mer än ett resultat, om du sätter att den ska köras mer än 1 gång självklart.

Visa signatur

Gaming: MSI X570 MPG Gaming Plus -- AMD Ryzen 9 5900X -- Sapphire Radeon RX 6800 XT NITRO+ -- G.Skill 32GB 3600MHz CL14 -- Samsung 960 EVO 1TB -- 2x ASUS MG278Q -- Arch-based EndeavourOS
VR: ASRock B550M-ITX/ac -- AMD Ryzen 5 5600G -- ASUS RTX 3070 -- Corsair 16GB 3600MHz CL18 -- Kingston A2000 250GB -- Windows 10

Permalänk
Avstängd
Skrivet av Kokefa:

Låter som en for-loop hade hjälpt i ditt fall, köra din utskrivning samt din random.next inne i for-loopen så borde du få ut mer än ett resultat, om du sätter att den ska köras mer än 1 gång självklart.

Du missuppfattade visst, det är det jag inte vill att den ska göra, vill inte att den ska loopa sig självt vilket den nu gör hela tiden

Permalänk
Medlem
Skrivet av Daygamerme:

Du missuppfattade visst, det är det jag inte vill att den ska göra, vill inte att den ska loopa sig självt vilket den nu gör hela tiden

Det är inte lätt att uppfatta rätt när du skriver det du inte menar och i allmänhet uttrycker dig fullkomligt oförståeligt.

Hur som helst överensstämmer inte din problembeskrivning med koden du lagt upp. Ingen kommer kunna hjälpa dig utan att se delen av koden du faktiskt har problem med tillsammans med en tydlig och sammanhängande beskrivning av problemet i fråga samt önskat resultat.

Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Avstängd
Skrivet av LemonIllusion:

Det är inte lätt att uppfatta rätt när du skriver det du inte menar och i allmänhet uttrycker dig fullkomligt oförståeligt. Hur som helst överensstämmer inte din problembeskrivning med koden du lagt upp. Ingen kommer kunna hjälpa dig utan att se delen av koden du faktiskt har problem med tillsammans med en tydlig och sammanhängande beskrivning av problemet i fråga samt önskat resultat.

Du har faktiskt rätt. Jag hade hela tiden löst programmet, alltså allt var som det skulle, jag missuppfattade programmet och trodde att jag hade skrivit fel fast än jag redan var klar med alla uppgifter....