| FAQ |
| Kalender |
|
|
|
|
#1 | ||
|
|||
|
Klarade millennium-buggen
|
Citat:
Det är en del av styrkan med att ha den objektorienterde paradigmen. Man ökar kvaliten på koden mångfalt genom att programspråket stöder denna princip. Jag har aldrig sett något annat sråk som tillåter odefinierade egenskaper i en klass. I enklare imperativa skriptspråk är det vanligt att ha odeklareade/dynamiska variabler, men i objektorienterade språk brukar det i vart fall finnas den implicita tvingande egenskapen (kanske 'restriktionen' på ren svenska). Att ha getters och setters är till för att man ska kunna ha beräknade egenskaper som ibland kan vara ganska komplexa. Men de ska vara enkla att använda. Man kan vidare ha validering av status på en egenskap genom att använda getters och setters, så man kan kasta en exception om det blir tokigheter. Det finns även situationer där man ha komplicerade formateringsregler av caption (dvs displayvärden) men man har fortfarande en ganska teknisk grundinformation, typexempel kan vara datum som kan vara lagrat som ett mycket kompakt lagringsformat men som visas med en text som är lätt för en människa att förstå. Andra exempel är "scientific notation" o.s.v. .... Det är kompilatorns styrka att den hjälper mig att hitta fel under utvecklingsarbetet, jag vill ALDRIG råka ut för att fel smyger med och upptäcks först i produktion. Det är ofta 100-1000 gånger dyrare att åtgärda fel som upptäcks i produktion jämfört med under kodningsfasen eller kravfasen. Senast redigerad av Conny Westh den 2012-07-24 klockan 20:48 |
||
|
|
Svara med citat
|
|
|
#2 | ||
|
|||
|
Flitig postare
|
Citat:
Och magi är just oftast sådant vi vill undvika såvida det inte finns en annan lösning.Du behöver ju faktiskt inte använda dem och de har ett par nackdelar så som: - De är långsammare än direkt access eller access via en vanlig funktion - Det är svårare att skriva bra dokumentation för dem Den klassiska metoden är att skriva get/set metoder för varje värde du vill exponera och även den metoden jag rekommenderar även om det blir mer knackande på tangentbordet. Kod:
class Person
{
private $firstname;
public function getFirstname()
{
return $this->firstname;
}
public function setFirstname($firstname)
{
$this->firstname = $firstname;
}
}
|
||
|
|
Svara med citat
|
|
|
#3 | |||
|
||||
|
Flitig postare
|
Citat:
Jag menade att det känns som en dålig lösning att ha en switch-/if-sats i __get och __set. Min lösning visar ett sätt att slippa det. |
|||
|
|
Svara med citat
|
|
|
#4 | |||
|
||||
|
Nykomling
|
Citat:
Det är enligt mig självklart att man ska ha en switch/if i en get/set för att styra vad som händer, annars öppnar du ju upp klassen helt, och det kan ju inte vara tanken med get/set-metoderna. |
|||
|
|
Svara med citat
|
|
|
#5 | |||
|
||||
|
Flitig postare
|
Citat:
Som jag uppfattade det var målet att det inte ska gå att sättaegenskaper som objektet inte redan har. Alla som finns ska kunna sättas/hämtas. |
|||
|
|
Svara med citat
|
|
|
#6 | |||
|
||||
|
Nykomling
|
Citat:
Hämta egenskaper som inte finns, det går väl aldrig (dom finns ju inte?), och ifall man sätter en egenskap som inte finns egentligen så gör väl inte det så mycket? Håller med om att är "lite fult" såklart att kunna sätta egenskaper som inte finns egentligen, men klassen borde ju inte fråga efter den egenskapen ändå så borde inte påverka något, eller missar jag något? |
|||
|
|
Svara med citat
|
|
|
#7 | |||
|
||||
|
Flitig postare
|
Citat:
|
|||
|
|
Svara med citat
|
|
|
#8 | ||
|
|||
|
Flitig postare
|
Ja, eller så ser man till och skriva ordentliga tester enligt BDD eller TDD.
|
||
|
|
Svara med citat
|
|
|
#9 | ||
|
|||
|
Klarade millennium-buggen
|
Citat:
Dvs exempelvis som i C# där man kan ha en metod för att validera värden när de sätts till en metod, 'är värdet utan för det giltigas gräns så kan man endera låta bli att lagra värdet i klassen eller göra en Throw Exception("Med ett vettigt felmeddelande").... När man läser av ett värde så kan man exempelvis ha en automatisk konvertering, formatering, lagring av accessstatistik eller inläsning från någon extern källa. detta utan att programmeraren som använder egenskapen behöver bekymra sig över hur det går till. |
||
|
|
Svara med citat
|
|
|
#10 | ||
|
|||
|
Klarade millennium-buggen
|
Citat:
Helst skulle jag önska att man kan deklarera: public class Person { // declataion of private variables private _firstname=""; private _lastname=""; // Jag skippar konstruktorn i detta exempel.... public __set_firstname($value) { $this->_firstname = $value; } public __get_firstname() { return $this->_firstname; } public __set_lastname($value) { $this->_lastname = $value; } public __get_lastname() { return $this->_lastname; } // Jag skippar även ToString-metoden.... } När man sen accessar egenskapen så vill jag göra så här: private $kalle = new Person(); $kalle.firstname = "Kalle"; $kalle.lastname = "Pettersson"; echo $kalle.firstname . " " . $kalle.lastname Resultatet ska då bli: "Kalle Pettersson" OBSERVERA att det inte alls är samma sak som att ha en funktion som geter getFirstName och en funktion som heter setFirstName, det är INTE getters och setters.... Ni som har jobbat med andra objektorienterade språk vet nog vad jag menar... . . . Senast redigerad av Conny Westh den 2012-07-31 klockan 03:46 |
||
|
|
Svara med citat
|
| Svara |
| Ämnesverktyg | |
| Visningsalternativ | |
|
|