Objektorientiertes Design Newsletter - Verbesserungen?

Hierein gehört alles, was in den übrigen Foren keinen Platz findet. // Please post here in case your topic doesn't fit enywhere else.
Antworten
jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Objektorientiertes Design Newsletter - Verbesserungen?

Beitrag von jprangenberg » 09.09.2013, 23:34:11

EDIT: Die PHP-Code Vorschau scheint das Zeichen "\" nicht anzeigen zu können. Siehe Namespaces und Uses.
-----------------------------------------------------------------------
Hallo zusammen,

habe mit Christian kurz geschrieben. Er meint, ich soll mein Design mal vorstellen und hier evtl. Verbesserungsvorschläge geben lassen.

Folgendes Konstrukt:
Ich möchte ein Modul haben, welches mir Newsletter-Interessenten registriert. Dazu möchte ich aber offen sein, dass ich die Komponente austauschen kann. Das bedeutet, dass ich heute den Dienst von Cleverreach nutzen will, morgen die Interessenten evtl. in eine SQL-Datenbank speichern möchte.

Ich möchte euch mal meine Umsetzung vorstellen. Eventuell seht Ihr direkt einen Verbesserungsvorschlag!

engine/newsletter/biz/NewsLetterManager.php:

Code: Alles auswählen

<?php
namespace APPLICATIONenginenewsletterbiz;

/**
 * Created by www.mywebhd.com.
 * User: Jens Prangenberg <jprangenberg@mywebhd.com>
 * Date: 03.09.13
 */
use APFcorepagecontrollerAPFObject;
use APPLICATIONenginenewsletterdataNewsLetterMapper;

class NewsLetterManager extends APFObject {

    /**
     * @var NewsLetterMapper|null
     */
    private $mapper = null;

    /**
     * @param NewsLetterMapper $Mapper
     */
    public function setMapper( NewsLetterMapper $Mapper ) {
        $this->mapper = $Mapper;
    }

    /**
     * @param $EMail
     */
    public function addReciever( $EMail ) {
        $this->mapper->addReciever( $EMail );
    }

}

class CantSaveRecieverException extends Exception {} 
engine/newsletter/data/NewsLetterMapper.php:

Code: Alles auswählen

<?php
namespace APPLICATIONenginenewsletterdata;

/**
 * Created by www.mywebhd.com.
 * User: Jens Prangenberg <jprangenberg@mywebhd.com>
 * Date: 03.09.13
 */
interface NewsLetterMapper {

    /**
     * @param $EMail
     * @return mixed
     * @throw CantSaveRecieverException
     */
    public function addReciever( $EMail );

} 
engine/newsletter/data/cleverreach/CleverReachMapper.php:

Code: Alles auswählen

<?php
namespace APPLICATIONenginenewsletterdatacleverreach;

/**
 * Created by www.mywebhd.com.
 * User: Jens Prangenberg <jprangenberg@mywebhd.com>
 * Date: 03.09.13
 */
use APFcorepagecontrollerAPFObject;
use APPLICATIONenginenewsletterdataNewsLetterMapper;
use APPLICATIONenginenewsletterbizCantSaveRecieverException;

class CleverReachMapper extends APFObject implements NewsLetterMapper {

    /**
     * @var SoapClient|null
     */
    private $api = null;

    /**
     * @var string
     */
    private $wsdlUrl;

    /**
     * @var string
     */
    private $projectName;

    /**
     * @var string
     */
    private $apiKey;

    /**
     * @var string
     */
    private $listenId;

    /**
     * @param $EMail
     * @return mixed|void
     * @throws CantSaveRecieverException
     */
    public function addReciever( $EMail )
    {
        // user array
        $user = array(
            "email" => $EMail,
            "registered" => time(),
            "activated" => time(),
            "source" => $this->projectName,
        );
        $result = $this->api->receiverAdd( $this->apiKey, $this->listenId, $user );

        // check wheter result has an error
        if( $result->status == 'ERROR' ) {
            throw new CantSaveRecieverException( $result->message );
        }

    }

    /**
     * @param $wsdlUrl
     */
    public function setWsdlUrl( $wsdlUrl ) {
        $this->wsdlUrl = $wsdlUrl;
    }

    /**
     * @param $projectName
     */
    public function setProjectName( $projectName ) {
        $this->projectName = $projectName;
    }

    /**
     * @param $apiKey
     */
    public function setApiKey( $apiKey ) {
        $this->apiKey = $apiKey;
    }

    /**
     * @param $listenId
     */
    public function setListenId( $listenId ) {
        $this->listenId = $listenId;
    }

    /**
     * Setup method - invoke after all init/conf calls
     */
    public function setup() {
        $this->api = new SoapClient( $this->wsdlUrl );
    }

} 
config/engine/newsletter/biz/serviceobject.ini:

Code: Alles auswählen

[NewsLetterManager]
servicetype = "SINGLETON"
class = "APPLICATION\engine\newsletter\biz\NewsLetterManager"
init.mapper.method = "setMapper"
init.mapper.namespace = "APPLICATION\engine\newsletter\data"
init.mapper.name =  "CleverReachMapper"
config/engine/newsletter/data/serviceobject.ini:

Code: Alles auswählen

[CleverReachMapper]
servicetype = "SINGLETON"
class = "APPLICATION\engine\newsletter\data\cleverreach\CleverReachMapper"
conf.wsdlurl.method = "setWsdlUrl"
conf.wsdlurl.value = "http://api.cleverreach.com/soap/interface_v5.1.php?wsdl"
conf.projectName.method = "setProjectName"
conf.projectName.value = "xxx"
conf.apiKey.method = "setApiKey"
conf.apiKey.value = "xxx"
conf.listenId.method = "setListenId"
conf.listenId.value = "xxx"
setupmethod = "setup"
Aufruf dieses Modules:

Code: Alles auswählen

/* @var $NewsLetterManager NewsLetterManager */
        $NewsLetterManager = $this->getDIServiceObject( 'APPLICATION\engine\newsletter\biz', 'NewsLetterManager' );
        try {
            $NewsLetterManager->addReciever( 'j@j.de' );
        }
        catch( CantSaveRecieverException $err ) {
            echo $err->getMessage();
        } 
Fällt euch ein Designfehler auf? Verbesserungsvorschläge?
Dazu möchte ich aber offen sein, dass ich die Komponente austauschen kann.
Das wäre doch damit sauber gegeben, oder?! Jeder Mapper, könnte somit ausgetauscht werden.

Danke für eure Hilfen!
Zuletzt geändert von jprangenberg am 13.09.2013, 00:19:49, insgesamt 2-mal geändert.

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: Objektorientiertes Design Newsletter - Verbesserungen?

Beitrag von jprangenberg » 13.09.2013, 00:17:26

Keine Verbesserungsvorschläge? :-)

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Objektorientiertes Design Newsletter - Verbesserungen?

Beitrag von jwlighting » 13.09.2013, 16:20:23

Ich schaue am Wochenende mal rein. Kannst mich auch gerne bei Skype erinnern. Jetzt bin ich gerade auf dem Sprung.

LG :)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Objektorientiertes Design Newsletter - Verbesserungen?

Beitrag von jwlighting » 14.09.2013, 20:14:04

Hallo Jens,

an deinem Entwurf gibt es in der tat nicht viel auszusetzen. lediglich deine PhpDocs könnten etwas mehr hergeben :D Hat aber ja mit dem Design nicht viel zu tun.

Noch ein paar Gedanken von mir, die - das möchte ich betonen - meine Denkweise darstellen, und nicht zwangsweise das was richtig ist. Ich kann mich also auch irren. (Falls es ein "richtig" hier überhaupt gibt ;)):

Es fällt mir auf, dass dein Manager eigentlich nur eine Aufgabe hat: er deligiert an den Mapper. Der Manager ist also nur die Schnittstelle die du ansprichst, um eine bestimmte Funktion - hier das Speichern von Empfängern - zu nutzen. Wenn ich mich nicht irre, handelt es sich hier also eigentlich um ein Remote-Proxy(-Pattern). Es gibt aber auch Ähnlichkeit zum Adapter-Pattern.
In diesem Fall sehe ich den Mapper eher als Provider der Funktion, weniger als Mapper. Ein Mapper hat für mein Verständnis immer die Aufgabe, Objekte aus der Datenschicht heraus zu füllen oder in dieser zu hinterlegen. Hier stellt er nur einen Adapter zur Datenschicht da. Damit stellst du also nur diese Funktion zur Verfügung; das wäre dann ein Provider. Einen Mapper hättest du , wenn du Objekte wie NewsletterReceiver beziehen und ablegen würdest.
Um nochmal auf oben zurückzukommen: Das Remote-Proxy ist hier im Fall des Soap-Zugangs der "Mapper". Gleichzeitig ist er auch Adapter, da er das von dir verlange Interface zur Verfügung stellt, die eigentliche Funktion aber vom Soap-Service zur Verfügung gestellt wird.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: Objektorientiertes Design Newsletter - Verbesserungen?

Beitrag von jprangenberg » 15.09.2013, 18:34:38

Hallo Jan,

danke für deine Antwort! Also würdest du die Mapper in Provider umbenennen?

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: Objektorientiertes Design Newsletter - Verbesserungen?

Beitrag von jwlighting » 15.09.2013, 19:51:29

Das könntest du machen, wenn du das selbst so sinnvoller findest. Nur weil ich das anders nennen würde, ist es kein muss.

LG :)
Jan

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast