2 Stimmen

Sollte ich diese Klasse erweitern? (PHP)

Ich erstelle gerade ein ORM in PHP, und ich habe eine Klasse 'ORM', die im Grunde ein Objekt erstellt, das einer Datenbanktabelle entspricht (ich strebe ähnliche Funktionen wie bei einem ActiveRecord-Muster an.) ORM selbst erweitert 'Database', die die Datenbankverbindung einrichtet.

Also kann ich aufrufen:

$c = new Customer();
$c->name = 'John Smith';
$c->save();

Die ORM-Klasse bietet diese Funktionalität (richtet die Klasseneigenschaften ein, bietet save(), find(), findAll() etc. Methoden) und Customer erweitert ORM. Möglicherweise möchte ich jedoch in Zukunft zusätzliche öffentliche Methoden zu Customer (oder einem anderen Modell, das ich erstelle) hinzufügen. Sollte diese also ORM erweitern oder nicht?

Ich weiß, dass ich hier nicht viele Informationen bereitgestellt habe, aber hoffentlich ist dies anhand einer vagen Erklärung verständlich, anstatt 300+ Codezeilen aufzulisten.

3voto

nickf Punkte 517253

Ich stimme den anderen Antworten hier zu - fügen Sie die zusätzlichen Methoden in einer abgeleiteten Klasse ein. Ich würde allerdings noch einen Sternchen hinzufügen: Jedes Mal, wenn Sie die Klasse mit zusätzlichen Methoden erweitern, überlegen Sie, was Sie mit der Erweiterung erreichen möchten, und überlegen Sie, ob es verallgemeinert und in die Elternklasse zurückgearbeitet werden kann. Zum Beispiel:

// Customer.class.php
function getByName($name) {
    // SELECT * FROM `customer` WHERE `name` = $name
}

// ** this could instead be written as: **
// ORM.class.php
function getByField($field, $value) {
    // SELECT * FROM `$this->table` WHERE `$field` = $value
}

2voto

Tim Mooney Punkte 182

Sie denken sicherlich richtig, wenn Sie Ihre Geschäftslogik in einer neuen Klasse außerhalb Ihres 'ORM' platzieren. Anstatt die ORM-Klasse einfach zu erweitern, würde ich sie lieber mit einer neuen Wertobjektklasse umhüllen, um einen zusätzlichen Grad an Freiheit von Ihrem Datenbankdesign zu bieten, damit Sie die Klasse als ein reines Geschäftsobjekt betrachten können.

2voto

Nein. Sie sollten Komposition anstelle von Vererbung verwenden. Sehen Sie sich das folgende Beispiel an:

class Customer {
    public $name;
    public function save() {
        $orm = new ORM('customers', 'id'); // Tabellenname und Primärschlüssel
        $orm->name = $this->name;
        $orm->save();
    }
}

Und die ORM-Klasse sollte nicht von Database erweitert werden. Auch in diesem Fall ist die Komposition am besten geeignet.

1voto

petr k. Punkte 7910

Ja, platzieren Sie Ihre Geschäftslogik in einer Nachfolgeklasse. Dies ist ein sehr verbreitetes Muster, das in den meisten Data-Access-Layer-Generierungsframeworks zu sehen ist.

0voto

Lucas Oman Punkte 15159

Sie sollten die ORM-Klasse unbedingt erweitern. Verschiedene Dinge sollten Objekte verschiedener Klassen sein. Kunden sind sehr unterschiedlich von Produkten, und beide in einer einzigen ORM-Klasse zu unterstützen wäre überflüssiger Ballast und würde den Zweck der OOP vollständig zunichte machen.

Eine weitere gute Sache ist, Hooks für vor dem Speichern, nach dem Speichern, etc. hinzuzufügen. Diese geben Ihnen mehr Flexibilität, wenn Ihre ORM erweiternden Klassen vielfältiger werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X