540 likes | 552 Views
DEV-7: What’s New in Object-Oriented ABL. OpenEdge 10.1C and beyond. Shelley Chase. OpenEdge Architect. Agenda. Overview of Object-oriented ABL 10.1C Features Static behavior and data Dynamic programming Error handling
E N D
DEV-7: What’s New in Object-Oriented ABL OpenEdge 10.1C and beyond Shelley Chase OpenEdge Architect
Agenda Overview of Object-oriented ABL 10.1C Features Static behavior and data Dynamic programming Error handling Data widening, NEW function, reserved keywords, THIS-OBJECT Futures DEV-7 What’s New in the Object-Oriented ABL
What is Object-oriented ABL… Functionality centered around objects Classes encapsulate data and behavior Properties and variables Methods, constructors and destructor Inheritance shares common behavior Interfaces publish a common API Objects are the runtime instance of a class Strong-typing does compile time validation Can be combined with procedures OpenEdge 10.1 Releases DEV-7 What’s New in the Object-Oriented ABL
Benefits of Procedural and OO Programming Procedures and Classes Modular programming Supports reuse of common behavior (super) Maps well to OpenEdge Reference Architecture Classes only Programming errors caught early by compiler Natural integration with modeling tools and other Object-oriented platforms like .NET™ Modern programming model (used at most universities) OpenEdge is committed to both programming models DEV-7 What’s New in the Object-Oriented ABL
Agenda Overview of Object-oriented ABL 10.1C Features Static behavior and data Dynamic programming Error handling Data widening, NEW function, reserved keywords, THIS-OBJECT Futures DEV-7 What’s New in the Object-Oriented ABL
Wouldn’t It Be Great If… … Static Class Members • Classes supported global variables within a session? • You could always get a reference to the same object every time you wanted to… without keeping track of anything? DEV-7 What’s New in the Object-Oriented ABL
A Step Back: Instance Data Always need to NEW an object to access members Unique data segment for each instance Data Data Data objRef = 1012 objRef = 1008 objRef = 1004 Separate copy of data for each instance MyClass Data OpenEdge Runtime DEV-7 What’s New in the Object-Oriented ABL
Instance Data Count = 1 Name = Joe CLASS MyClass: … DEFINE PUBLIC PROPERTY Count AS INT GET. SET. DEFINE PUBLIC PROPERTY Name AS CHARACTER GET. SET. CONSTRUCTOR MyClass ( inName AS CHARACTER ): Name = inName. Count = Count + 1. END CONSTRUCTOR. END CLASS. DEF VAR myClassRef AS CLASS MyClass. myClassRef = NEW CLASS MyClass( “Joe” ). DELETE OBJECT myClassRef. myClassRef = NEW CLASS MyClass( “Tim” ). DELETE OBJECT myClassRef. myClassRef = NEW CLASS MyClass( “Ann” ). DELETE OBJECT myClassRef. Count = 1 Name = Tim Count = 1 Name = Ann DEV-7 What’s New in the Object-Oriented ABL
Classes and Static Data Access to static members do not require a NEW object One global data segment Static Data Static Data Static Data “MyClass:” “MyClass:” “MyClass:” One copy of data for the session MyClass Static Data OpenEdge Runtime DEV-7 What’s New in the Object-Oriented ABL
Static Data Count = 2 Name = Tim Count = 3 Name = Ann Count = 1 Name = Joe CLASS MyClass: … DEFINE PUBLIC STATIC PROPERTY Count AS INT GET. SET. DEFINE PUBLIC STATIC PROPERTY Name AS CHARACTER GET. SET. CONSTRUCTOR MyClass ( inName AS CHARACTER ): Name = inName. Count = Count + 1. END CONSTRUCTOR END CLASS. MyClass:Count = MyClass:Count + 1. MyClass:Name = “Joe”. MyClass:Count = MyClass:Count + 1. MyClass:Name = “Tim”. MyClass:Count = MyClass:Count + 1. MyClass:Name = “Ann”. DEV-7 What’s New in the Object-Oriented ABL
Classes are not Static… • Mix of instance and static members allowed • Static members accessed using class type name • Instance members accessed using object reference • Unqualified references allowed inside class • Static members created before instances • Static constructor runs before instances
ABL Static Data – “Typed” Global Data Definition of static properties and data members Useful for session-wide data Variables, buffers, temp-tables, queries, datasets, data sources Available anywhere in the session Single instance life-cycle controlled by the AVM Access using class type name DEFINE PUBLIC STATIC PROPERTYCountAS INT GET. SET. MESSAGE MyClass:Count. DEV-7 What’s New in the Object-Oriented ABL
ABL Static Constructor Definition of static constructor Useful to initialize static data Only one static constructor per class No arguments or access mode Can access STATIC data of the class Can RUN procedures Can NEW classes (even this one!) Run automatically before any class member access is allowed CONSTRUCTOR STATICMyClass ( ): Count = 0. /* Initialize static counter */ END. DEV-7 What’s New in the Object-Oriented ABL
ABL Static Methods Definition of static methods Useful when instance data is not required Can access STATIC data of the class Can RUN procedures Can NEW classes (even this one!) Available anywhere in the session Access using class type name METHOD STATIC PUBLIC INT DisplayMessage( c AS CHAR ): MESSAGE c VIEW-AS ALERT-BOX. END. MyClass:DisplayMessage( “Statics are cool” ). DEV-7 What’s New in the Object-Oriented ABL
Accessing a Static Class Member /* MyClass class not instantiated */ MESSAGE MyClass:CountVIEW-AS ALERT-BOX. • Access static data member Count • Runtime checks if static class members are loaded; it’s not so MyClass DEV-7 What’s New in the Object-Oriented ABL
Accessing a Static Class Member /* MyClass class not instantiated */ MESSAGE MyClass:CountVIEW-AS ALERT-BOX. • Access static data member Count • Runtime checks if static class members are loaded; it’s not so • Creates static global data segment • ttUsersandCount MyClass STATIC ttUsers Count DEV-7 What’s New in the Object-Oriented ABL
Accessing a Static Class Member /* MyClass class not instantiated */ MESSAGE MyClass:CountVIEW-AS ALERT-BOX. • Access static data member Count • Runtime checks if static class members are loaded; it’s not so • Creates static global data segment • ttUsers andCount • Runs static constructor • Initialize Count andttUsers MyClass STATIC ttUsers = … Count = 0 Joe Tim Ann DEV-7 What’s New in the Object-Oriented ABL
Accessing a Static Class Member /* MyClass class not instantiated */ MESSAGE MyClass:CountVIEW-AS ALERT-BOX. • Access static data member Count • Runtime checks if static class members are loaded; it’s not so • Creates static global data segment • ttUsers andCount • Runs static constructor • Initialize Count andttUsers • Gets value of Count MyClass STATIC ttUsers = … Count = 0 DEV-7 What’s New in the Object-Oriented ABL
New’ing a Class with Static Members DEFINE VAR objRef AS MyClass. objRef= NEW CLASS MyClass( “Joe” ). MyClass • NEW an instance of MyClass • Runtime checks if static class members are loaded; it is. STATIC ttUsers = … Count = 0 DEV-7 What’s New in the Object-Oriented ABL
New’ing a Class with Static Members DEFINE VAR objRefAS MyClass. objRef= NEW CLASS MyClass( “Joe” ). MyClass • NEW an instance of MyClass • Runtime checks if static class members are loaded; it is. • Creates local data segment • name STATIC ttUsers = … Count = 0 Instance name DEV-7 What’s New in the Object-Oriented ABL
New’ing a Class with Static Members DEFINE VAR objRefAS MyClass. objRef= NEW CLASS MyClass( “Joe” ). MyClass • NEW an instance of MyClass • Runtime checks if static class members are loaded; it is. • Creates local data segment • name • Runs instance constructor • Sets instance data name • Increments static data Count STATIC ttUsers = … Count = 1 Instance name = Joe DEV-7 What’s New in the Object-Oriented ABL
New’ing a Class with Static Members DEFINE VAR objRefAS MyClass. objRef= NEW CLASS MyClass( “Joe” ). MyClass • NEW an instance of MyClass • Runtime checks if static class members are loaded; it is. • Creates local data segment • name • Runs instance constructor • Sets instance data name • Increments static data Count • Assigns new instance to object reference STATIC ttUsers = … Count = 1 Instance name = Joe DEV-7 What’s New in the Object-Oriented ABL
New’ing a Class with Static Members DEFINE VAR objRef2 AS MyClass. objRef2= NEW CLASS MyClass( “Tim” ). • NEW an instance of MyClass • Runtime checks if static class members are loaded; it is. • Creates local data segment • name • Runs instance constructor • Sets instance data name • Increments static data Count • Assigns new instance to object reference MyClass STATIC ttUsers = … Count = 2 Instance name = Joe Instance name = Tim DEV-7 What’s New in the Object-Oriented ABL
New’ing a Class with Static Members DEFINE VAR objRef3AS MyClass. objRef3= NEW CLASS MyClass( “Ann” ). • NEW an instance of MyClass • Runtime checks if static class members are loaded; it is. • Creates local data segment • name • Runs instance constructor • Sets instance data name • Increments static data Count • Assigns new instance to object reference MyClass STATIC ttUsers = … Count = 3 Instance name = Ann Instance name = Joe Instance name = Tim DEV-7 What’s New in the Object-Oriented ABL
Singleton Design Pattern Single instance of the class Available from anywhere within the session Loaded on demand Singleton Class • Instance Data members • Avoids any restrictions on static data • Private or protected constructor • Single instance created on demand • Used to return an object reference to a single instance of the class DEV-7 What’s New in the Object-Oriented ABL
Demo – Singleton Class DEV-7 What’s New in the Object-Oriented ABL
Developing with STATIC Members Static class members loaded for the life of the session When a .cls file is changed and re-compiled, the static portion is NOT refreshed Caution during development One active session shared by application and development environment Recompile does not reload any static changes Runtime error for mismatches can occur Session must be restarted Static lifecycle controlled by OpenEdge Runtime DEV-7 What’s New in the Object-Oriented ABL
Developing with STATIC Members Static class members loaded for the life of the session When a .cls file is changed and re-compiled, the static portion is NOT refreshed Caution during development One active session shared by application and development environment Recompile does not reload any static changes Runtime error for mismatches can occur Session must be restarted Static lifecycle controlled by OpenEdge Runtime Use Architect Launch Configurations DEV-7 What’s New in the Object-Oriented ABL
Wouldn’t It Be Great If… You could create an instance of a class passing in a character expression for the class type name at runtime? … DYNAMIC-NEW and DYNAMIC-CAST DEV-7 What’s New in the Object-Oriented ABL
Dynamic Programming in OO ABL DYNAMIC-NEW New a class using a character expression and it’s constructor parameters Object reference is normally a super class DYNAMIC-CAST Cast an object reference to a type using a character expression Full Progress.Lang.Class reflection API still on roadmap OO Strong-typing restricts dynamic programming DEV-7 What’s New in the Object-Oriented ABL
Dynamic Object Creation DYNAMIC-NEW Used to create a new instance Fully qualified character type name USING is not used Common parameter list Returns a strongly-typed object Type checked at runtime BusinessEntity BECustomer BEEmployee METHOD BusinessEntity CreateBE( beType AS CHAR): DEFINE VARIABLE myObj AS BusinessEntity. myObj = DYNAMIC-NEW STRING(“BE” + beType)(parm1, …). RETURN myObj. END METHOD. “BE” + beType DEV-7 What’s New in the Object-Oriented ABL
Dynamic Object Casting BusinessEntity BECustomer BEEmployee • DYNAMIC-CAST • Used to cast an object reference • Fully qualified character type name • USING is not used • Returns a strongly-typed object • Type checked at runtime METHOD BusinessEntity CreateBE( beType AS CHAR): DEFINE VARIABLE myObj AS BusinessEntity. myObj = DYNAMIC-NEW STRING(“BE” + beType)(parm1, …). DYNAMIC-CAST( myObj,STRING(“BE” + beType). RETURN myObj. END METHOD. “BE” + beType “BE” + beType DEV-7 What’s New in the Object-Oriented ABL
ClassFactory Design Pattern Class returns different types of classes Available from anywhere within the session Alternative is a large CASE statement ClassFactory Class • Creates different classes • Common super class for all classes • Common set of constructor parameters • Type name passed in at runtime DEV-7 What’s New in the Object-Oriented ABL
Demo – Class Factory DEV-7 What’s New in the Object-Oriented ABL
Wouldn’t It Be Great If… … Structured Error Handling • ABL had a common way to deal with all errors (system and application)? • An error could be thrown out of the local block / procedure and handled elsewhere? DEV-7 What’s New in the Object-Oriented ABL
Structured Error Handling TRY – CATCH model Based on new built-in error objects Uses existing ABL blocks: DO, REPEAT, … System and application errors treated equally Can be used in classes and procedures Fully integrated with existing error handling NO-ERROR ERROR-STATUS RETURN ERROR DEV-7 What’s New in the Object-Oriented ABL
Error Object Hierarchy Progress.Lang.Object Progress.Lang. Error <<interface>> Progress.Lang.ProError System Errors Application Errors Progress.Lang. AppError Progress.Lang. SysError User-Defined Error Objects Progress.Lang. SoapFaultError DEV-7 What’s New in the Object-Oriented ABL
Error Handling Example: System Error CATCH put on existing FOR EACH block… FOR EACH Customer: FIND Order 1000. /* Fails */ MESSAGE "Never reach here". CATCHerr AS Progress.Lang.SysError: /* Handle error here */ MESSAGE err:GetMessage(1). END CATCH. END. DEV-7 What’s New in the Object-Oriented ABL
Error Handling Example: Application Error CATCH put on existing DO block for running a procedure… DO ON ERROR, UNDO LEAVE: RUN doIt.p. /* RETURNS AppError */ MESSAGE "Never reach here". CATCHerr AS Progress.Lang.AppError: /* Handle error here */ MESSAGE err:ReturnValue. END CATCH. END. DEV-7 What’s New in the Object-Oriented ABL
Wouldn’t It Be Great If… CHARACTER data could be passed for a LONGCHAR NEW could be called as an expression Reserved keywords could be used for class member names THIS-OBJECT could be used to qualify a class member DEV-7 What’s New in the Object-Oriented ABL
Data Widening More flexible parameters passing 10.1B New for 10.1C Strong-typing rules for compatibility Narrower to Wider INTEGER > INT64 > DECIMAL DATE > DATETIME > DATETIME-TZ Narrower(32K) to Wider (1GB) CHARACTER > LONGCHAR DEV-7 What’s New in the Object-Oriented ABL
NEW function NEW statement ( 10.1A ) Similar to an assignment Assigns an object reference to a variable NEW function ( 10.1C ) Object created as part of an expression Returns a reference to new object No need to assign it to an intermediate variable DEV-7 What’s New in the Object-Oriented ABL
Caution Using NEW function Object cleanup Object not assigned to anything – memory leak! Object assigned to something Parameter receiving object responsible for cleanup MESSAGE “Using NEW function” (NEW myObject()):myMethod( ). RUN myProc.p ( INPUT NEW myObject() ). DEV-7 What’s New in the Object-Oriented ABL
Caution Using NEW function Object cleanup Object not assigned to anything – memory leak! Object assigned to something Parameter receiving object responsible for cleanup Garbage Collection planned for 10.2A MESSAGE “Using NEW function” (NEW myObject()):myMethod( ). RUN myProc.p ( INPUT NEW myObject() ). DEV-7 What’s New in the Object-Oriented ABL
Reserved Keywords in Classes ABL Reserved Keywords can be used for: Class names Best to prefix with packages Method names CLASS Form: CONSTRUCTOR PUBLIC Form( ): … METHOD PUBLIC INT Create( ): … DEFINE VAR myClass AS CLASS Form. myClass = New Form( ). myClass:Create( ). DEV-7 What’s New in the Object-Oriented ABL
THIS-OBJECT as a Local Qualifier Qualifier used inside a class when accessing local method, variable, and property names Identifies member as class instance Enables content assist in Architect Required when a local method name is a reserved keyword CLASS Form: CONSTRUCTOR PUBLIC Form( ): THIS-OBJECT:Create( ). END. METHOD PUBLIC INT Create( ): … DEV-7 What’s New in the Object-Oriented ABL
Agenda Overview of Object-oriented ABL 10.1C Features Static behavior and data Dynamic programming Error handling Data widening, NEW function, reserved keywords, THIS-OBJECT Futures DEV-7 What’s New in the Object-Oriented ABL
Under Development This talk includes information about potential future products and/or product enhancements. What I am going to say reflects our current thinking, but the information contained herein is preliminary and subject to change. Any future products we ultimately deliver may be materially different from what is described here. D I S C L A I M E R D I S C L A I M E R DEV-7 What’s New in the Object-Oriented ABL
Expected 10.2A Functionality Properties in Interfaces Defines data portion of contract Advanced GUI New UI Model Access to .NET UI Classes Garbage collection Automatic cleanup Array Enhancements Arrays of Objects Public arrays variables and properties Return value support for methods and functions Vector assignment DEV-7 What’s New in the Object-Oriented ABL
A Glimpse Further into the Roadmap Strongly-typed events Define, Publish and Subscribe in Classes Remote objects Remote access to objects on an AppServer Abstract methods Force implementation in subclasses Inheritance for Interfaces Allow one Interface to inherit from another DEV-7 What’s New in the Object-Oriented ABL