Gå til innhold

OOP: Hva kan jeg gjøre bedre?


Anbefalte innlegg

Hei!

Har nå akkuratt begitt meg ut på Objekt Orienteert Programmering og trenger en form for bekreftelse at det jeg gjør er riktig!

 

Så hvordan kan jeg forbedre denne kode snippen "programmerings messig" for at den er helt topp!

 

class Kill{

public $victim; //Offeret
private $bullets; //Kuler som blir brukt
private $healthVictim=1; //helsa til offeret
public $shots; //skudd som treng for drapet

function __construct($victim, $bullets){

	$this->victim = $victim;
	$this->bullets = $bullets;

	$this->ShootsNeeded();
	//sjekke om det blir skutt like mange elelr flere skudd for å drepe
	if ($this->bullets >= $this->shots){
		echo "Du drepte " .$this->victim. " med ". $this->bullets ." stk kuler!";
	}else{
		//hvis det ikke var nok, regn ut hvor mye offeret har igjen av liv %
		$this->healthLoss();
		echo "Du skadet bare ".$this->victim.", han/hun har nå ". $this->healthVictim ."% liv igjen";
	}
}

//Kalkuler antall skudd som trengs for å drepe spilleren
private function ShootsNeeded(){
	//For 1% helse trengs det 10 kuler
	return $this->shots = $this->healthVictim * 10;
}

//Kalkuler hvor mange liv victim tapte
private function healthLoss(){
	//Vi må dele på 10 siden 1% helse tilsvarer 10 kuler for å få en riktig prosent verdi ut igjen.
	return $this->healthVictim = ($this->shots - $this->bullets) / 10;
}

}

// 
$kill = new Kill("Navnet", "1000");

?>

 

Og så lurer jeg egentlig på når jeg kan bruke Static i stedet for $var = new Klasse();?

 

Håper noen vil hjelpe meg med usikkerheten!

Håper også noen kan poste noen bra ressurser på å lese meg opp på mer OOP

 

- Lars Otto

 

Da har jeg laget en ny klasse som er statisk fra de svar jeg har fått, hva mener dere om den "programmerings messig"?

class Kill{

private static $victim; //Offeret
private static $victim_health=100; //Helsa til offeret
private static $shots; //Skudd som trengs for å drepe offeret
private static $bullets; //Skudd som blir brukt på å drepe offeret.

public static function by_user_name($username, $bullets){

	self::$victim = $username;
	self::$bullets = $bullets;

	//utføre drapet
	if (!empty(self::$victim) && !empty(self::$bullets)){
		self::complete_kill();
	}else{
		echo "Ugyldig!";
	}

}

//Utfører drapet
private static function complete_kill(){

	self::shoots_needed();
	if (self::$bullets >= self::$shots){
		echo "Du drepte ". self::$victim .", du brukte ". self::$bullets ." stk kuler.";
	}else{
		self::health_loss();
		echo "Du skadet bare ". self::$victim. ", han/hun har nå ". self::$victim_health ."% liv igjen";
	}

}

//Regner ut hvor mange skudd som trengs for å drepe offeret
private static function shoots_needed(){
	//For at offeret skal miste 1% helse må det bli brukt 10 skudd.
	return self::$shots = self::$victim_health * 10;
}

//Regner ut hvor mye helse offeret har igjen etter det har blitt forsøkt drept.
private static function health_loss(){
	return self::$victim_health = (self::$shots - self::$bullets) / 10;
}

}

Kill::by_user_name("Navnet", "1000");

?>

Endret av lop
Lenke til kommentar
Videoannonse
Annonse

Hvorfor en egen klasse for kill?

Om du på død og liv skal ha egen klasse for det, gjør den static for guds skyld.

 

Static brukes der du ikke trenger å opprette ett nytt objekt, det opprettes en gang, siden bruker alle instanser den.

 

Funksjoner som utføres går ofte greit i static klasser, mens objekter du skal holde styr på, f.eks brukere, ikke kan det (enkelte private statics kan likevel være greie, f.eks til å holde styr på antall objekter).

 

For å kommentere direkte på koden din.

Hvorfor er $victim public?

Hvorfor er du inkonsekvent i navngiving av funksjoner og variable?

Jeg syns det er greit å navngi private variabler slik: $_variabelNavn;,

og private funksjoner slik: void funksjonsNavn(){},

public funksjoner slik: void FunksjonsNavn();

 

 

Uansett, hele den klassen din kan gjøres static, så holder det å kalle den med Kill->ByUserName("UserName", Bullets), (eller noe i den stilen) uten å opprette ny instans.

Endret av ze5400
Lenke til kommentar
Hvorfor en egen klasse for kill?

Om du på død og liv skal ha egen klasse for det, gjør den static for guds skyld.

 

Static brukes der du ikke trenger å opprette ett nytt objekt, det opprettes en gang, siden bruker alle instanser den.

 

Funksjoner som utføres går ofte greit i static klasser, mens objekter du skal holde styr på, f.eks brukere, ikke kan det (enkelte private statics kan likevel være greie, f.eks til å holde styr på antall objekter).

 

For å kommentere direkte på koden din.

Hvorfor er $victim public?

Hvorfor er du inkonsekvent i navngiving av funksjoner og variable?

Jeg syns det er greit å navngi private variabler slik: $_variabelNavn;,

og private funksjoner slik: void funksjonsNavn(){},

public funksjoner slik: void FunksjonsNavn();

 

 

Uansett, hele den klassen din kan gjøres static, så holder det å kalle den med Kill->ByUserName("UserName", Bullets), (eller noe i den stilen) uten å opprette ny instans.

 

Skjønte det må å la $victim være private. Den blir bare brukt av klassen.

Men hvorfor kalle private variabler $_variabelNavn, er det for å holde styr på dem?

Og hva betyr void? Hva står det for?

Lenke til kommentar
Men hvorfor kalle private variabler $_variabelNavn, er det for å holde styr på dem?
Ja, og det var mest aktuelt før når man kodet i OOP type PHP4 hvor man ikke hadde mulighet til å deklarere variabler som public/private/protected.

 

Og hva betyr void? Hva står det for?

void betyr null og ingenting, og det er vel noen som har glemt hvilket språk vi snakker om. PHP benytter ikke void i syntaksen.

 

Forøvrig, klasse med bare statiske funksjoner? :huh: Pleier å kalle de metodene for funksjoner jeg da ... :shrug:

Endret av Ernie
Lenke til kommentar
Men hvorfor kalle private variabler $_variabelNavn, er det for å holde styr på dem?
Ja, og det var mest aktuelt før når man kodet i OOP type PHP4 hvor man ikke hadde mulighet til å deklarere variabler som public/private/protected.

 

Da kan jeg jo bare egentlig fortsette å bruke private/public/protected, da bruker jeg da ihvertfall php sine standarer.

Lenke til kommentar
void betyr null og ingenting, og det er vel noen som har glemt hvilket språk vi snakker om. PHP benytter ikke void i syntaksen.

Sant :blush:

 

Mye alt-tabbing har en tendens til å endre tanketoget mitt :p

 

Forøvrig, klasse med bare statiske funksjoner? :huh: Pleier å kalle de metodene for funksjoner jeg da ... :shrug:

 

Følger deg ikke. Hva er galt ved å ha alt (funksjoner, variabler) i en klasse deklarert som static?

 

 

Men hvorfor kalle private variabler $_variabelNavn, er det for å holde styr på dem?
Ja, og det var mest aktuelt før når man kodet i OOP type PHP4 hvor man ikke hadde mulighet til å deklarere variabler som public/private/protected.

 

Da kan jeg jo bare egentlig fortsette å bruke private/public/protected, da bruker jeg da ihvertfall php sine standarer.

 

 

Så klart skal du fortsette å bruke private/public/protected, men for din egen del kan det være lurt å benytte lignende navngiving jeg foreslo.

Enklere å huske hvilke som er private og hvilke som er public, om du har forskjellig naming scheme på de.

Lenke til kommentar
Forøvrig, klasse med bare statiske funksjoner? :huh: Pleier å kalle de metodene for funksjoner jeg da ... :shrug:

 

Følger deg ikke. Hva er galt ved å ha alt (funksjoner, variabler) i en klasse deklarert som static?

Fordi det viser at man ikke har skjønt hva OOP går ut på, i med at det overhode ikke er en klasse (det er i bestefall en samling funksjoner under klassenavn). En ren statisk klasse kan ikke ha variabler definert som private/protected (de kan defineres, men ikke brukes). Konstanter kan riktignok være definert som private eller protected og kan samtidig benyttes i statiske funksjoner, men utover det er det ingenting annen som skiller det fra en helt vanlig funksjon. For å snu det den andre veien. Hvorfor skal man ha en klasse med bare statisk innhold?
Lenke til kommentar
En ren statisk klasse kan ikke ha variabler definert som private/protected (de kan defineres, men ikke brukes).

Jo, det kan de.

Hørt om self::?

 

For å snu det den andre veien. Hvorfor skal man ha en klasse med bare statisk innhold?

Kun for å organisere koden.

Math->Floor(2.4); er i min mening bedre enn bare Floor(2.4);.

 

Et spørsmål ang. når jeg bruker static, kan jeg da utføre en __construct() eller er det unødvendig

 

I en static klasse i C# kan du ikke ha constructor. PHP støtter ikke statiske klasser på samme måte, så du kan ha en constructor, men det er ikke hensiktsmessig da den aldri vil bli kjørt, ettersom du ikke har tenkt å opprette en ny instans av klassen, men bare bruke de statiske funksjonene den inneholder.

Lenke til kommentar
En ren statisk klasse kan ikke ha variabler definert som private/protected (de kan defineres, men ikke brukes).

Jo, det kan de.

Hørt om self::?

Jepp, og jeg tenkte ikke lengre enn til konstanter når jeg skrev det.

 

For å snu det den andre veien. Hvorfor skal man ha en klasse med bare statisk innhold?

Kun for å organisere koden.

Math->Floor(2.4); er i min mening bedre enn bare Floor(2.4);.

Vel, jeg synes det er direkte gyselig bruk av klasser. Det har iallfall ingenting med OOP å gjøre. Seriøst, alt trenger faktisk ikke å være klasser her i verden. Hvis man vil organisere koden så går det like fint med prefikser og separate filer, eller med namespace.
Lenke til kommentar
Det har iallfall ingenting med OOP å gjøre. Seriøst, alt trenger faktisk ikke å være klasser her i verden. Hvis man vil organisere koden så går det like fint med prefikser og separate filer, eller med namespace.

 

Ettersom jeg kommer fra .NET syns jeg klasser er alfa omega.

Er mye mer oversiktlig.

 

Ang. namespaces - funksjoner rett i namespaces? :S

Kan man engang gjøre det? :S

 

Det blir bare galt på flere nivåer enn jeg kan tenke meg.

 

using Math;

Floor();

 

Hvordan er det bedre enn Math->Floor();?

Lenke til kommentar
Det har iallfall ingenting med OOP å gjøre. Seriøst, alt trenger faktisk ikke å være klasser her i verden. Hvis man vil organisere koden så går det like fint med prefikser og separate filer, eller med namespace.

 

Ettersom jeg kommer fra .NET syns jeg klasser er alfa omega.

Er mye mer oversiktlig.

Vel, som sagt, alt trenger ikke å være OOP.

 

Ang. namespaces - funksjoner rett i namespaces? :S

Kan man engang gjøre det? :S

Jepp, fult mulig. Både PHP og C++ kan det (Java kan det ikke, men der tvinger man igjennom OOP på absolutt alt), og det finnes sikkert andre språk også hvor det er mulig.

 

Det blir bare galt på flere nivåer enn jeg kan tenke meg.

 

using Math;

Floor();

 

Hvordan er det bedre enn Math->Floor();?

Galt? Altså det er jo derfor man har namespace, for å kunne organisere koden og unngå at navn på div. ting krasjer i hverandre. Dessuten, man må ikke hente inn hele «namespace»-et. I PHP vil det fint gå an med Math\Floor(); (og i C++ Math::Floor(); ) og det kan umulig være verre enn å skrive Math::Floor(); eller Math->Floor();
Lenke til kommentar
Jeg er enig i det spesifikke tilfellet, men en samling funksjoner som hører sammen, under f.eks. matte, ser jeg ingen grunn for å ikke ta i en statisk klasse.

Statisk klasse blir brukt pre 5.3 for å simulere namespace. Hvis du bruker namespace for funksjonene, trenger du ikke å lage en statisk klasse for dette.

Lenke til kommentar

Jamen herregud da.

 

Saken er ikke hva jeg trenger å gjøre.

 

 

Om det er feil å gjøre slik jeg foreslår, hvorfor gjør de fleste store rammeverk det da?

 

.NET, Rails, Java

 

Ikke for å være "that guy", men jeg tviler på at disse rammeverkene er slengt sammen uten å tenkes gjennom først.

Lenke til kommentar

Fordi ikke alle språk som støtter funksjoner i namespace. Java støtter det iallfall ikke (ganske naturlig når de totalt låser utviklerene til OOP), og jeg tror det også gjelder C#. Hvordan det er med Ruby aner jeg ikke. Uannsett, statiske klasser benyttes som en «workaround» i f.eks Java fordi man overhode ikke har frie funksjoner i det hele tatt (absolutt alt må være definert som klasser), og dermed heller ikke mulighet til å gjøre ting riktig. Mao. er det nok mer et resultat av begrensninger i språket enn at det er en «bedre» løsning.

 

Forøvrig, er det ikke alle språk hvor statiske klasser er like ideelt. I C++ kan det visstnok balle seg litt på hvis man benytter statiske klasser.

Endret av Ernie
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...