lop Skrevet 2. august 2009 Del Skrevet 2. august 2009 (endret) 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 3. august 2009 av lop Lenke til kommentar
ze5400 Skrevet 2. august 2009 Del Skrevet 2. august 2009 (endret) 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 2. august 2009 av ze5400 Lenke til kommentar
lop Skrevet 2. august 2009 Forfatter Del Skrevet 2. august 2009 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
Ernie Skrevet 2. august 2009 Del Skrevet 2. august 2009 (endret) 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? Pleier å kalle de metodene for funksjoner jeg da ... Endret 2. august 2009 av Ernie Lenke til kommentar
lop Skrevet 2. august 2009 Forfatter Del Skrevet 2. august 2009 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
ze5400 Skrevet 3. august 2009 Del Skrevet 3. august 2009 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 Mye alt-tabbing har en tendens til å endre tanketoget mitt Forøvrig, klasse med bare statiske funksjoner? Pleier å kalle de metodene for funksjoner jeg da ... 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
Ernie Skrevet 3. august 2009 Del Skrevet 3. august 2009 Forøvrig, klasse med bare statiske funksjoner? Pleier å kalle de metodene for funksjoner jeg da ... 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
lop Skrevet 3. august 2009 Forfatter Del Skrevet 3. august 2009 Et spørsmål ang. når jeg bruker static, kan jeg da utføre en __construct() eller er det unødvendig Lenke til kommentar
ze5400 Skrevet 3. august 2009 Del Skrevet 3. august 2009 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
Ernie Skrevet 3. august 2009 Del Skrevet 3. august 2009 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
ze5400 Skrevet 3. august 2009 Del Skrevet 3. august 2009 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
Ernie Skrevet 3. august 2009 Del Skrevet 3. august 2009 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? :SKan 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
ze5400 Skrevet 3. august 2009 Del Skrevet 3. august 2009 Når du sier det går det opp for meg at jeg kjenner til det. Må ha fortrengt det Men da vil jeg spørre deg - hvorfor vil du på død og liv gjøre det prosedyrellt? . Lenke til kommentar
Ernie Skrevet 3. august 2009 Del Skrevet 3. august 2009 Fordi man bruker rett verktøy til rett jobb. Klasser og objekter benytter man når man skal modelere noe litt mer komplekst enn en simple oppgave som f.eks. å avrunde et tall. Lenke til kommentar
ze5400 Skrevet 3. august 2009 Del Skrevet 3. august 2009 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. Lenke til kommentar
OIS Skrevet 3. august 2009 Del Skrevet 3. august 2009 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
ze5400 Skrevet 3. august 2009 Del Skrevet 3. august 2009 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
Ernie Skrevet 3. august 2009 Del Skrevet 3. august 2009 (endret) 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 3. august 2009 av Ernie Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå