Applicatie naamgeving
Pagina: « vorige 1 2 3 volgende »
Jaron T op 06/12/2011 18:18:21:
oei.. dit is zooo tegen de regels van OOP in.
Ozzie PHP op 06/12/2011 17:04:26:
Als de functie in de User class staat dan zou ik zeggen getName().
dan krijg je:
$user_id = 12;
$user = new User($user_id);
$user_name = $user->getName();
of
$user_name = User::getName($user_id);
dan krijg je:
$user_id = 12;
$user = new User($user_id);
$user_name = $user->getName();
of
$user_name = User::getName($user_id);
oei.. dit is zooo tegen de regels van OOP in.
Verklaar je nader aub.
PHP Scripter op 06/12/2011 21:25:35:
Niels, lees mijn post a.u.b. nog eens goed! ;-)
Dat weet ik, daarom begon ik ook met, 'Overigens ....'
Jaron, zou je nog willen posten? Danku!
Bumpy 'ride'!
BUMP
Het kan zijn dat Jaron op een één of andere manier niet in staat is om op dit forum te komen. Het lijkt mij het beste dat je dit even middels een PM oplost.
Niels
@PHP Scripter: als Jaron via PM reageert laat mij dan ook even het antwoord weten :)
Los van dat, het (blijven) bumpen van dit topic lijkt mij niet de bedoeling, vandaar dat ik met de bovenstaande oplossing kwam.
Jaron is in andere topics ook gewoon actief, het lijkt me dus dat hij best op het forum kan. Waarom zou jaron zijn standpunt niet willen verdedigen? Of waarom wil je jezelf niet verloren geven?
Toevoeging: Wanneer het antwoord via de PM is ontvangen, graag hier plaatsen.
Gewijzigd op 15/12/2011 15:57:05 door Niels K
Het woord is aan...
JARON!
@PHP Scripter: Heeft Jaron al iets laten horen via PM?
Ik weet dat ik de moderators niet mag helpen, maar ik begin dit een beetje storend te vinden.
Wouter, PHP Scripter zou een PM sturen naar Jaron. Ik vraag gewoon of daar al reactie op is. Mja, misschien storend voor jou. Ik vind het veel storender dat iemand een stelling deponeert en die vervolgens niet wil / kan verdedigen.
Ik denk dat hij meent dat
$user_name = User::getName($user_id);
Niet net is en het
$user_name = User::getById($user_id)->getName();
zou moeten zijn.
Ik vind zelf trouwens
$user = new User($user_id);
een lelijke methode om data uit je DB te halen en een User te instantiëren, omdat je complexe handelingen (DB query) uitvoert in de constructor, die in mijn ogen slechts het object moet opzetten, niet vullen.
De mooiste methode is m.i. een statische method factory, zoals ik eerder gebruikt heb en die staat hier niet in. Misschien bedoelde Jason dat. In dat geval ben ik het met hem eens, al had hij dat best wat beter mogen toelichten.
Da's alweer een tijdje geleden. Leuk om te zien dat je er weer bent.
Zou je mij eens kunnen uitleggen:
1) Waarom $user_name = User::getName($user_id) niet netjes is? Waarom is $user_name = User::getById($user_id)->getName() beter? En hoe werkt deze (in mijn ogen vreemde) constructie precies?
2) Waarom $user = new User($user_id) lelijk is? Ik heb in het verleden regelmatig voorbij zien komen dat het id in de constructor wordt meegegeven. Hoe zou jij het zelf dan doen?
Graag je reactie.
Gewijzigd op 20/12/2011 08:36:40 door Ozzie PHP
2: omdat een factory, het patroon dat dan gebruikt wordt, een dynamischer opbouw mogelijk maakt en een betere scheiding van verantwoordelijkheden bevat.
Dit zijn wel vooral 'estetische' overwegingen. Andere methodes kunnen net zo goed prima functioneren en ik wil ze helemaal niet met klem afraden. De net genoemde oplossingen vind ik alleen mooier.
Toevoeging op 20/12/2011 13:55:00:
De veel gebruikte ORM, dat wat de relatie van objecten en de db beheert, Doctrine2 zal, met behulp van reflection, bij het opbouwen van bestaande 'entities', bijv. een user, zelfs de constructor overslaan. Deze gebruik je dan alleen bij het aanmaken van nieuwe entities. Zo lijkt het net alsof de opgeslagen entities in het geheugen behouden blijven en dat is zo ongeveer het ultieme streven van een ORM.
Toevoeging op 20/12/2011 14:10:45:
Oh en die constructie heet geloof ik method of call chaining. Je roept de rechter functie aan op het resultaat van de linker functie:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
class Number
{
protected $val;
public function __construct($val)
{
$this->val = $val;
}
// Maak een nieuwe instantie van zichzelf (dezelfde klasse) en geef die als waard de som van de eigen waarde en het argument
public function add($n)
{
return new self($this->val + $n);
}
public function __toString()
{
return $this->val;
}
}
$n = new Number(3);
echo $n->add(4);
// Geeft 7. Het object op $n maakt een nieuw object aan met waarde 7, deze echo je
echo $n-add(4)->add(2);
// Geeft 9. Het object $n maakt een nieuw object aan met waarde 7
// Dit object maakt vervolgens weer een nieuw object aan met waarde 9
// Je hebt hier dus een ketting gemaakt van functie-aanroepen
$n->add(2)->add(54)->add(3)->add(213);
// Kan natuurlijk ook
?>
class Number
{
protected $val;
public function __construct($val)
{
$this->val = $val;
}
// Maak een nieuwe instantie van zichzelf (dezelfde klasse) en geef die als waard de som van de eigen waarde en het argument
public function add($n)
{
return new self($this->val + $n);
}
public function __toString()
{
return $this->val;
}
}
$n = new Number(3);
echo $n->add(4);
// Geeft 7. Het object op $n maakt een nieuw object aan met waarde 7, deze echo je
echo $n-add(4)->add(2);
// Geeft 9. Het object $n maakt een nieuw object aan met waarde 7
// Dit object maakt vervolgens weer een nieuw object aan met waarde 9
// Je hebt hier dus een ketting gemaakt van functie-aanroepen
$n->add(2)->add(54)->add(3)->add(213);
// Kan natuurlijk ook
?>
Om even verder te gaan met onzin spuien:
De instantie van 'Number' zijn 'value objects', oftewel objecten die gekenmerkt worden door een bepaalde waarde. Ook zijn ze onveranderlijk. Een aanpassing zal dus altijd een nieuw object opleveren. In dit geval is $this->val ook niet aan te passen. Hetzelfde object zal dus altijd dezelfde waarde dragen, wat in veel situaties handig is.
Bron
Kun je een voorbeeld geven van punt 2 hoe jij dan een user zou aanmaken op basis van een id.
Dus je hebt:
$user_id = 12;
... en hoe dan verder?
(Toch?)
Hou het simpel Pim anders kan ik je niet volgen. Kun je een simpel voorbeeldje geven van hoe jij het zou doen?