Melvin Cowznofski: OOP im MCV Stil mit PHP

Beitrag lesen

Hallo,

nachdem ich meine PHP Skripte jahrelang im prozeduralen Stil geschrieben hatte, bin ich irgendwann umgestiegen auf eine objektorientierte Programmierung. Allerdings waren 99% meiner Methoden statisch, benötigten also keine Klasse. Und somit war das Konzept von OOP nicht wirklich in Verwendung.

Ich denke, dies ist der typische "Anfängerfehler", wenn man mit OOP beginnt. Da wird dann einfach alles in Klassen geschmissen und statisch aufgerufen. Naja, das hat, obwohl das dann ja nichts anderes als eine Funktions-Sammlung ist, dann zumindest den Vorteil, dass die Methoden thematisch strukturiert in Klassen zusammengefasst sind.

Diesen Stil habe ich jedenfalls geändert, nachdem ich immer mehr verstanden habe, was die Vorzüge einer wirklichen OOP sind, und arbeite nun eigentlich überhaupt nicht mehr mit rein statischen Methoden. Allerdings hatte ich bisher so gut wie immer sämtlichen Code für ein gewünschtes Prozedere in einer einzigen Methode verpackt. Und als ich in letzter Zeit mehrmals mit dem Begriff des MCV Modells konfrontiert wurde, war mir klar, dass mein Programmierstil dem offensichtlich nicht entspricht.

Ich habe mich jetzt eine Zeit lang mit dieser Pattern-Idee beschäftigt und hoffe, das nun halbwegs verstanden zu haben. Am Anfang fand ich dieses Konzept etwas verwirrend. Aus diesem Grund schreibe ich dieses Posting. Ich würde gerne wissen, ob ich das Konzept richtig verstanden und anhand eines Beispiels auch richtig umgesetzt habe.

Nehmen wir als völlig triviales und sinnloses Beispiel, dass 2 Strings mit einem Verbindungs-String zu einem einzigen String verkettet werden sollen. Mein Lösungsansatz mit OOP und angewandtem MCV Modell sieht folgendermaßen aus:

Bei der Instanz-Erstellung wird der Klasse ein gewünschter Verbindungs-String übergeben. Es muss also ein neues Objekt erstellt werden, wenn sich der Verbindungs-String ändern soll. Wenn nichts übergeben wird, dann soll standardmäßig ein Bindestrich mit einem Leerzeichen links und rechts davon die beiden String-Teile verbinden.

Die Methode change() ist ein Controller. Sie nimmt den Auftrag vom User entgegen und leitet ihn an das Model, die Methode stringManipulation() weiter. Diese Methode macht nun die eigentliche Arbeit. Das Resultat wird als Eigenschaft des Objekts gespeichert. Die Methode showManipulation() ist der View-Teil des Modells. Sie stellt das Ergebnis zur Verfügung, in dem sie die Eigenschaft abholt und an den Controller zurückgibt. Dieser kann nun das Ergebnis an den User zurückgeben.

Das Model, die Methode stringManipulation() hat hier nur diese eine Aufgabe, könnte aber auch andere Arbeiten verrichten, wie zB. das Kürzen von Strings. Deshalb übergibt man ihr mittels dem Wert $order den genauen Auftrag.

Der gesamte Code samt 2 Ausgaben sieht nun so aus:

<?php

declare(strict_types = 1);
header('content-type:text/html; charset=UTF-8');
error_reporting(E_ALL|E_STRICT);
mb_internal_encoding('UTF-8');

// Ziel: Methode change() der Klasse Stringmanipulation soll 2 Strings mit einem anderen String verbinden.

class Stringmanipulation
{

private $_connector;
private $_manipulationResult;

public function __construct(string $connector = ' - ')
	{
		$this -> _connector = $connector;
	}

// Controller:
public function change(string $input_1, string $input_2): string
	{
		$this -> stringManipulation($input_1, $input_2, 'connect');
		return $this -> showManipulation();
	}

// Model:
private function stringManipulation(string $input_1, string $input_2, string $order)
	{
		if($order === 'connect')
			{
				$string = $input_1.$this -> _connector.$input_2;
				$this -> _manipulationResult = $string;
			}
	}

// View:
private function showManipulation(): string
	{
		return $this -> _manipulationResult;
	}

}

$manipulation_1 = new Stringmanipulation;
echo $manipulation_1 -> change('Mann', 'Frau').'<br><br>';
$manipulation_2 = new Stringmanipulation('#####');
echo $manipulation_2 -> change('Mann', 'Frau');

?>

Ich würde jetzt gerne wissen, ob das (abgesehen von der Unsinnigkeit der Aufgabe) ein korrektes Umsetzen des MCV Modells mit OOP ist, damit ich weiß, ob ich die Sache jetzt halbwegs richtig verstanden habe. Mir ist klar, dass man für diese Aufgabe so ein Konzept nicht wirklich braucht. Es geht mir rein um die logisch richtige Anwendung des Programmier-Patterns.

Wo ich mir prinzipiell nicht sicher bin, ist die Entscheidung, wann man jetzt das MCV Modell verwenden soll und wo es unsinnig ist. Da geht es mir wie mit den statischen Methoden in Klassen. Ich verwende sie eigentlich überhaupt nicht mehr, auch nicht in Fällen, wo ich mich frage, ob das Erstellen eines Objekts, nur damit man eine Methode verwenden kann, nicht "too much" ist. Auch hier fällt mir dann die Entscheidung schwer, ob ich jetzt eine Instanz erstellen und die Methode nicht-statisch mache oder nicht. Ich würde mich freuen, wenn mir hier jemand, der sich mit dieser Thematik besser auskennt, ein kleines Feedback oder einen Input gibt, egal, ob technischer oder philosophischer Natur.

Mit lieben Grüßen

Melvin Cowznofski

PS: Übrigens: Hello again! Ich war hier jahrelang nicht mehr online. Ein schönes Gefühl, wieder mal aktiv zu sein hier!

--
What – me worry?