php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.12.2004, 15:19   #11 (permalink)
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von Waq
Hast Du mal meinen Link verfolgt?
ja sicher. und trotzdem stimme ich dem autor nicht zu. ich finde um eine saubere struktur zu erzeugen muessen membervariablen mit accessors ausgestattet werden. sei es auch nur ein return $variable;

Zitat:
Zitat von Waq
Für eine Datenstruktur wie einen Baum ist das einfach keine geeignete Zugriffsmethode. Bäume verarbeitet man rekursiv, zum Zugriff eignen sich z.B. verschachtelte Objekte, vorzugsweise lazy instanziiert.
Auf so ein unstrukturiertes Interface Accessoren draufzusetzen und dann zu meinen, "guck mal, tolles OOP" halte ich einfach für Unsinn.
habe ja die rekursive alternative dazu gegeben. und was waere denn deiner meinung nach eine bessere methode, um auf ein mehrdimensionales array, dessen genaue struktur man nicht kennt zuzugreifen ? einfach mal auf gut glueck keys probieren und dann fehler abfangen ?!?

wenn du deinen link oben genau laesest, wuerdest du auch folgendes entdecken:
Zitat:
A client of the class needs to move the data to some external medium. Examples include: Database, files, network transport and user interface. These are often perceived as necessary evils. I would like to explore other options.
manchmal kommt man nicht ohnehin accessors zu schreiben. und wie schon erwaeht alleine der einheitlichkeit und damit der uebersichtlichkeit sollten in dem fall dann alle membervariablen accessors haben. imho.
__________________
Was ist validität?
fantast ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.12.2004, 15:48   #12 (permalink)
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von fantast
um eine saubere struktur zu erzeugen muessen membervariablen mit accessors ausgestattet werden
Um eine ordentliche Struktur zu erzeugen, sollte überhaupt nicht auf einzelne Member-Variablen zugegriffen werden, auch nicht durch einen Accessor. In den meisten Fäälen sind Accessoren ein Anzeichen auf eine nicht-OOP-Struktur, die sich ein OOP-Kleidchen angezogen hat.

Zitat:
Zitat von fantast
habe ja die rekursive alternative dazu gegeben
Erstens ist deine Variante iterativ und nicht rekursiv. Zweitens wirkt sich das nicht auf den Zugriff von aussen aus, und genau der ist das relevante.

Zitat:
Zitat von fantast
. und was waere denn deiner meinung nach eine bessere methode, um auf ein mehrdimensionales array, dessen genaue struktur man nicht kennt zuzugreifen ?
Wenn es eine Baumstruktur ist, sollte man es auch als Baum darstellen und nicht als Array. Bäume stellt man normalerweise durch Parent-Child-Verknüpfungen dar, z.B. wie ich beschrieben habe durch verschachtete Objekte. Wie beim DOM, nur viel schlanker.

Zitat:
Zitat von fantast
wenn du deinen link oben genau laesest, wuerdest du auch folgendes entdecken:
Zitat:
A client of the class needs to move the data to some external medium. Examples include: Database, files, network transport and user interface. These are often perceived as necessary evils. I would like to explore other options.
Hier ist der Accessor, wie üblich, nur ein Hack, der einen zufriedenstellt, weil man ja OOP gemacht hat, der aber eigentlich nur verbirgt, dass man es besser machen könnte. Ohne direkten Zugriff auf eine einzelne Variable. Die Verantwortlichkeiten sind einfach falsch organisiert. Hier wird eine Entscheidung auf den Aufrufer übertragen, die vom Objekt selbst getroffen werden sollte. Wie meistens bei Accessoren...
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 08.12.2004, 15:59   #13 (permalink)
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von Waq
Um eine ordentliche Struktur zu erzeugen, sollte überhaupt nicht auf einzelne Member-Variablen zugegriffen werden, auch nicht durch einen Accessor.
richtig. was machst du in dem fall, wenn man die variable direkt braucht ?

Zitat:
Zitat von Waq
Erstens ist deine Variante iterativ und nicht rekursiv. Zweitens wirkt sich das nicht auf den Zugriff von aussen aus, und genau der ist das relevante.
moment, jetz haste mich verloren, was is denn an meiner variante iterativ ? ich seh da keine iteration. oder hab ich das grundprinzip von rekursion falsch verstanden ?
zweitens: wieso sollte es denn auch ? ich will von aussen eine methode aufrufen, die mir meine variable liefert, nicht erst selbst rekursiv oder iterativ oder sonstewas werden muessen, oder ?

Zitat:
Zitat von Waq
Zitat:
Zitat von fantast
. und was waere denn deiner meinung nach eine bessere methode, um auf ein mehrdimensionales array, dessen genaue struktur man nicht kennt zuzugreifen ?
Wenn es eine Baumstruktur ist, sollte man es auch als Baum darstellen und nicht als Array. Bäume stellt man normalerweise durch Parent-Child-Verknüpfungen dar, z.B. wie ich beschrieben habe durch verschachtete Objekte. Wie beim DOM, nur viel schlanker.
zugegeben, wenn hier tatsaechlich ein baum dargestellt werden soll, is das nich die optimale loesung, aber das hab ich mir ja auch nich ausgedacht :P

Zitat:
Zitat von Waq
Zitat:
Zitat von fantast
wenn du deinen link oben genau laesest, wuerdest du auch folgendes entdecken:
Zitat:
A client of the class needs to move the data to some external medium. Examples include: Database, files, network transport and user interface. These are often perceived as necessary evils. I would like to explore other options.
Hier ist der Accessor, wie üblich, nur ein Hack, der einen zufriedenstellt, weil man ja OOP gemacht hat, der aber eigentlich nur verbirgt, dass man es besser machen könnte. Ohne direkten Zugriff auf eine einzelne Variable. Die Verantwortlichkeiten sind einfach falsch organisiert. Hier wird eine Entscheidung auf den Aufrufer übertragen, die vom Objekt selbst getroffen werden sollte. Wie meistens bei Accessoren...
sprich dir waere es lieber wenn man in dem fall die methode nicht set() nennt sondern updateOnExternalMedium() aber den inhalt genau gleich laesst ? zugegeben, damit waere mehr transparenz gewaehrleistet, aber diese wieder zu lasten der uebersichtlichkeit.
ich habe eine klasse, die hat ein paar membervariablen, ob diese einfach lokale variablen sind, oder inner db liegen oder sonstwo ist mir als client doch erstmal voellig egal. ich will halt die variable haben. dazu rufe ich get() auf. wenn diese methode sich dann zur db verbindet, etc. is das doch nur in ordnung ?!?
sach an...
__________________
Was ist validität?
fantast ist offline   Mit Zitat antworten
Alt 08.12.2004, 16:39   #14 (permalink)
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von fantast
Zitat:
Zitat von Waq
sollte überhaupt nicht auf einzelne Member-Variablen zugegriffen werden
richtig. was machst du in dem fall, wenn man die variable direkt braucht ?
Überlegen, was ich falsch gemacht habe. Wie die "bessere" Struktur aussieht, ist vom Kontext abhängig. Meistens geht es in die Richtung, dass der Zugriff als atomarer Vorgang unnötig ist und in eine andere Funktion integriert wird, oder dass der Accessor erweitert wird und der aufrufenden Funktion Arbeit abnimmt, so dass der Aufrufer weniger über die Interna des Objekts weiss. Da ist es nicht mit einer Umbenennung der Methode getan.
Wenn einem keine bessere Struktur einfällt, lässt man es halt so.

Zitat:
Zitat von fantast
moment, jetz haste mich verloren, was is denn an meiner variante iterativ ?
Schleifen sind iterativ. Wenn eine Funktion sich selbst oder eine verwandte Funktion aufruft, ist das Rekursion.
Ein ordentlicher Zugriff auf einen Baum könnte so aussehen (aka SimpleXML):

PHP-Code:
//rekursive preorder-Ausgabe eines Baumes
function preorder($tree) {
  echo 
$tree;
  foreach (
$tree as $subtree)
    
preorder($subtree);
}
//ein baum kommt daher
$tree = new tree();

//baum ausgeben
preorder($tree); 
Das Durchgehen der Kinder eines Knotens ist hier zwar noch iterativ, aber der Sprung von Ebene zu Ebene ist rekursiv. Das meine ich auch mit "von aussen".
Ich sehe einfach keinen Grund, warum sich der Aufrufer mit den Array-Indizes rumschlagen sollte, wenn es sich um eine Baumstruktur handelt.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 08.12.2004, 16:51   #15 (permalink)
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

gut und dann schau dir bitte nochmal meine funktion an, die ist komplett rekursiv. da ist keine einzige schleife drin...

ausserdem gehst du ueberhaupt nich auf meinen punkt mit den accessors ein. ich gestehe dir zu, dass wenn es moeglich ist eine komplexere struktur zu schaffen, die die accessors ueberfluessig machen wuerde, dieser auch immer der vorzug gegeben werden sollte, aber wieso einfach, wenns auch kompliziert geht, nicht wahr ?
__________________
Was ist validität?
fantast ist offline   Mit Zitat antworten
Alt 08.12.2004, 16:51   #16 (permalink)
Gast
 
Beiträge: n/a
Standard

Mann, mann, da hab ich ja was losgetreten.

Um ein paar Sachen klar zu stellen:

1. Mir ist klar, daß das zuerst beschriebene Beispiel nicht der ideale Weg ist, eine Baumstruktur darzustellen. Dafür eignen sich Objekte deutlich besser. Abgesehen davon, daß bis PHP4 die Entscheidung für Objekte auch immer einen großen Performance-Verlust mit sich bringt, ging es aber hier nicht um die Praxisanwendung. Ich wollte einfach wissen, ob jemand eine bessere Methode hat, einen dynamischen Zugriff auf ein multidimensionales Array zu realisieren, da sich Array-Bezeichnungen nicht variabel bilden lassen.

2. Keines der hier gezeigten Beispiele ist wirklich rekursiv, stimmt, sie sind alle iterativ. Die Umsetzung wäre aber nun kein Problem und ändert am Prinzip meines Beispiels nicht viel.

@Waq, deinem Link bin ich gefolgt und habe den Artikel mit Interesse gelesen, auch wenn ich dem Autor nicht in allem zustimmen kann.

Natürlich werden Accessors zu häufig und oft ohne Sinn eingesetzt. Außerdem bin ich ebenfalls der Meinung, daß der Datenbestand einer Klasse grundsätzlich nicht public zu sein hat, ob über direkten Zugriff oder Accessors ist eigentlich egal. Dafür soll ein Objekt schliesslich ein UI zur Verfügung stellen. Es gibt allerdings Fälle in denen Objekte als Daten-Container fungieren. Nehmen wir mal als Beispiel ein Konfigurations-Objekt, dass eine Konfigurationsdatei parst und den Inhalt der gesamten Applikation (z.B. über Singleton) zur Verfügung stellt. In dem Fall kann man natürlich jede angeforderte Konfigurationsanweisung als Objekt zurück geben, dass die entsprechenden Daten enthält. Gerade in PHP4 halte ich das aber für Overkill.

OOP ist meiner Meinung nach im Praxiseinsatz kein starres Konzept, sondern ein Design-Prinzip, mit dem sich viel Arbeit sparen und sauberer entwickeln läßt. Wenn eine Ausnahme im üblichen OOP-Prinzip viel Arbeit sparen kann, fühle ich mich nicht, als hätte ich heilige Regeln übertreten.

P.S.: Ich habe hier niemanden rufen hören: 'Guck mal, tolles OOP'. Ich denke den Tonfalls können wir uns sparen, oder?

Nachtrag: Habe natürlich ein paar Beiträge vorher zu schreiben angefangen. Man sollte nicht zu viel gleichzeitig machen.
  Mit Zitat antworten
Alt 08.12.2004, 17:03   #17 (permalink)
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

ich moechte immernoch darauf hinweisen, dass ich meine funktion sehr rekursiv finde
Zitat:
Zitat von Ensis
OOP ist meiner Meinung nach im Praxiseinsatz kein starres Konzept, sondern ein Design-Prinzip, mit dem sich viel Arbeit sparen und sauberer entwickeln läßt. Wenn eine Ausnahme im üblichen OOP-Prinzip viel Arbeit sparen kann, fühle ich mich nicht, als hätte ich heilige Regeln übertreten.
und das moechte ich bitte unterschreiben !
__________________
Was ist validität?
fantast ist offline   Mit Zitat antworten
Alt 08.12.2004, 17:09   #18 (permalink)
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von fantast
gut und dann schau dir bitte nochmal meine funktion an, die ist komplett rekursiv. da ist keine einzige schleife drin...
Oops... tatsachlich. Trotzdem ist die Rekursion auf der falschen Seite

Zitat:
Zitat von fantast
ausserdem gehst du ueberhaupt nich auf meinen punkt mit den accessors ein.
Doch. Das war mein Hinweis auf den "Kontext". Ich fürchte, viel genauer kann man da nicht werden.

Zitat:
Zitat von fantast
ich gestehe dir zu, dass wenn es moeglich ist eine komplexere struktur zu schaffen
Gerade die Struktur soll ja durch das Entfernen des Accessors vereinfacht werden.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 08.12.2004, 17:57   #19 (permalink)
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von Ensis
bis PHP4 die Entscheidung für Objekte auch immer einen großen Performance-Verlust mit sich bringt
Dann würde ich in PHP 4 eben eine Variante umsetzen, die mit einem zusätzlichen Objekt auskommt. Das hält den Performance-Verlust doch sehr klein.

Also nehmen wir an die bisherige Klasse heisst TreeArray, dann baue ich eine Helper-Klasse TreeArrayTraverser, die eine Referenz auf eine Instanz von TreeArray bekommt und direkt (ohne Accessoren, ist schliesslich eine Schwester-Klasse) auf das Array zugreift.
In das Ding implementiert man das gleiche Interface wie vorhin beschrieben, nur mit einer zusätzlich Methode für den Weg zur Wurzel zurück, darauf zuzugreifen sähe so aus:
PHP-Code:
//rekursive preorder-Ausgabe eines Baumes
function preorder(&$tree) {
  echo 
$tree->curValue();
  while (
$tree->nextChild())
    
preorder($tree);
  
$tree->up();
}
//ein baum kommt daher
$tree = new tree();

//baum ausgeben
preorder($tree); 
Dazu bräuchte die Helper-Klasse einen Stack, aber den bräuchte sonst der Aufrufende Code. Man macht es sich so also nicht komplizierter als nötig, man verschiebt den Code nur dorthin, wo er sinnvoller ist, und sich so "nah" an den Daten befindet, dass er ohne Accessoren frauf zugreifen darf. Man macht es sich also sogar einfacher.

Mir fällt einfach kein Fall ein, wo man auf ein unbekanntes Multidimensionales Array durch einen Accessor zugreifen müsste, weswegen ich es nicht so schade finde, dass es dafür scheinbar keine einfache, performante Möglichkeit gibt.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 10.12.2004, 01:22   #20 (permalink)
Gast
 
Beiträge: n/a
Standard

hi,

der erste würdige thread im profi forum denn ich bisher lesen konnte (:
die "why accessors are evil" diskusion habe ich schon in diversen foren
verfolgt unnd diskutiert.

von der theroie her ist das absolut valide und meines erachtens auch richtig die set/get orgien zu unterbinden. es gibt einen grundsatz der damit zusammenhängt : "tell, dont ask". es gibt aber (wie immer) einige ausnahmen (bsp ValueObjects) für diesen grundsatz. das zur theroie.

in der praxis aber arbeiten wir mit php - einer scriptsprache die auch noch auf einem webserver läuft und dem prinzip von "share nothing" folgt. das bedeutet für mich einen (manchmal anstregenden) mittelweg zwischen performance und optimaler objektorientierung zu suchen. unsere aufgabe besteht darin schnellstmöglich eine aufgabe zu erledigen und dabei im unterschied zu client applikationen auch noch die gesamte infrastruktur jedesmal neu aufzubauen. das heisst für mich im klartext das ich an einigen stellen meiner applikation bewusst design prinzipien verletze. damit meine ich aber nicht das array problem.. das hat waq schon sehr schön gesagt : das design stimmt da wohl nicht.

mir geht es um (jedenfalls für mich) komplexere themen wie zb einem objekt persistenz layer. du gehst ständig auf dem schmalen grad zwischen physikalisch gegebener rechenleistung und guter objektorientierung. für eine normale webseite mit normalem traffic könnte mann das denke ich aberschon hinbekommen. schwieriger wird es mit high traffic seiten oder webanwendungen. hier zählt vor allem anderen die reaktionszeit für den anwender. ich kenn das sogar von mir selbst - wenn irgend eine seite derbe ablahmt muss der content schon richtig sexy sein damit ich die regelmässig besuche.

ein ganz praktisches problem sind dabei zb interfaces bei php5. interfaces beschreiben einen quasi einen vertrag den jedes implementierte objekt erüllen muss. gute sache (für einige auch eine mehrfach vererbung lite) das... hat aber auch den haken das mann keine konstruktoren in einem interface deklarieren sollte. falls mann das tut kann die klasse dann immer nur ein interface mit einem konstruktor implementieren.. irgendwie nicht ganz so prall imho. das führt dann wieder zu den heiss geliebten accessoren:

PHP-Code:
interface Plugin
{
  function 
setHost(&host)
  function &
getHost(&host)
  .... 
alles in allem würde ich momentan sagen : mach es wie es passt aber vergiss das refactoring nicht und schreib immer schön tests (tdd). wenn du dann noch versuchst immer erst mal die einfachen wege zu gehen endet das bei sauberem, fehlerfreierem ( ? ) und vor allem weniger code. hört sich für mich persönlich nach nem guten deal an (;

gruss
Sike
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mehrere Arrays summieren buggybugga PHP-Fortgeschrittene 8 22.07.2008 11:51
Zugriff beschränken paper PHP Tipps 2008 9 04.05.2008 12:13
Arrays sortieren, Bezeichnung, Preis Ticos PHP Tipps 2006 4 07.09.2006 19:37
Arrays kreuzen PHP Tipps 2006 13 08.03.2006 11:36
Zugriff auf postgresql-db mit php PHP Tipps 2006 6 25.01.2006 09:29
[Erledigt] 2 Arrays miteinander vergleichen PHP Tipps 2007 3 17.12.2005 16:54
Verzeichnis (Dateien) schützen aber per PHP zugriff zulassen Server, Hosting und Workstations 2 16.10.2005 10:13
Wie Ordner und Inhalt vor unberechtigten Zugriff schützen Riot PHP Tipps 2005-2 30 06.10.2005 21:18
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
Zugriff auf phpmyadmin PHP Tipps 2005 1 28.02.2005 18:41
Kombination von mehreren Arrays PHP-Fortgeschrittene 27 18.02.2005 23:33
[Erledigt] Letzter zugriff von Datei anzeigen PHP Tipps 2005 13 17.01.2005 18:20
Erkennung von Arrays in Strings PHP-Fortgeschrittene 15 07.12.2004 13:00
2 arrays in abhängigkeit ??? PHP Tipps 2004 2 11.08.2004 21:19
Werte eines Arrays in eine MySQL schreiben PHP Tipps 2004 2 28.06.2004 13:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php iteration array baum, php verschachtelte objekte parent finden

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:57 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.