php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.02.2010, 16:12  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard Mehrfachvererbung, trotzdem DRY?

Hallo,

ich arbeite ja gerade an meiner Klasse zum Schreiben von Worddokumenten. Der Einfachheit übertrage ich die Problematik mal in CSS-Wortlaute:

Also es gibt Klassen (class) und Inlinestyles (style-Attribut). Für einen bestimmten Dokumentenabschnitt sind spezifische Stylezuweisung identisch. Für <p> kann ich beispielsweise ein Margin entweder über die Klasse oder über das Inlinestyle zuweisen. (p.myclass { margin: 1px 2px; }, <p style="margin:1px 2px">). Die Methoden (setMargin) wären also identisch.

Lösung hierfür:
PHP-Code:
<?php
class ParaStyle_Class extends ParaStyle_Abstract {};
class 
ParaStyle_Inline extends ParaStyle_Abstract {};
abstract class 
ParaStyle_Abstract {
  public function 
setMargin() {}
}
?>
Es gibt aber ja nicht nur Paragraphen, sondern noch mehr (in Word gibt es Paragraphs, Characters (Text, Runs), Tables, Numberings (Listen) usw. die alle Klassen, Inlines und Abstracts hätten.

Nun haben aber alle Klassen und alle Inlinestyles auch Gemeinsamkeiten. Inlinestyles haben möglicherweise eine Basisklasse, Klassen haben ebenfalls eine Basisklasse (basedOn in Word), einen Namen, eine ID, ...
Hier wäre demnach Mehrfachvererbung sinnvoll.

Wie kann ich das denn halbwegs flott lösen ohne Code doppelt zu schreiben? Als sinnvollste Möglichkeit bieten sich Interfaces an, die einzelnen Methoden muss ich dann implementieren und über Objekte weiterreichen?!

PHP-Code:
<?php
class ParaStyle_Class extends ParaStyle_Abstract implements StyleClass_Interface {
  protected 
$_classCommon;
  public function 
setName($name) {
    return 
$this->_classCommon->setName($name);
  }
  public function 
setId($id) {
    return 
$this->_classCommon->setId($id);
  }
}
?>
Oder gibts etwas eleganteres? __call werde ich nicht einsetzen!

Edit, macht es dann überhaupt Sinn von einer Klasse zu erben und die andere per Interface einzubinden oder sollte man dann konsequent sein und beides per Interface einbinden?

Geändert von Chriz (13.02.2010 um 16:20 Uhr).
Chriz ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 13.02.2010, 18:02  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Und wenn Du immer, notfalls leere Class-Klassen ableitest? Ist ja letztlich bei CSS auch so. Interfaces halte ich hier nicht für sehr sinnvoll, es sei denn, um ein konkretes Objekt auf ein Interface hin zu testen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 13.02.2010, 19:02  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Wie meinst du leere Class-Klassen?
Chriz ist offline   Mit Zitat antworten
Alt 13.02.2010, 19:12  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Inlines generell von einer Class-Klasse ableiten. Notfalls von einer leeren.

PHP-Code:
<?php

abstract class ParaStyle_Abstract {
  public function 
setMargin() {}
}

class 
ParaStyle_Class extends ParaStyle_Abstract {}

class 
ParaStyle_Inline extends ParaStyle_Class {
  
// konkret
  
public function setMargin() {}
}
?>
bzw.

PHP-Code:
<?php

interface ParaStyle_Abstract {
  public function 
setMargin();
}

class 
ParaStyle_Class implements ParaStyle_Abstract {}

class 
ParaStyle_Inline extends ParaStyle_Class {
  
// konkret
  
public function setMargin() {}
}
?>
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 13.02.2010, 19:22  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Klassen und Inlines sind aber unterschiedlich und haben nur eine gewisse Schnittmenge an Gemeinsamkeiten. Es macht keinen Sinn Inlinestyles einen Namen, eine ID oder Eigenschaften für die Ansicht in den Formatvorlagen von MS Office festzulegen. Alternativ könnte ich ein getClass() implementieren, welches das Class-Objekt zurückliefert. Das scheint mir aber unhandlich zu sein. Ich denke ich werde einen Codegenerator schreiben, der die Methoden der Interfaces implementiert, in denen einfach eine Delegation stattfindet (2. Codebeispiel im OP).
Chriz ist offline   Mit Zitat antworten
Alt 13.02.2010, 19:45  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Naja, vermutlich hinkt das CSS-Beispiel dann etwas als Anschauung. So richtig weiß ich nicht worauf Du hinauswillst.
Zitat:
Es macht keinen Sinn Inlinestyles einen Namen, eine ID oder Eigenschaften für die Ansicht in den Formatvorlagen von MS Office festzulegen.
Verstehe ich. Warum aber bist Du dann der Meinung, dass beide Objektarten überhaupt etwas gemeinsames implementieren? Weil sie denselben Effekt erzeugen?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 14.02.2010, 22:48  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Naja ich frage mich halt wie man das elegeant ohne Mehrfachvererbung lösen kann, wenn es nunmal Objekte gibt, die von zwei oder mehr Klassen erben sollen.

Formate: Paragraph, Character, Table, Numbering
Typen: Formatvorlage, Inlineformat

Alle Objekte haben einen Haufen an Methoden (Setter/Getter). Zusammen bräuchte ich dann 4x2 Klassen. Paragraph_Formatvorlage, Paragraph_Inlineformat, Character_Formatvorlage, Character_Inlineformat usw.

Mir fällt hier keine schöne Lösung ein, ohne Code doppelt abzulegen.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 14.02.2010, 22:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Ich weiß nicht genau, wie ich das erklären soll, aber kannst Du nicht die gemeinsame Schnittstelle (also die eigentlichen Settings) auslagern und in die jeweiligen Ausprägungen (inline, Vorlage) hineinkomponieren? Je nach Träger der Assoziation könnten die Settings dann verschiedene Ausprägungen haben (mögliche border-Settings für Tables, mögliche Line-Heights für Absätze, keines von beidem für Fließtext).

__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (14.02.2010 um 23:10 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 15.02.2010, 00:02  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Nein, die sind schon größtenteils einfache Properties. Gibt natürlich auch Ausnahmen. Ich meine ist nicht so, dass ich Logik doppelt implementieren würde, eben nur einen Haufen doppelter Setter/Getter.

Das sind z.B. Eigenschaften eines Paragraph und einer Formatvorlage.
Code:
    protected $_spacing;
    protected $_text;
    protected $_keepNext;
    protected $_keepLines;
    protected $_pageBreakBefore;
    protected $_autoSpaceDE;
    protected $_autoSpaceDN;
    protected $_indention;
    protected $_outlineLevel;
Das eine Formatvorlage:
Code:
    protected $_styleId;
    protected $_name;
    protected $_basedOn;
    protected $_next;
    protected $_userInterfacePriority;
    protected $_unhideWhenUsed;
    protected $_semiHidden;
    protected $_qFormat;
Kannst dir vorstellen, dass bei den Eigenschaften halt haufenweise mehrfach gleiche Setter/Getter implementiert werden müssen und das stört mich halt irgendwie. Aber ich denke da gibt es konzeptionell nichts zu machen.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 15.02.2010, 00:12  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Naja, ok, ich habe wohl zu wei in Richtung CSS und Open Office Vorlagen gedacht, wo bspw. Absatzvorlagen auch gleich mannigfaltige Angaben zu Schriftarten, etc. enthalten und alles untereinander erbt.
Wenn es wirklich nur minimale Schnittpunkte gibt, ist Generieren wohl wirklich die beste Lösung.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mehrfachvererbung css, css mehrfach vererbung, php mehrfachvererbung, javascript mehrfachvererbung, php extends mehrfach vererbung, word vererbungsregeln formatvorlage, css mehrfachvererbung, mehrfachvererbung php, php mehrfachvererbung lösen

Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 Uhr.




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