Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoVinícius Medina Van Der Vinne Modificato 6 anni fa
1
ABAP Objects Object-Oriented programming in R/3
Mantova, 21 novembre 2018
2
Introduzione La programmazione orientata agli oggetti è un paradigma di programmazione. Per “paradigma di programmazione” s’intende l’ insieme di strumenti forniti da un linguaggio di programmazione per la stesura di programmi, e definisce/determina il modo in cui il programmatore concepisce il programma.
3
Introduzione Prevede di raggruppare in un'unica entità (la classe) sia le strutture dati che le procedure che operano su di esse, creando un "oggetto" (istanza della classe) software dotato di proprietà (dati) e metodi (procedure) che operano sui dati dell'oggetto stesso. Vantaggi Consistenza nel ciclo di vita Incapsulamento Polimorfismo Ereditarietà Riuso del codice
4
Introduzione ABAP supporta sia la programmazione classica (basata su function module, subroutines etc. etc.) che la programmazione ad oggetti. I due modelli possono essere usati in parallelo. In ABAP Objects è stata implementata una pulizia del liguaggio. In particolare: Proibite alcune istruzioni (FORM…ENDFORM) dichiarazione e sintassi implicite diventano esplicite (vedi ‘occurs 0’) eventuali errori nella gestione dei dati sono controllati e prevenuti
5
Introduzione Utilizzare, appena possibile, la programmazione ad oggetti. Mettere tutto il codice in classi globali o locali, utilizzare interfacce quando serve. Eccezioni solo quando s’intende riutlizzare servizi di f.m. oppure realizzarne di nuovi quando tecnicamente necessario (vedi RFC) Abituarsi alla tipizzazione di variabili, strutture o tabelle Abituarsi all’utilizzo della programmazione ad oggetti aiuta all’accesso alle nuove tecnologie ABAP (Web Dynpro).
6
Gli Oggetti Un oggetto è composto da due strati:
PUBBLICO. Sono visibili attributi (dati), metodi (funzioni) ed eventi. Tutti gli utenti possono accedere a questi elementi. PRIVATO. Composto da attributi (dati), metodi(funzioni) ed eventi che sono visibili solo all’oggetto stesso. Agli attributi privati si accede solo attraverso i metodi dell’oggetto stesso. Perché gli oggetti privati sono “nascosti” ? E’ l’”incapsulamento”. Il meccanismo per cui si assume che gli oggetti privati possono essere modificati mentre l’interfaccia verso l’esterno rimane immutata. Ogni utente (reale o virtuale) che accede all’oggetto può rimanere all’oscuro delle modifiche all’interno e può continuare a lavorare come prima.
7
Gli Oggetti Pubblico Privato A disposizione di tutti Incapsulamento
Attributi Metodi Eventi Privato Incapsulamento Pubblico A disposizione di tutti
8
Gli Oggetti Un oggetto è caratterizzato da:
IDENTITA’ Identifica univocamente ogni oggetto da un altro (istanza). Da non confondere con avere lo stesso nome o gli stessi attributi. STATO Identificato degli attributi COMPORTAMENTO Identificato dai metodi e dagli eventi Oggetti simili tra loro sono raggruppati in classi. Ciascuna classe ne descrive uno e ciascun oggetto è creato in accordo con la sua classe. Una classe è la descrizione di una serie d’oggetti con caratteristiche e comportamenti simili.
9
Classe Descrizione di un oggetto
La classe è la descrizione di un numero di oggetti che hanno stessa struttura e comportamento simile Parte di definizione I componenti di una classe sono definiti nella parte di definizione e sono: Attributi (dati) Tipi dati Costanti Interfacce (come la classe comunica con l’esterno) Metodi (routines) Eventi (triggers) Per ogni componente viene inoltre stabilito il livello di visibilità (pubblica, protetto o privato). Parte di implementazione Nella parte d’implementazione viene sviluppato il codice dei metodi definiti per la classe ed il loro comportamento.
10
Gli attributi di una classe
Gli attributi descrivono i dati che possono essere utilizzati in un oggetto e in una classe. Gli attributi di una classe possono essere di ogni tipo: Types, data, riferimento ad oggetti e interfacce Definizione di tipi propri. Attributi di una classe “aeroplani” possono essere Nome Posti a sedere Peso Lunghezza Tipo di ala (normale/pala...) Capienza del serbatoio
11
Definizione attributi
Class <nomeclasse> definition. TYPES: <definizione tipi> CONSTANTS: <definizione costanti> DATA: variable1 type <type/ddic_type> variable2 TYPE <variable1> variable4 TYPE <type> READ-ONLY variable5 TYPE REF <nomeclasse> variable6 TYPE REF <interfaccia> Endclass. READ-ONLY significa che l’attributo può essere letto dall’esterno ma solo modificato dall’interno
12
Visibilità degli attributi
Class <nomeclasse> definition. PUBLIC SECTION. DATA: name type string. PRIVATE SECTION. DATA: address type string. CLASS-DATA: count type i. Endclass.
13
Visibilità degli attributi
Se definito nella public section può essere letto/modificato da chiunque (se non specificato con l’opzione READ-ONLY) Se definito nella private section può essere letto/modificato solo dai metodi interni. Un attributo è definito per ogni istanza della classe e può assumere un valore diverso per ogni istanza di detta classe Un attributo statico (CLASS-DATA) vale per tutte le istanze della classe definite a runtime
14
Attributi Count : 2 Nome: Air1 Peso: 30,000 kg Nome: Air2
15
I metodi Sono procedure interne alle classi che determinano il comportamento di un oggetto. Possono accedere a tutti gli attributi della classe d’appartenenza e possono cambiarne il contenuto Hanno un’interfaccia di parametri che li abilitano a ricevere valori e ritornarli alla procedura chiamante.
16
Dichiarazione di metodi
La codifica è la stessa dell’ABAP. Stesso significato e stesso funzionamento. Attraverso il parametro RETURNING si ritorna solo un valore altrimenti si usa CHANGING. Tutti i parametri possono essere definiti opzionali e con un “DEFAULT value” come valore d’inizializzazione. CLASS <classname> DEFINITION. METHODS: <method_name> [ IMPORTING <im_var> TYPE <type> (OPTIONAL) EXPORTING <ex_var> TYPE <type> CHANGING <ch_var> TYPE <type> RETURNING VALUE(<ret_value>) TYPE <type> EXCEPTIONS <exceptions> ] ENDCLASS.
17
Visibilità di metodi Come per gli attributi possono essere definiti come pubblici o privati. Questo determina se possono essere chiamati dall’esterno della classe oppure solo al suo interno. CLASS <classname> DEFINITION. PUBLIC SECTION. METHODS: <method_name> [ IMPORTING <im_var> TYPE <type> EXPORTING <ex_var> TYPE <type> CHANGING <ch_var> TYPE <type> RETURNING VALUE(<ret_value>) TYPE <type> EXCEPTIONS <exceptions> ] PRIVATE SECTION. METHODS: <method_name> …. ENDCLASS.
18
Metodi statici e dinamici
Metodi statici sono definiti a livello di classe. Possono usare solo attributi definiti statici a loro volta. Questo significa che l’oggetto della classe a cui appartengono può non essere creato e possono essere richiamati in qualsiasi momento. Vengono utilizzati per elaborazioni che prescindono dal contesto in cui una classe viene utilizzata (una conversione, ritornare un valore specifico etc. etc.) CLASS <classname> DEFINITION. PUBLIC SECTION. CLASS-METHODS: get_count RETURNING VALUE(re_count) TYPE i. PRIVATE SECTION. CLASS-DATA: count TYPE i. ENDCLASS.
19
Implementazione di metodi
La codifica è la stessa dell’ABAP. Stesso significato e stesso funzionamento. CLASS <classname> IMPLEMENTATION. METHOD <method name>. <ABAP Code> ENDMETHOD. ENDCLASS.
20
Istanziare un oggetto Una classe contiene la generica descrizione di un oggetto. Descrive tutte le caratteristiche comuni all’oggetto in quella classe. Durante l’esecuzione del programma la classe è usata per creare lo specifico oggetto (istanza). Questo processo si chiama istanziamento. Oggetti sono istanziati usando l’istruzione CREATE OBJECT. Durante l’elaborazione viene allocato spazio di memoria per assegnarla all’oggetto.
21
Istanziare un oggetto CREATE OBJECT Classe Oggetto Cl_airplane Nome
Nome: Air2 Peso: 15,000 kg Cl_airplane Nome Peso CREATE OBJECT
22
Referenziare un oggetto
Un’oggetto viene definito con una operazione di “type reference”. L’operazione definisce un puntatore ad un oggetto. Data: airplane1 type ref to cl_airplane. Le sezioni di “definition” e “implementation” relative alla classe cl_airplane vanno definite prima dell’istruzione “type ref”. O successivamente con un istruzione del tipo: class: cl_airplane definition deferred.
23
Creare un oggetto data : airplane1 TYPE REF TO cl_airplane, airplane2 TYPE REF TO cl_airplane. CREATE OBJECT airplane1. CREATE OBJECT airplane2. Vengono create, in memoria, due oggetti distinti: ciascuno con le sue variabili. Se invece aggiungiamo un’istruzione del tipo airplane1 = airplane2 allora abbiamo due oggetti uguali con le stesse variabili per ciascuno dei due
24
Creare un oggetto con variabili
CREATE OBJECT airplane1 EXPORTING nome = “Air1” peso = CREATE OBJECT airplane2 EXPORTING nome = “Air2” peso = Nome: Air2 Peso: 25,000 kg Nome: Air1 Peso: 15,000 kg airplane2 airplane1
25
Utilizzo di oggetti in tabelle
DATA: airplane_table TYPE TABLE OF cl_airplane CREATE OBJECT airplane EXPORTING nome = “Air1” peso = APPEND airplane TO airplane_table. CREATE OBJECT airplane EXPORTING nome = “Air2” peso = Il risultato è due record nella tabella airplane_table e l’oggetto airplane con i valori dell’ultima istruzione “create object”. Con un istruzione del tipo read table airplane_table into airplane index 1. l’oggetto airplane contiene i valori “nome = Air1” e “peso = 15000”.
26
Chiamare i metodi Ciascun oggetto si comporta in un certo modo, determinato dai suoi metodi. Ci sono tre tipi di metodi: Metodi che operano e non passano valori Metodi che passano valori Metodi che passano o cambiano diversi valori Un oggetto che richiede un servizio ad un altro oggetto invia un messaggio per ottenere il servizio. Il messaggio nomina l’operazione da eseguire e l’implementazione di questa operazione è conosciuta come metodo.
27
CALL METHOD <instance>-><instance_method>
Chiamare i metodi Se il metodo fa riferimento ad un’istanza della classe la chiamata avviene con CALL METHOD <instance>-><instance_method> Se il metodo è statico si fa riferimento al nome della classe con CALL METHOD <classname>=><class_method>
28
Chiamare i metodi Ogni metodo può essere chiamato conformemente alla sua definizione: Senza parametri : ref_obj->method() Con un parametro : ref_obj->method( par1 ) Più parametri: ref_obj->method( par1 = val1 par2 = val2)
29
Chiamare i metodi (Ogni metodo può essere chiamato conformemente alla sua definizione): Ritornano un solo parametro (Returning) ret_value = ref_obj->method( .. ) Ritornano diversi parametri call method ref_obj->method exporting parX = valX importing parY = valY changing parZ = valZ
30
Il metodo CONSTRUCTOR Il CONSTRUCTOR (costruttore) è un metodo speciale in una classe. Ciascuna classe ha uno ed un solo metodo costruttore. E’ automaticamente chiamato durante il runtime dall’istruzione CREATE OBJECT Se non è necessario implementarlo, non è obbligatorio definirlo come metodo Se si deve implementare, va definito nella parte PUBLIC. Se durante il runtime si verificano errori l’oggetto non viene creato e lo spazio in memoria non viene occupato.
31
Incapsulamento Il principio dell’incapsulamento è nascondere l’implementazione di una classe ad un altro componente del sistema. L’incapsulamento dell’implementazione riduce la dipendenza del codice da eventi esterni e permette di effettuare modifiche limitandone gli effetti sul altri oggetti.
32
Incapsulamento Nell’esempio ogni modifica nel modo di calcolo del carburante rimasto è trasparente alla classe lcl_client Lcl_client Cl_airplane Tank : lcl_tank Get_fuel_level() : re_level Lcl_tank fuel : i fuel_max : i Re_level = tank->get_fuel_level() Re_level = fuel / fuel_max * 100
33
Ereditarietà Ereditarietà è una relazione dove un classe (sottoclasse) eredità tutte le caratteristiche di un altra classe (superclasse). La sottoclasse può aggiungere nuovi componenti e rimpiazzare metodi ereditati con proprie implementazioni. Nell’esempio le similitudini tra aereo passeggero e cargo sono estratte dalla superclasse aeroplano. Questo significa che i componenti comuni sono definiti/implementati nella superclasse e sono automaticamente presenti nella sottoclasse.
34
Ereditarietà aeroplano -nome -peso -get_fuel_level -get_owner
Aereo passeggeri -posti -uscita emergenza -get_nr_seats Aereo cargo -massimo peso carico -get_cargo
35
Ereditarietà Ereditarietà dovrebbe essere usata per implementare relazioni tra oggetti generici e relative specializzazioni. Vedi ad esempio la classe cl_gui_object e tutte lo sottoclassi derivate , tra cui cl_gui_alv_grid e cl_gui_alv_tree. Ogni superclasse può essere a sua volta sottoclasse di una superclasse. Ereditarietà è una relazione a un solo livello: le sottoclassi sanno quali sono le superclassi dalle quali derivano ma le superclassi non sanno quali sottoclassi hanno derivato
36
Ereditarietà Nella definizione di una sottoclasse si indicano solo le differenze rispetto alla superclasse. Per definizione tutti i metodi e gli attributi della superclasse vengono resi disponibili nella sottoclasse. Componenti comuni sono presenti solo una volta nella superclasse Nuovi componenti nella superclasse sono automaticamente disponibili alla sottoclasse Si riduce la dimensione del codice (“programmare per differenza”)
37
Ereditarietà Sottoclassi sono dipendenti dalle superclassi
Deve possedere dettagliata conoscenza della superclasse per quanto riguarda la ri-definizione ma anche per l’utilizzo dei componenti ereditati (metodi e attributi).
38
Ereditarietà Class cl_airplane definition. public section.
methods: get_fuel_level returning value(re_level) type i. private section. data: name type string, peso type i. endclass. Class cl_cargo_airplane definition inheriting from cl_airplane. methods: get_cargo returning value(re_cargo) type string. data: cargo type string.
39
Ereditarietà e visibilità
Componenti pubblici Visibili a tutti Accesso diretto Componenti protetti Visibili solamente dentro la classe e le sottoclassi Componenti privati Solo visibili nella classe Nessun accesso dall’esteno comprese le sottoclassi L’utilizzo di componnti privati in una superclasse può essere utile per gestire, ad esempio, gli errori. Si possono usare componenti privati senza conoscere o invalidare eventuali sotto classi
40
Ereditarietà e visibilità
Class cl_airplane definition. Public section. methods: Protected section. ….. Private section Endclass.
41
Ereditarietà del costruttore
Il metodo CONSTRUCTOR della superclasse DEVE essere chiamato nel metodo costruttore della sottoclasse. Serve per assicurarsi che l’oggetto sia inizializzato correttamente. La chiamata del tipo: call method super->constructor ….. deve essere fatta all’interno del metodo constructor definito per l’occasione. All’interno del metodo costruttore della sottoclasse potranno essere svolte tutte le ulteriori attività necessarie per la definizione dell’oggetto.
42
Ereditarietà: CREATE OBJECTS
Ci sono due modi per create un oggetto da una sottoclasse con l’istruzione CREATE OBJECTS: Il costruttore è stato definito. In questo caso l’istruzione conterrà i parametri, più o meno obbligatori, definiti per il metodo. Il costruttore non è stato definito. Si risale la gerarchia delle classi fino a trovare la prima superclasse con parametri e si utilizzano con l’istruzione.
43
Ereditarietà: Ridefinizione dei metodi
La ridefinizione dei metodi permette di definire solamente il metodo, con i parametri, nella superclasse. Ogni sottoclasse ereditata dalla superclasse potrà realizzare il codice del metodo proprio specifico. Sviluppa il concetto della superclasse generica e della sottoclasse specifica. Definisco i metodi che servono nella superclasse ed ogni sottoclasse realizzerà il funzionamento del metodo nel modo che ritiene più opportuno.
44
Ereditarietà: polimorfismo
Quando oggetti da differenti classi reagiscono in modo diverso alla stessa chiamata del metodo allora si parla di polimorfismo. Quando un oggetto di una classe riceve un messaggio per eseguire un particolare metodo esso viene eseguito se implementato nella classe di appartenza del metodo. Altrimenti, se ereditato, viene cercato, ed eseguito, il primo metodo nella gerachia delle classi. La chiamata non cambia
45
Ereditarietà: polimorfismo
Utilizzando gli esempi degli aerei se da una classe mezzoditrasporto generica ereditiamo i metodi arrivo() e partenza() nella sottoclasse aereo dovremmo sviluppare maggior complessità rispetto ad una sottoclasse bicicletta. A questo punto, dalla nostra lista di mezzi possiamo prendere qualsiasi mezzo e chiamare arrivo() o partenza() senza doverci più preoccupare di che cos'è l'oggetto che stiamo maneggiando.
46
Ereditarietà: polimorfismo
class cl_mezzo definition. public section. methods: constructor importing nome_mezzo type string, partenza changing mezzo_msg type string, arrivo changing mezzo_msg type string. endclass. class cl_mezzo implementation. Endclass.
47
Ereditarietà: polimorfismo
class cl_bicicletta definition inheriting from cl_mezzo. endclass. class cl_bicicletta implementation. class cl_aereo definition inheriting from cl_mezzo. methods: partenza redefinition. … class cl_aereo implementation. method partenza. endmethod.
48
Ereditarietà: polimorfismo
In una tabella d’oggetti carico tutti gli aerei a disposizione. Quindi richiamo il metodo di ciascun aereo per ottenerne il consumo CREATE OBJECT cargo_plane. APPEND cargo_plane TO plane_list. CREATE OBJECT passenger_plane. APPEND passenger_plane TO plane_list. LOOP AT plane_list INTO plane. tot_fuel = tot_fuel + plane->estimate_fuel_consump(distance). ENDLOOP.
49
Ereditarietà: polimorfismo
Invece di: LOOP AT plane_list INTO plane. CASE plane-category WHEN ‘CARGO’ (codice per ottenere il consumo di carburante) WHEN ‘PASSENGER’ ENDCASE. tot_fuel = tot_fuel + fuel_needed. ENDLOOP.
50
Interfacce - Definizione
Le interfacce consentono di accedere a classe differenti e a metodi differenti, usando gli stessi nomi per tutti. L’interfaccia è una struttura la cui definizione è simile a quella di una classe , ma la cui implementazione viene fatta all’interno delle varie classi a cui viene associata. INTERFACE <nomeinterfaccia>. data: methods: ENDINTERFACE.
51
Interfacce - Definizione
Nella definizione si possono usare tutte le componenti delle classi(metodi,attributi,eventi) ma non si possono usare le varie sezioni di visibiltà (l’interfaccia e’ public per definizione) La parte d’implementazione viene sviluppa nella classe a cui si fa appartenere l’interfaccia.
52
Interfacce - Implementazione
Per implementare un interfaccia questa va prima di tutto dichiarata all’interno della classe a cui si vuole associarla. E va dichiarata nella sezione public. CLASS <nomeclasse> DEFINITION. PUBLIC SECTION. INTERFACES <nomeinterfaccia>. ENDCLASS.
53
Interfacce - Implementazione
I metodi dell’interfaccia vengono definiti nella sezione di implementazione dei metodi della classe. CLASS <nomeclasse> IMPLEMENTATION. METHOD <nomeinterfaccia~nomemetodointerfaccia>. ……. ENDMETHOD. ENDCLASS. Naturalmente se l’interfaccia viene associata anche ad un’altra classe i suoi vari metodi andranno implementati di nuovo all’interno di quest’ultima.
54
Riferimento alle interfacce
All’interno di un programma il riferimento ad un’interfaccia si dichiara in modo simile a quello di una classe. TYPES: <nome_interfaccia> TYPE REF TO <interfaccia>. oppure DATA: <nome_interfaccia> TYPE REF TO <interfaccia>. Similmente per accedere ai metodi si usa: Call method <nomevarinterfaccia>-><nomemetodo>
55
Riferimento alle interfacce
Per collegare una variabile interfaccia ad una classe, in cui in precedenza era stata dichiarata, si deve prima dichiarare una variabile di classe e poi associare le due variabili in questo modo: <nome_var_intefaccia>=<nome_var_classe> In questo modo con l’istruzione Call method <nome_var_interfaccia>-><nome_metodo> si accederà al metodo così come e’ stato implementato dentro quella classe. Per usare lo stesso metodo, ma dichiarato in un’altra classe, sarà sufficiente ripetere l’associazione alla nuova classe.
56
Eventi Per evento s’intende un’operazione che annuncia un cambio di stato ad un oggetto o una classe. Una classe può innescare (o trigger) un evento e, di conseguenza, altre classi attiveranno i componenti (metodi o interfacce) ad esse collegato Innescare un evento ha il seguente effetto: Il programma è interrotto in quel punto Il metodo registrato con l’istruzione SET HANDLER è richiamato Una volta eseguito il metodo (o eventuali altri) il programma riparte.
57
Eventi In fase di definizione si stabilisce quali sono gli eventi:
Definire eventi nella classe (EVENTS, CLASS-EVENTS) Definire eventi o classi da innescare (RAISE EVENT) In fase d’implementazione si definisce il collegamento tra un evento e il metodo da chiamare al suo manifestarsi e le operazioni da svolgere all’avverarsi dell’evento.
58
Eventi Definizione ed implementazione nella classe (METHODS … FOR EVENT … FOR … ) handle_dblclick for event double_click of cl_gui_alv_grid importing e_row e_column con questa istruzione si definisce un metodo da eseguire ogni volta che viene eseguito un doppio click. Al metodo vengono passati due parametri. Definizione dell’oggetto di gestione dell’evento (SET HANDLER) set handler me->handle_dblclick for pri_v_grid. con questa istruzione si stabilisce che sull’oggetto pri_v_grid ad ogni doppio click si chiama il metod handle_dblclick (la notazione me-> sostituisce il nome della classe ).
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.