[PHP] Het indelen van classes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Luitjes,

Heb al een tijdje een idee in mijn hoofd wat ik beetje bij beetje aan het uitwerken ben. Het wordt een framework waar je losse modules voor kan schrijven, deze worden dan ingelezen en gebruikt. Het hoe en waarom doet er weinig toe, wat er wel toe doet is het volgende.

Om het geheel overzichtelijk te houden maak ik gebruik van meerdere MVC modellen (modules) in één MVC model (het framework). Nu zit ik met het volgende, hoe ga ik alles netjes indelen? Ik ben niet zozeer opzoek naar dé manier, maar ben benieuwd hoe jullie dat aanpakken.

Wanneer maken jullie een variabele globaal en wanneer niet, heb je daar een vuistregel voor? Maken jullie functies zo dat deze voor meerdere doelen gebruikt kunnen worden (meerdere variabele meegeven die een functie kunnen specificeren) of per taak een soort gelijke, maar specifiekere, functie (waar geen variabele meegegeven hoeft te worden)? Trekken jullie de benodigde waardes uit globale variabele in een classe, of wordt er 1 hoofd functie gedraaid die dan weer variabele van die classe meegeeft aan een functie die weer iets returned, dus houden jullie functies dom of stop je er toch wat logica in? Maak je standaard waardes globaal of zet je die hard coded in een functie?

Zoals je merkt, aardig wat vragen, maar ben voor mezelf een fijne manier aan het zoeken om verder op te borduren. Waar ik vooral benieuwd naar ben is het gebruik van variabele om deze op 1 plek te houden, of telkens per functie heen en weer te gooien.

Het gaat hier dus niet om de PHP kennis zelf (is genoeg aanwezig), maar meer de manier waarop. Tnx in advance!

[ Voor 3% gewijzigd door Verwijderd op 28-10-2008 22:15 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Simpel gezegd :
- Vermijd globals zoveel mogelijk, ze vervuilen je namespaces en dat wil je echt niet als het project groter wordt.
- Geen bijna dubbele functies. Maak er 3 functies van ( 1 die al het algemene doet en niet zelf aangeroepen wordt, en 2 die alleen de specifieke functies bevatten en dan alsnog die 1e aanroepen ) of idd met variabelen gaan werken.
- Standaard waardes niet global maken, maar in een los config bestandje zetten, hiervoor maak je dan 1 class die de waardes uitleest ( test / productie switchen betekent dan alleen 1 config bestandje veranderen )
- Houd je functies zo dom mogelijk. Als er een gerede kans is dat je iets gaat copy-pasten voor een andere functie dan moet je een nieuwe functie / class aanmaken.

Wat ik altijd in mijn achterhoofd probeer te houden is gewoon dat 1 logica wijziging ook maar op 1 plek moet gebeuren. Als mijn dbase opeens alles ipv asc gesorteerd alles desc gestorteerd terug moet geven wil ik dit maar op 1 plek aanpassen ( in mijn dbase class in de fetchnext functie ), dit wil ik niet aanpassen in de fetcharticle / fetchpicture / fetchcomment functies etc.

Pure grove vuistregel waar ik over het algemeen wel mee weg kom is om max 20 regels achter elkaar te zetten zonder het in 1 functie te plaatsen ( en ja, ik heb ook functies met 800 regels, maar dit is dan zo'n gespecialiseerde rekenkundige functie dat het echt nergens anders gebruikt wordt, of het is gewoon de laatste functie in een rijtje. Als bijv een fetchrow de enige functie is die rijen uit je dbase haalt dan kan je dit nog wel weer gaan onderverdelen in 40 functies maar dat is imho onnodig complex zolang je niet ergens anders ook een functie hebt die een select op je dbase doet ( want anders heb je 2 functies die selects uitvoeren, oftewel zeer waarschijnlijk een overlap ) )

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Wanneer maken jullie een variabele globaal en wanneer niet, heb je daar een vuistregel voor?
Ja, gewoon niet =D. Met goed ontworpen objectgeoriënteerd programmeerwerk heb je in principe nooit een global nodig. Een voorbeeld, meestal is een database-object (of iets dergelijks) gedefinieerd als global. Als je het MVC-principe volgt, weet je dat alleen je Models (of database access objects) toegang tot een database nodig hebben. Je kunt dan gewoon je database-object toekennen aan je models, of toekennen aan een onderdeel van je model-hierarchie die door alle models / dao's te bereiken is.
Maken jullie functies zo dat deze voor meerdere doelen gebruikt kunnen worden (meerdere variabele meegeven die een functie kunnen specificeren) of per taak een soort gelijke, maar specifiekere, functie (waar geen variabele meegegeven hoeft te worden)?
Een belangrijk onderdeel van objectgeoriënteerd programmeren is om de verschillende onderdelen (classes, als je wilt) zoveel mogelijk onafhankelijk van elkaar en van de applicatie zelf te maken. Een functie heeft vaak maar een doel, en de output daarvan is vaak afhankelijk van de input, maar je kunt voor de meeste functies zelf ook nagaan dat ze eigelijk zo weinig mogelijk moeten doen, maar wel precies dat wat ze horen te doen. Beetje vage bewoording, maar uit jouw bewoording lees ik zoiets als 'ik heb een functie X die kan taak Y, Z, en QWERTY' uitvoeren - iets wat niet de bedoeling is. Een goede vuistregel is dat elk onderdeel van je programma, zij het classes, functies, of wat dan ook, zo eenvoudig en zo geconcentreerd mogelijk gemaakt moet worden - geef een functie een specifieke taak, en niets anders.
Maak je standaard waardes globaal of zet je die hard coded in een functie?
Standaardwaardes kun je het beste final of iets dergelijks maken, maar alleen toegangkelijk maken voor die onderdelen van je programma die het echt nodig hebben. Maak, om het databasevoorbeeld er weer bij te halen, je databaseconfiguratie (in welke vorm dan ook) alleen beschikbaar voor het onderdeel van je programma dat ook daadwerkelijk die gegevens nodig heeft - de databaselaag, in het specifiek het gedeelte dat de daadwerkelijke verbinding opzet.

Met wat ervaring en vuistregels krijg je op laatst vanzelf inzicht in wat waar hoort, wie waar toegang tot nodig heeft, hoe een programma vlot werkt maar goed onderhoudbaar blijft, enzovoort - het is een kwestie van ervaring, goeie boeken, en wegblijven van de vele honderden amateur-PHP websites die een poging doen om iets goed uit te leggen, maar daarin mislukken en zodanig allerlei verkeerde zaken op het internet spugen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beide bedankt voor jullie antwoord, duidelijk!

Als je een functie hebt die alle .doc documenten uit een directory moet lezen, maken jullie dan een globalere functie waar je het .doc filter aan mee geeft - zodat je later die functie ook kunt gebruiken om .xls bestanden uit te lezen en deze buiten een class bewaard - of echt een kortere functie specifiek voor alleen het filteren van .doc documenten - en deze in de class bewaard?.

Als in het begin bekend is dat die class alleen de .doc bestanden gebruikt:
- zet je dan het filter '.doc' in de functie zelf en roep je de functie zonder een variabele aan?
- zo nee, hoe dan? Helemaal bovenin als een global van een class of ergens in een functie waar die filter functie aangeroepen wordt (waarmee je dus alsnog niks globaal hebt)?

Dus, waar ligt de scheiding om een functie herbruikbaar te maken en wanneer niet.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Ik zou een class maken waarin een protected functie FindFiles($filters), waar filters een array met filters gedefineerd kan worden. Dit kan zijn een extensie, filename (partial), locatie etc. Vervolgens zou ik met een aantal public functions de diverse benodigde filter presets aanbieden.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Filter
{
  public function __construct()
  {
  }

  protected function FindFiles($filters)
  {
    // Zoeken met filters
    return $results;
  }

  public function FindDocuments()
  {
    $filters['ext'] = 'doc';
    return $this->FindFiles($filters);
  }
}

Etc..

Anyone who gets in between me and my morning coffee should be insecure.