gelöst Erstellen einer Factory-Methode (Instanzmethode)


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

gelöst Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon yuro » 20.12.2014, 01:02

Hallo Leute :-),

Ich hätte mal eine allgemeine Frage zu Factory Methoden.
Und zwar wollte ich wissen, wie ich diese genau definieren soll, da ich Beiträge gelesen habe über "abstrakte Klassen" welche von Unterklassen geerbt werden und in Factory Methoden sozusagen die Objekte direkt erstellt werden mit CREATE OBJECT und nicht erst im Ereignisblock.

Kann mir jemand ein paar mehr Informationen zu dem Thema geben?

In meinem Beispiel habe ich eine Klasse "AUTO" definiert, als auch implementiert. Jetzt soll eine weitere Klasse "AUTO_AGENT" das instanziieren der Klasse Auto mithilfe einer Instanzmethode übernommen werden, d.h. also das die Klasse Auto nicht mehr auf dem direkten Weg instanziierbar sein soll.

Ich bedank mich schonmal für jeden hilfreichen Beitrag :)
yuro
ForumUser
 
Beiträge: 26
Registriert: 01.12.2014, 13:37
Dank erhalten: 0 mal
Ich bin: Student/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon ralf.wenzel » 20.12.2014, 08:41

Bei Factory Methoden gibt es einen Dissenz zwischen zwei Gruppen. Instanziierung der Klasse auf "Private" und eine statische öffentliche Methode, die die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe. Dein Ansatz geht viel mehr in die Richtung. Du hast eine Oberklasse (ich bleibe bei deinem Beispiel) AUTO und darunter diverse Unterklassen CABRIO, KOMBI, etc.

Statt nun die Unterklasse zu instanziieren, schreibst du eine Methode AUTO=>FACTORY( ), die anhand bestimmter Kriterien eines der Unterobjekte auswählt und dynamisch die Instanz bildet: CREATE OBJECT name TYPE (concrete_class). Bei mir sind das oft Customizingtabellen, in denen ich den konkreten Klassennamen auslese und das konkrete Objekt gebe ich als Returning-Parameter zurück. Der Aufrufer bekommt ein Objekt zurück, also MY_CAR =? AUTO=>FACTORY( )., ( deklariert mit DATA MY_CAR TYPE REF TO AUTO) ohne dass er vorher weiß, welchen Untertyp von AUTO er bekommt.

Bei mir ist diese Methode in der Regel Komponente der Oberklasse, weil ich sehr wenig mit abstrakten Klassen arbeite. Man kann, wenn man eine abstrakte Oberklasse AUTO hat, aber auch eine Agentenklasse dafür schreiben, was dann aber fast in Richtung Abstrakte Fabrik geht.

Habe ich das halbwegs verständlich erklärt?
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing

Für diese Nachricht hat ralf.wenzel einen Dank bekommen :
yuro
ralf.wenzel
Top Expert
 
Beiträge: 2284
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon yuro » 20.12.2014, 10:50

Hallo Ralf,

Danke dir für die hilfreiche Erklärung.
Ich habe mal folgendermaßen angefangen, allerdings wird mir gesagt das die Variablen nicht mit Werten versorgt sind.

Klasse Auto Definition:
Code: Alles auswählen
CLASS lcl_auto DEFINITION CREATE PRIVATE FRIENDS lcl_auto_agent.
  PUBLIC SECTION.

  TYPES: ty_autotyp(20) TYPE c,
         ty_tankfuellung TYPE i,
         ty_verbrauch(3) TYPE p DECIMALS 2.

  DATA: kennzeichen(10) TYPE c.

  METHODS:constructor IMPORTING i_kennzeichen TYPE csequence
                                i_tankfuellung TYPE csequence
                                i_verbrauch TYPE csequence
                                i_autotyp TYPE csequence.

  METHODS: drucke,
           get_autotyp RETURNING VALUE(r_autotyp) TYPE ty_autotyp,
           set_autotyp IMPORTING VALUE(i_autotyp) TYPE csequence,
           get_tankfuellung RETURNING VALUE(r_tankfuellung) TYPE ty_tankfuellung,
           set_tankfuellung IMPORTING VALUE(i_tankfuellung) TYPE csequence,
           get_verbrauch RETURNING VALUE(r_verbrauch) TYPE ty_verbrauch,
           set_verbrauch IMPORTING VALUE(i_verbrauch) TYPE csequence.

  PRIVATE SECTION.

  DATA: autotyp TYPE ty_autotyp,
        tankfuellung TYPE ty_tankfuellung,
        verbrauch TYPE ty_verbrauch.
ENDCLASS.
 


Klasse Auto_agent Definition:
Code: Alles auswählen
CLASS lcl_auto_agent DEFINITION.
  PUBLIC SECTION.

  METHODS: ausgabe RETURNING VALUE(oref) TYPE REF TO lcl_auto.
ENDCLASS.
 


Klasse Auto_agent Implementation:
Code: Alles auswählen
CLASS lcl_auto_agent IMPLEMENTATION.
  METHOD ausgabe.
    CREATE OBJECT oref. //Hier kommt der Fehler: obligatorische Parameter ist nicht mit Werten versorgt.
  ENDMETHOD.
ENDCLASS.
 


Ereignisblock:
Code: Alles auswählen
DATA: fahrzeug TYPE REF TO lcl_auto,
      agent TYPE REF TO lcl_auto_agent.

CREATE OBJECT agent.

fahrzeug = agent->ausgabe( ).
fahrzeug->set_autotyp( 'Jaguar' ).
....
fahrzeug->get_autotyp( ).
....
fahrzeug->drucke( ).
 
yuro
ForumUser
 
Beiträge: 26
Registriert: 01.12.2014, 13:37
Dank erhalten: 0 mal
Ich bin: Student/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon ralf.wenzel » 20.12.2014, 13:44

Das hätte ich komplett anders gemacht und habe das auch so geschrieben. Schon der Umstand, dass die Methode AUSGABE eine Instanzenmethode ist und keine statische, halte ich für den falschen Weg.

Mach es mal so, wie ich es beschrieben habe.
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2284
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon Unit605 » 20.12.2014, 19:02

ralf.wenzel hat geschrieben:Bei Factory Methoden gibt es einen Dissenz zwischen zwei Gruppen. Instanziierung der Klasse auf "Private" und eine statische öffentliche Methode, die die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe. Dein Ansatz geht viel mehr in die Richtung. Du hast eine Oberklasse (ich bleibe bei deinem Beispiel) AUTO und darunter diverse Unterklassen CABRIO, KOMBI, etc.

Statt nun die Unterklasse zu instanziieren, schreibst du eine Methode AUTO=>FACTORY( ), die anhand bestimmter Kriterien eines der Unterobjekte auswählt und dynamisch die Instanz bildet: CREATE OBJECT name TYPE (concrete_class). Bei mir sind das oft Customizingtabellen, in denen ich den konkreten Klassennamen auslese und das konkrete Objekt gebe ich als Returning-Parameter zurück. Der Aufrufer bekommt ein Objekt zurück, also MY_CAR =? AUTO=>FACTORY( )., ( deklariert mit DATA MY_CAR TYPE REF TO AUTO) ohne dass er vorher weiß, welchen Untertyp von AUTO er bekommt.

Bei mir ist diese Methode in der Regel Komponente der Oberklasse, weil ich sehr wenig mit abstrakten Klassen arbeite. Man kann, wenn man eine abstrakte Oberklasse AUTO hat, aber auch eine Agentenklasse dafür schreiben, was dann aber fast in Richtung Abstrakte Fabrik geht.

Habe ich das halbwegs verständlich erklärt?


Wenn ich mir die Methode FACTORY der Klasse CL_SALV_TABLE ansehe, wird dort genau DAS gemacht, was Du nicht als Factory Design Pattern verstehst!??!!?

cl_salv_table=>factory( ....) > Instanziierung durch eine statische öffentliche Methode.
Unit605
Expert
 
Beiträge: 917
Registriert: 05.02.2009, 21:29
Wohnort: Port Charlotte, FL, USA
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon ralf.wenzel » 20.12.2014, 19:26

Nicht ganz - in BEIDEN Fällen wird durch eine statische öffentliche Methode instanziiert. Man muss aber abgrenzen zwischen einer einfachen Erzeugungsmethode (die ein Objekt instanziiert, das dem Aufrufer bekannt ist) und einer Fabrikmethode im Sinne der Gang of Four, die ein Objekt erzeugt, dessen konkrete Ausprägung der Aufrufer eben NICHT kennt, weil z. B. in der factory-Methode selbst durch Fallunterscheidung oder durch Customizing festgelegt wird, welches Unterobjekt nun genau erzeugt wird.

In dem von mir beschriebenen Fall wird aber eben erst IN der Factorymethode entschieden, welches konkrete Objekt instanziiert wird. Und erst DAS macht eine Methode zu einer Factor-Methode im Sinne des Factory Design Patterns.

Allein, dass man eine Methode "factory" nennt, macht sie nicht zur Factory-Methode ;) Darum nenne ich Erzeugungsmethoden zum Beispiel für Singleton/Multiton Design Patterns grundsätzlich "get_instance", um sie auch vom Namen her abzugrenzen und nicht so auf den Putz zu hauen.

Ich empfehle hierzu immer wieder gern DAS Standardwerk zum Thema Entwurfsmuster, das man aber auf englisch lesen sollte, die deutsche Übersetzung ist sinnentstellend schlecht.

Oder: Nicht alles, was etwas fabriziert (ein Objekt erzeugt) ist eine Fabrik.
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2284
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon Unit605 » 20.12.2014, 20:06

ralf.wenzel hat geschrieben: Man muss aber abgrenzen zwischen einer einfachen Erzeugungsmethode (die ein Objekt instanziiert, das dem Aufrufer bekannt ist) und einer Fabrikmethode im Sinne der Gang of Four, die ein Objekt erzeugt, dessen konkrete Ausprägung der Aufrufer eben NICHT kennt, weil z. B. in der factory-Methode selbst durch Fallunterscheidung oder durch Customizing festgelegt wird, welches Unterobjekt nun genau erzeugt wird.

In dem von mir beschriebenen Fall wird aber eben erst IN der Factorymethode entschieden, welches konkrete Objekt instanziiert wird. Und erst DAS macht eine Methode zu einer Factor-Methode im Sinne des Factory Design Patterns.

Allein, dass man eine Methode "factory" nennt, macht sie nicht zur Factory-Methode ;) Darum nenne ich Erzeugungsmethoden zum Beispiel für Singleton/Multiton Design Patterns grundsätzlich "get_instance", um sie auch vom Namen her abzugrenzen und nicht so auf den Putz zu hauen.

Ich empfehle hierzu immer wieder gern DAS Standardwerk zum Thema Entwurfsmuster, das man aber auf englisch lesen sollte, die deutsche Übersetzung ist sinnentstellend schlecht.

Oder: Nicht alles, was etwas fabriziert (ein Objekt erzeugt) ist eine Fabrik.


Was nun? ===>
ralf.wenzel hat geschrieben:eine statische öffentliche Methode, die die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe.


ralf.wenzel hat geschrieben:Nicht ganz - in BEIDEN Fällen wird durch eine statische öffentliche Methode instanziiert.
Unit605
Expert
 
Beiträge: 917
Registriert: 05.02.2009, 21:29
Wohnort: Port Charlotte, FL, USA
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon ralf.wenzel » 20.12.2014, 20:31

Unit605 hat geschrieben:Was nun? ===>
ralf.wenzel hat geschrieben:eine statische öffentliche Methode, die * die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe.


ralf.wenzel hat geschrieben:Nicht ganz - in BEIDEN Fällen wird durch eine statische öffentliche Methode instanziiert.


Hier hätte das Wort "lediglich" an der mit * markierten Stelle wohl beim Verständnis geholfen. Du darfst aber nicht das Wichtige weglassen beim Zitieren:

ralf.wenzel hat geschrieben:Statt nun die Unterklasse zu instanziieren, schreibst du eine Methode AUTO=>FACTORY( ), die anhand bestimmter Kriterien


Schon an der Schreibweise siehst du, dass es sich bei FACTORY um eine statische Methode handeln muss, zumal ich später schrieb:

ralf.wenzel hat geschrieben:Das hätte ich komplett anders gemacht und habe das auch so geschrieben. Schon der Umstand, dass die Methode AUSGABE eine Instanzenmethode ist und keine statische, halte ich für den falschen Weg.


Der Unterschied zwischen einer einfachen Erzeugungsmethode und einer Fabrikmethode ist, dass ich als Aufrufer gar nicht weiß, welche Art von Objekt mir zurückgeliefert wird. Lies einfach mal das Buch (von dem ich nicht verstehe, dass es Entwickler gibt, die das NICHT kennen), dann verstehst du, was ich meine.

Aber hier scheiden sich dann auch die Geister. Wenn man einen SAP-Entwickler fragt, ob er ABAP OO kann, antwortet er in der Regel reflexartig mit "ja". So wie man bei der Frage "haben Sie irgendwelche verbotenen Gegenstände bei sich?" bei der Polizeikontrolle natürlich mit "nein" antwortet. Die Polizisten fragen dann nach dem Warndreieck, obwohl sie eigentlich in den Kofferraum schauen wollen (wohl wissend, dass dort in aller Regel das Warndreieck verstaut ist).

Daran habe ich mir ein Beispiel genommen und um die Ecke gefragt: Ich habe bei meinen Bewerbungsgesprächen (ja, ich wollte mich mal vergrößern) also gar nicht gefragt, ob jemand ABAP OO kann, sondern ob er mir die Funktionsweise einer Fabrikmethode erklären kann.

Ergebnis: Keiner der fünf konnte mir das auch nur ein bisschen erklären. Damit war meine eigentliche Frage beantwortet.

Was lernen wir daraus? Zwei Dinge, erstens: Methoden aufrufen oder SALVs anzeigen ist kein OO. Und zweitens? Wer verbotene Gegenstände im Kofferraum hat, sollte tunlichst Warndreieck, Verbandskasten und Co. im Fahrgastraum verstauen - denn ohne richterlichen Durchsuchungsbeschluss hat die Polizei dann kein Recht, in den Kofferraum zu sehen ;)

Ralf (der aus Spaß wirklich gelegentlich diese Dinge im Fahrgastraum deponiert - einfach um das dumme Gesicht des Polizisten zu sehen, der darauf nicht geschult ist ;) )
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2284
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon Unit605 » 20.12.2014, 21:27

Versuch doch nicht staendig abzulenken.

Es ging erstmal 'lediglich' nur darum>
ralf.wenzel hat geschrieben:eine statische öffentliche Methode, die die Instanziierung übernimmt ist nicht dass, was ich unter einem Factory Design Pattern verstehe.


Und wenn Du dich dann ertappt fuehlst, kommst Du von Hoelzchen auf Stoeckchen.
ralf.wenzel hat geschrieben:Schon an der Schreibweise siehst du, dass es sich bei FACTORY um eine statische Methode handeln muss,


So gesehen, koennte man meinen Du weisst gar nicht WAS Du geschrieben hast?!?!?

Es sind auch jedesmal nur die anderen, die Deine Posting nicht richtig verstehen. Schon mal auf die Idee gekommen, dass es auch an Deinen Postings liegen koennte. Natuerlich nicht.

Und nun kennst Du ein bestimmtes Buch und denkst Du bist der Master of the Univers?
Unit605
Expert
 
Beiträge: 917
Registriert: 05.02.2009, 21:29
Wohnort: Port Charlotte, FL, USA
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon ralf.wenzel » 20.12.2014, 21:59

Heyheyhey, kein Grund, aggressiv zu werden. Ich habe eingeräumt, dass meine Fornulierung missverständlich war.

Das Fest der Liebe steht vor der Tür. Peace.
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2284
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon yuro » 22.12.2014, 17:01

Hej nochmal,

also ich hab jetzt noch eine Klasse erstellt mit einer statischen Methode, allerdings wird mir immernoch angezeigt das die Variablen nicht mit Parametern versorgt sind.

Code: Alles auswählen
CLASS lcl_ausgabe DEFINITION.
  PUBLIC SECTION.

  CLASS-METHODS main.
ENDCLASS.

CLASS lcl_ausgabe IMPLEMENTATION.
  METHOD main.
    DATA: fahrzeug TYPE REF TO lcl_auto,
          agent TYPE REF TO lcl_auto_agent.


    CREATE OBJECT agent.

    fahrzeug = agent->ausgabe( ).
    fahrzeug->set_autotyp( 'Jaguar' ).
    fahrzeug->set_tankfuellung( '100' ).
    fahrzeug->set_verbrauch( '15.34' ).
    fahrzeug->kennzeichen( 'F-KP69' ).

    fahrzeug->get_autotyp( ).
    fahrzeug->get_tankfuellung( ).
    fahrzeug->get_verbrauch( ).

    fahrzeug->drucke( ).
  ENDMETHOD.
ENDCLASS.
 
yuro
ForumUser
 
Beiträge: 26
Registriert: 01.12.2014, 13:37
Dank erhalten: 0 mal
Ich bin: Student/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon ralf.wenzel » 22.12.2014, 17:15

Zeig mal bitte deine Klasse FAHRZEUG
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2284
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon yuro » 22.12.2014, 17:17

Ich hab keine Klasse Fahrzeug. Das ist lediglich eine Referenzvariable die ich in der DATA Anweisung erstellt habe.

Ich hab 'ne Klasse Auto, Auto_agent und ausgabe.
yuro
ForumUser
 
Beiträge: 26
Registriert: 01.12.2014, 13:37
Dank erhalten: 0 mal
Ich bin: Student/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon ralf.wenzel » 22.12.2014, 17:40

Meine ich doch. Ohne die betroffenen Signaturen kann man jedenfalls nix sagen.
Bild Ralf WenzelHeuristika
SAP-Development • Datenschutzberatung
PublikationenUngarische NotationXing
ralf.wenzel
Top Expert
 
Beiträge: 2284
Registriert: 18.09.2004, 13:03
Wohnort: Hamburg
Dank erhalten: 85 mal
Ich bin: Freiberufler/in

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitragvon yuro » 22.12.2014, 18:12

Ja aber die Referenzvariable Fahrzeug ist doch von der Typreferenz "Auto".
Da brauch ich doch keine Klasse "Fahrzeug".

Agent ist von der Typreferenz "Auto_agent".
Danach erstelle ich das Objekt.

dann definiere ich eine funktionale Methode: fahrzeug = agent->ausgabe( ).

Die Methode ausgabe( ) kommt aus der Klasse auto_agent. Diese wiederum erstellt ein Objekt "oref", welche als Wert in der Klassendefinition von auto_agent zurückgegeben wird vom Typ "auto".

Als letztes erstelle ich die Instanzmethoden über "fahrzeug" zb: fahrzeug->set_autotyp( 'blabla' ).

und beim Ereignis ruf ich auf: ausgabe=>main( ). also von meiner neuen Klasse "ausgabe" die statische Methode main.

Und bekomme "der obligatorische Parameter ist nicht versorgt"... in dem Fall meine Variablen aus der Klasse Auto.

... bin überfragt momentan.
yuro
ForumUser
 
Beiträge: 26
Registriert: 01.12.2014, 13:37
Dank erhalten: 0 mal
Ich bin: Student/in

Nächste

Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
gelöst Datenausgabe funktioniert nicht
Gestern von a-dead-trousers 8 Antw.
ERP auf Windows 7
vor 2 Tagen von Unit605 1 Antw.
SAP - Query - interne Tabelle als Ergebnis ausgeben
Gestern von Bjuti 3 Antw.
Suche nach gleichartigen Einträgen in einer internen Tabelle
Gestern von hausi 6 Antw.
Anpassung Standard Infotypen
vor 2 Tagen von wreichelt 1 Antw.

  Ähnliche Beiträge beta
Dynamisches Einlesen einer CSV oder erstellen einer Struktur
03.11.2016, 18:11 von auronsen 4 Antw.
Erstellen einer neuen Tabelle
11.06.2003, 09:20 von Hermann 5 Antw.
Erstellen einer Excel-Datei im Hintergrundlauf
09.06.2006, 11:58 von JoHo3009 1 Antw.
Liste aus einer internene Tabelle über FUBA erstellen
30.10.2006, 13:57 von Jura 21 Antw.
Domäne erstellen
27.02.2004, 14:54 von zzcpak 6 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

Feedback ...?

Was können wir verbessern? Hinterlasse deine Kontaktdaten, wenn du eine direkte Antwort möchtest.

... Absenden!