Erstellen einer Factory-Methode (Instanzmethode)

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
21 Beiträge • Seite 1 von 2 (current) Nächste
21 Beiträge Seite 1 von 2 (current) Nächste

Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von yuro (ForumUser / 26 / 8 / 0 ) »
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 :)

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
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?

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
yuro

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von yuro (ForumUser / 26 / 8 / 0 ) »
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( ).

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
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 Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
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.

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
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 Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
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.

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
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 Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
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?

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
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 Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von yuro (ForumUser / 26 / 8 / 0 ) »
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.

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Zeig mal bitte deine Klasse FAHRZEUG
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von yuro (ForumUser / 26 / 8 / 0 ) »
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.

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Meine ich doch. Ohne die betroffenen Signaturen kann man jedenfalls nix sagen.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Erstellen einer Factory-Methode (Instanzmethode)

Beitrag von yuro (ForumUser / 26 / 8 / 0 ) »
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.

Vergleichbare Themen

13
Antw.
4429
Views
Factory-Methode dynmisieren....
von ralf.wenzel » 31.03.2015 16:01 • Verfasst in ABAP Objects®
0
Antw.
2524
Views
Instanzmethode in WF-Aufgabe aufrufen?
von bapimueller » 30.09.2019 20:42 • Verfasst in ABAP® Core
3
Antw.
2768
Views
RFC-fähiger FuBa soll Instanzmethode aufrufen
von the.boomerang » 06.05.2011 15:03 • Verfasst in ABAP Objects®
4
Antw.
2924
Views
cl_salv_table=>factory icon wird nicht nach event angezeigt
von c oco » 23.08.2012 17:57 • Verfasst in ABAP® für Anfänger
1
Antw.
1872
Views
cl_salv_table=>factory "lt_bkpf ist nicht typkompatibel zum formalen Parameter "t_table"
von Elekam » 07.10.2020 15:59 • Verfasst in ABAP Objects®

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140