2010-07-04 2 views
6

Hier ist ein SzenarioSollten Pass-Parameter in der Methode vermieden werden und so viel wie möglich in OOP verwendet werden?

class page { 
    public $name; 
    public $title; 

    public function showhead() { 
      return "<head><title>".$this->title."</title></head>"; 
    } 
} 
$mypage = new page; 
$mypage->title = "My Page title"; 
$mypage->showhead(); 

und ein anderes Szenario

class page { 
    public $name; 
    public function showhead($title) { 
      return "<head><title>".$title."</title></head>"; 
    } 
} 
$mypage = new page; 
$mypage->showhead("My Page title"); 

Unter diesen Verfahren, die besser ist und die vermieden werden sollten? Und warum?

+0

Tippfehler? "möglichst vermieden und genutzt werden" - ändern und zu oder? – apollodude217

Antwort

8

Ich denke, es hängt davon ab, ob Sie diesen Titel jemals wieder benötigen. Wenn Sie dies tun, dann machen Sie die Eigenschaft zum Speichern und Abrufen. Wenn Sie es nur einmal benötigen, verwenden Sie den Methodenparameter.

1

Ohne zusätzliche Informationen, würde ich sagen, dass der erste ist „besser“, weil es mir scheint, dass $name und $title Eigenschaften page gehören, sind daher sollte es ein Klassenmitglied sein. Wenn Sie jedoch der Meinung sind, dass die zweite Version für Ihre Situation besser geeignet ist, verwenden Sie sie auf jeden Fall.

5

Es gibt immer eine gewisse Spannung zwischen der Übergabe von Parametern (entweder einzeln oder in unveränderlichen Aggregattypen, die es in PHP nicht gibt) und irgendwo (Klasseneigenschaften, Globals, was auch immer). Einer der Vorteile von OOP besteht darin, dass Sie den Status in Objekten speichern und von der Kapselung profitieren können (verhindert ein versehentliches Überschreiben von Daten) und vermeiden Sie gleichzeitig, dass die Symboltabellen mit Variablen verschmutzt werden. Die Verwendung dieser veränderbaren Objekte hat ihre eigenen Probleme, besonders wenn wir in die Multi-Thread-Programmierung einsteigen, aber das ist in PHP ein kleineres Problem.

In Ihrem speziellen Fall, ich denke, es wäre eine bessere Idee, den Titel im Objekt zu speichern. Wie in silico sagte, scheint es die page zu gehören, und oben auf, dass Sie können, wie Dinge zu tun:

$page = new page; 
$page->setTitle("whatever"); 
... 
function doStuff($page) { 
    ... 
    $page->showhead(); 
} 

Und dann haben Sie nicht $page zusammen mit dem Titel zu übergeben.

3

IMO: weil die -> showhead() weniger semantische Beziehung zu dem $ title als das Objekt selbst, sollten Sie $ title assing entweder als Eigentum oder besser über den Objektkonstruktor:

class page { 
    function __construct($title="") { 
     $this->title = $title 
    } 

So Sie können entweder new page("My page") oder später zuweisen $page->title=..., je nachdem, wann Sie es zur Verfügung haben.

+0

Und noch wichtiger; Sie können die Eigenschaft jetzt als geschützt deklarieren und dadurch das Objekt unveränderbar machen. – troelskn

1

Auf einer seitlichen Anmerkung für Best Practices, wäre es eine gute Idee, nicht direkt auf das Objekt Mitglied zugreifen zu können, sondern sie geschützt machen und setzen/es durch öffentliche Methoden stattdessen bekommen, so etwas wie dieses

class foo 
{ 
    protected $title; 

    public function setTitle($title) 
    { 
     $this->title = $title; 
    } 

    public function getTitle() 
    { 
     return $this->title; 
    } 
} 

Dadurch muss kein anderer Code, der mit diesen Daten arbeitet, wissen, wie er tatsächlich gespeichert ist, und stattdessen stattdessen eine Schnittstelle bereitstellen, wodurch die Daten gekapselt (isoliert) werden. http://en.wikipedia.org/wiki/Information_hiding

3

Sie sollten sich fragen: Gehört der Titel zu einer Seite? Oder ist es etwas, das eine Seite benutzt?
Dies sind die wichtigsten Heuristiken ich nutzen, um herauszufinden, wie ein Unternehmen in OOP entwickelt werden muss:

  • compisition eine Beziehung von ist, hat-a.Hat eine Seite eine Titel? Die Antwort auf diese Frage ist ja.
  • Vererbung ist eine Beziehung von is-a. Ist die Seite eine Titel? Die Antwort auf diese Frage ist nein. Beachten Sie, dass Sie Komposition und Vererbung möglichst bevorzugen sollten. Normalerweise können Sie beide verwenden.
  • Übergeben eines Parameters an eine Funktion ist eine Beziehung von verwendet-a. Verwendet eine Seite einen Titel? Die Antwort auf diese Frage ist ja. Jedoch hat-a ist eine stärkere Beziehung dann verwendet-a. Wieder manchmal können Sie beide verwenden, aber Sie sollten bevorzugen has-a bis verwendet-a, wenn möglich.
Verwandte Themen