The architecture of Eiffel software 3.1 OVERVIEW classes clusters systems

Similar documents
Concept as a Generalization of Class and Principles of the Concept-Oriented Programming

2.2 Syntax Definition

COSC 3311 Software Design Report 2: XML Translation On the Design of the System Gunnar Gotshalks

AADL Graphical Editor Design

Joint Entity Resolution

d-file Language Reference Manual

Sub- PPL Unit-I Class-SE Comp


IEEE LANGUAGE REFERENCE MANUAL Std P1076a /D3

About the Tutorial. Audience. Prerequisites. Copyright & Disclaimer. Compiler Design

Appendix: Generic PbO programming language extension

Programming Languages Third Edition

UNIT V SYSTEM SOFTWARE TOOLS

PREPARING FOR PRELIM 2

Fundamentals of Programming Languages. PL quality factors Lecture 01 sl. dr. ing. Ciprian-Bogdan Chirila

This section provides some reminders and some terminology with which you might not be familiar.

Introduction to IRQA 4

Proofwriting Checklist

SOME TYPES AND USES OF DATA MODELS

What are the characteristics of Object Oriented programming language?

Chapter 4 Defining Classes I

SOFTWARE ENGINEERING Prof.N.L.Sarda Computer Science & Engineering IIT Bombay. Lecture #10 Process Modelling DFD, Function Decomp (Part 2)

Object-Oriented Design

Spell Checker for EiffelStudio

JOURNAL OF OBJECT TECHNOLOGY

6.001 Notes: Section 6.1

ADVANCED LINK AND ASSOCIATION CONCEPTS

A Tutorial on Agent Based Software Engineering

Einführung in die Programmierung Introduction to Programming

11. a b c d e. 12. a b c d e. 13. a b c d e. 14. a b c d e. 15. a b c d e

Language Basics. /* The NUMBER GAME - User tries to guess a number between 1 and 10 */ /* Generate a random number between 1 and 10 */

UNIVERSITY OF CALIFORNIA Department of Electrical Engineering and Computer Sciences Computer Science Division. P. N. Hilfinger

Part I Logic programming paradigm

Teiid Designer User Guide 7.5.0

CS /534 Compiler Construction University of Massachusetts Lowell. NOTHING: A Language for Practice Implementation

Chapter 1: Distributed Information Systems

Semantic Web. Ontology Pattern. Gerd Gröner, Matthias Thimm. Institute for Web Science and Technologies (WeST) University of Koblenz-Landau

Object-Oriented Software Construction

Computer Science 4U Unit 1. Programming Concepts and Skills Modular Design

Framework for Design of Dynamic Programming Algorithms

Sardar Vallabhbhai Patel Institute of Technology (SVIT), Vasad M.C.A. Department COSMOS LECTURE SERIES ( ) (ODD) Code Optimization

Inheritance Metrics: What do they Measure?

Gustavo Alonso, ETH Zürich. Web services: Concepts, Architectures and Applications - Chapter 1 2

RSL Reference Manual

Equations and Functions, Variables and Expressions

COSC 2P95. Procedural Abstraction. Week 3. Brock University. Brock University (Week 3) Procedural Abstraction 1 / 26

Lecture 5: Declarative Programming. The Declarative Kernel Language Machine. September 12th, 2011

arxiv: v1 [cs.se] 17 Aug 2016

1. Lexical Analysis Phase

The PCAT Programming Language Reference Manual

Modules: Contexts of Template Instantiations and Name Lookup Gabriel Dos Reis Microsoft

High Performance Computing Prof. Matthew Jacob Department of Computer Science and Automation Indian Institute of Science, Bangalore

Compiler Theory. (Semantic Analysis and Run-Time Environments)

Design by Contract in Eiffel

Spemmet - A Tool for Modeling Software Processes with SPEM

1 Lexical Considerations

Modelica Change Proposal MCP-0019 Flattening (In Development) Proposed Changes to the Modelica Language Specification Version 3.

Decaf Language Reference Manual

COMPILER CONSTRUCTION LAB 2 THE SYMBOL TABLE. Tutorial 2 LABS. PHASES OF A COMPILER Source Program. Lab 2 Symbol table

v. T_visit (Current) t.accept (v) CLIENT t v The Visitor pattern

Wrapping a complex C++ library for Eiffel. FINAL REPORT July 1 st, 2005

Let s briefly review important EER inheritance concepts

Text Search & Auto Coding

Chapter 1: Object-Oriented Programming Using C++

Common Lisp Object System Specification. 1. Programmer Interface Concepts

The Procedure Abstraction

Figure 4.1: The evolution of a rooted tree.

CSE Theory of Computing Fall 2017 Project 1-SAT Solving

One of the most important areas where quantifier logic is used is formal specification of computer programs.

High Level Command Language (HLCL) Reference Manual

Anatomy of a Compiler. Overview of Semantic Analysis. The Compiler So Far. Why a Separate Semantic Analysis?

Absolute C++ Walter Savitch

Compiler construction

Basic concepts. Chapter Toplevel loop

Lecture 13: Introduction to inheritance and genericity

COMP-421 Compiler Design. Presented by Dr Ioanna Dionysiou

PIC 10A Objects/Classes

Lecture 14: More Inheritance & Genericity

Object-Oriented Design

CPS122 Lecture: From Python to Java last revised January 4, Objectives:

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 19 Introduction to C++


NOTES ON OBJECT-ORIENTED MODELING AND DESIGN

3.8 Separate Compilation

5/9/2014. Recall the design process. Lecture 1. Establishing the overall structureof a software system. Topics covered

Tail Calls. CMSC 330: Organization of Programming Languages. Tail Recursion. Tail Recursion (cont d) Names and Binding. Tail Recursion (cont d)

This book is licensed under a Creative Commons Attribution 3.0 License

CS5412: TRANSACTIONS (I)

Intro to Haskell Notes: Part 5

GBIL: Generic Binary Instrumentation Language. Language Reference Manual. By: Andrew Calvano. COMS W4115 Fall 2015 CVN

1 Executive Overview The Benefits and Objectives of BPDM

Programming Languages Third Edition. Chapter 7 Basic Semantics

The SPL Programming Language Reference Manual

Multiple & Repeated Inheritance

Intro to: Design Principles

CS112 Lecture: Defining Classes. 1. To describe the process of defining an instantiable class

Chapter 10 Introduction to Classes

Agents are not for the beginning Eiffel user. If this is your first reading, you should most likely skip this chapter.

BON Business Object Notation Based on slides by Prof. Paige

Inheritance (Chapter 7)

Transcription:

3 Draft 5.02.00-0, 15 August 2005 (Santa Barbara). Extracted from ongoing work on future third edition of Eiffel: The Language. Copyright Bertrand Meyer 1986-2005. Access restricted to purchasers of the first or second printing (Prentice Hall, 1991). Do not reproduce or distribute. The architecture of Eiffel software 3.1 OVERVIEW The constituents of Eiffel software are called classes. To keep your classes and your development organized, it is convenient to group classes into clusters. By combining classes from one or more clusters, you may build executable systems. These three concepts provide the basis for structuring Eiffel software: Aclass is a modular unit. Acluster is a logical grouping of classes. Asystem results from the assembly of one or more classes to produce an executable unit. Of these, only class, describing the basic building blocks, corresponds directly to a construct of the language. To build clusters and systems out of classes, you will use not a language mechanism, but tools of the supporting environment. Clusters provide an intermediate level between classes and systems, indispensable as soon as your systems grow beyond the trivial: At one extreme, a cluster may be a simple group of a few classes. At the other end, a system as a whole is simply a cluster that you have made executable (by selecting a root class and a root procedure). In-between, a cluster may be a library consisting of several subclusters, or an existing system that you wish to integrate as a subcluster into a larger system. Clusters also serve to store and group classes using the facilities of the underlying operating system, such as files, folders and directories. After the basic definitions, the language description will concentrate on classes, indeed the most important concept in the Eiffel method, which views software construction as an industrial production activity: combining components, not writing one-of-a-kind applications. The present chapter introduces the overall structure of Eiffel software by discussing in turn the notions of class, system and cluster.

106 THE ARCHITECTURE OF EIFFEL SOFTWARE 3.2 3.2 CLASSES Classes are not just the modular units of software decomposition: they also serve as a basis for the types of Eiffel. This dual view is essential to understanding the notion of class and, more generally, the principles of object-oriented software construction: As a decomposition unit, a class is a module, that is to say a group of related services packaged together into a named unit. As a type, a class is the description of similar run-time data elements, or objects, called the instances of the class. Although these two roles may at first seem rather different, it is in fact useful to support them through a single concept the class on the basis of an important observation (the starting point of the theory of Abstract Data Types): a good way of describing a set of similar objects without describing their implementation is to list the operations applicable to them. But then if the objects are all instances of the same class, we can define that class, viewed as a module, so that the services it offers are precisely the operations available on the instances of the class, viewed as a type. This identification of services on modules with operations on instances is what makes it possible to merge the module and type views into the single concept of class. The features of a class are these services-operations. For example, a document processing system could have classes such as DOCUMENT, PARAGRAPH, FONT, TEXT_DISPLAY. These are the modular units of the system; their texts can be processed by an Eiffel language processing tool, such as a compiler. They also describe possible run-time objects: documents, paragraphs, fonts, displayable views of text. Systems that include the given classes will be able to create such objects, modify them, and access their properties. Each of these classes will contain features; for example, PARAGRAPH may include features indent, describing an operation that indents a paragraph, and line_count, to determine the number of lines of a paragraph. To create an instance of a class, you may use a creation instruction; a typical form is create x.cp (...) where x is the name of the entity that will denote the newly created object, and cp is one of the features of the class, which must have been designated as a creation procedure. This creates an object, makes it accessible through the name x, and applies cp to initialize it. For example you might create an instance of class DOCUMENT through create new_text.make ("Isabelle", 250) Object-Oriented Software Construction discusses the practical and theoretical roles of classes. Chapter 19 explains the precise nature of objects. Chapter 20.

3.3 CLASS TEXTS AND CLASS NAMES 107 assuming DOCUMENT has a creation procedure make with two arguments: a string for the author s name, an integer for the expected number of pages. A bit of more precise terminology is useful here. An instance of a class C resulting from a creation instruction on a target of the corresponding type is called a direct instance of C; in the last example, new_text will be attached to a direct instance of DOCUMENT. The reason for this term is that with the introduction of inheritance we will consider direct instances of proper descendants of C also as instances (not direct) of C. 3.3 CLASS TEXTS AND CLASS NAMES Every class has a class name, such as DOCUMENT or PARAGRAPH, and a class text describing the features of the class and its other properties. As you know, letter case is not significant in identifiers, so that you can write a class name as document if you really want to. But this is strongly discouraged. The standard style is to write all class names using their upper names, such as DOCUMENT. When you want to display a class in EiffelStudio, you may type its name in any mix of lower and upper case (lower case is usually more convenient); the tools will display the upper name. The classes of a system must all, as discussed below, have different names. 3.4 CLUSTERS As the number of classes in your systems grows, you will need to arrange these classes into groups, called clusters. Clusters correspond to the major divisions of a system. For example, a compiling system may include a lexical cluster, a parsing cluster, a semantic analysis cluster, an optimization cluster, a generation cluster. A cluster may encompass a library, such as EiffelBase or EiffelVision; or it may be an application cluster, encompassing a logically significant subset of a system s specific classes. The figure on the next page illustrates a typical system structure as a set of layers, each representing a cluster. Every cluster of this example except KERNEL relies on others through pillars, representing the dependency relations, client and inheritance, between the clusters classes. The lower clusters, which normally should be built first, provide the basic capabilities; the higher clusters are more specialized, including APPLICATION which is assumed to cover the application-specific facilities of the system. In practice, of course, a system may include several application clusters. Chapter4presentsthe structure of class texts. Appendix 34 presents style rules. The upper name is the name all in upper case. See TEXTUAL CONVENTIONS, 2.13, page 101. Class Name rule, page 110. The analogy with a physical construction works only to a point; theauthorandpublisher decline any responsibilityshouldyoubuildyour house with the architecture shown.

108 THE ARCHITECTURE OF EIFFEL SOFTWARE 3.4 APPLICATION A possible cluster structure EIFFEL- MEDIA USER INTERFACE EIFFELVISION Here some of the clusters are Eiffel Software Libraries. In each cluster, some classes are shown, with possible inheritance (singlearrow)andclient (double arrow) links. WEL EIFFELBASE KERNEL You may nest clusters; a cluster included in another is called a subcluster. So we may represent a structure of classes and clusters as a tree, as shown at the top of the facing page. With this structure, a system as a whole is a cluster; a library is a cluster; and if you want to embed an existing system (itself having such a nested structure) as a subsystem in a larger system, you ll make it one of its subclusters. Such arbitrary nesting is part of the Eiffel method s support for software reuse and composition: It is useful to define these notions precisely: Cluster, subcluster, contains directly, contains A cluster is a collection of classes, (recursively) other clusters called its subclusters, or both. The cluster is said to contain directly these classes and subclusters. A cluster contains a class C if it contains directly either C or a cluster that (recursively) contains C. In the presence of subclusters, several clusters may contain a class, but exactly one contains it directly.

3.4 CLUSTERS 109 x1 Clusters, subclusters and classes x2 x3 Internal cluster Terminal cluster Class In the figure clusters x1, x2 and x3 all contain class C; the one that contains C directly is x3. These observations lead us to define two kinds of cluster: Terminal cluster, internal cluster A cluster is terminal if it contains directly at least one class. A cluster is internal if it contains at least one subcluster. C From these definitions, it is possible for a cluster to be both terminal and internal. This is not the recommended style, however; the methodological advice is to keep the two cases separate, so that terminal clusters will contain only classes and internal clusters will contain directly only subclusters. This is the case in the example of the last figure. Beyond this advice, there is no absolute rule on how to group classes into clusters. It is usually wise to observe the following informal criteria: The classes in a cluster should be conceptually related. In most cases, the number of classes in a terminal cluster should not exceed 20. You should consider splitting a terminal cluster into subclusters if it reaches that size, unless you feel that the classes are strongly connected and the cluster has a flat structure with no obvious criterion for splitting it. Cycles in the client relation should, in general, only involve classes that all belong to the same terminal cluster, avoiding cases in which A is a client of B and B a client of A with A and B in different clusters. For any terminal cluster, there should be at least one person who understands the cluster in its entirety. Client is a relation between classes, studied in chapter 7. Cycles in the relation areexplicitlypermitted; see SIMPLE CLI- ENTS, 7.4, page 189.

110 THE ARCHITECTURE OF EIFFEL SOFTWARE 3.5 Do not look, however, for a cluster construct in Eiffel. The highest-level construct is the class; clusters, although essential for organizing Eiffel software and managing its development, do not require language support. This is because such support would in most cases be redundant with the facilities provided by operating systems. If, as may be expected, classes are kept in files, then clusters will use the operating system mechanisms available to support the grouping of related files: folders (the Windows/ Macintosh term) and directories (Unix/Linux). If, as suggested above, you make a clear separation between terminal and internal clusters, then some cluster folders will only contain class files, and the others will only contain subfolders. In the figure on the preceding page, squares then represent folders and the circles represent class files. 3.5 SYSTEMS Eiffel tools, unlike the Eiffel language, should support clusters. The notion of cluster is also prominent in the Lace control language. Lace is a control language for assembling, compiling and executing Eiffel systems, covered by appendix B. By themselves, classes are only building blocks. To obtain an executable software element, you must assemble one or more classes into a system and designate one of them as the root. Here are the precise definitions. We start with a universe of classes: Universe A universe is a set of classes. The universe provides a reference from which to draw classes of interest for a particular system. Any Eiffel environment will provide a way to specify a universe. For example, in the EiffelStudio environment, you may define a universe by specifying (through the control language Lace, or through the graphical interface) a set of directories (folders), each defining a cluster. The cluster is a set of classes; by default, any file in that directory with a name ending with.e for example, your_class.e, called a class file, is expected to contain an Eiffel class. The class texts contained in the class files of the specified clusters then make up the universe. A strong requirement constrains the names of classes in a universe: Class Name rule VSCN It is valid for a universe to include a class if and only if no other class of the universe has the same upper name.

3.5 SYSTEMS 111 Eiffel expressly does not include a notion of namespace as present in some other languages. Experience with these mechanisms shows that they suffer from two limitations: They only push forward the problem of class name clashes, turning it into a problem of namespace clashes. Even more seriously, they tie a class to a particular context, making it impossible to reorganize ( refactor ) the software later without breaking existing code, and hence defeating some of the principal benefits of object technology and modern software engineering. Name clashes, in the current Eiffel view, should be handled by tools of the development environment, enabling application writers to combine classes from many different sources, some possibly with clashing names, and resolving these clashes automatically (with the possibility of registering user preferences and remembering them from one release of an acquired external set of classes to the next) while maintaining clarity, reusability and extendibility. The preceding validity rule leads to the rule giving the meaning of a class name: Class name semantics A Class_name C appearing in the text of a class D denotes the class called C in the enclosing universe. As usual, the semantic rule only makes sense if the validity rule holds. A system will be drawn from a universe; to do this we need to designate a particular type and a particular procedure as roots : System, root type name, root procedure name A system is defined by the combination of: 1 A universe. 2 A type name, called the root type name. 3 A feature name, called the root procedure name. The names that you choose for root type and root procedure should correspond to suitable types and procedures in the system. To state this rule we need a notion of dependency between types: Type dependency A type T depends on a type R if any of the following holds: 1 Ris a parent of the base class C of T. 2 Tis a client of R. 3 (Recursively) there is a type S such that T depends on S and S depends on R.

112 THE ARCHITECTURE OF EIFFEL SOFTWARE 3.5 This states that C depends on A if it is connected to A directly or indirectly through some combination of the basic relations between types and classes inheritance and client studied later. Case 1 relies on the property that every type derives from a class, called its base class ; for example a generically derived type such as LIST [INTEGER] has base class LIST. Case 3 gives us indirect forms of dependency, derived from the other cases. This makes it possible to define what s a proper choice of root type: Root Type rule VSRT It is valid to designate a type TN as root type of a system of universe U if and only if it satisfies the following conditions: 1 TN is the name of a stand-alone type T. 2 Tonly involves classes in U. 3 T s base class is not deferred. 4 The base class of any type on which T depends is in U. These conditions make it possible to create the root object: A type is stand-alone if it only involves class names; this excludes anchored types (like some_entity) and formal generic parameters, which only mean something in the context of a particular class text. Clearly, if we want to use a type as root for a system, it must have an absolute meaning, independent of any specific context. Stand-alone type is defined at the end of the discussion of types. A deferred class is not fully implemented, and so cannot have any direct instances. It wouldn t work as base class here, since the very purpose of a root type is to be instantiated, as the first event of system execution. To be able to assemble the system, we must ensure that any class to which the root refers directly or indirectly is also part of the universe. In condition 2, a type TN involves a class C if it is defined in terms of C, meaning that C is the base class of TN or of any of its generic parameters: U [V, X [Y, Z]] involves U, V, X, Y and Z. A non-generic class T used as a type involves only itself. To complement the conditions on the root type we need one on the root procedure (the procedure that will start the system s execution): Root Procedure rule VSRP It is valid to specify a name pn as root procedure name for a system S if and only if it satisfies the following conditions: 1 pn is the name of a creation procedure p of S s root type. 2 p has no formal argument. 3 p is precondition-free. Inheritance: chapter 6; client: chapter 7 (general definition on page 188); base class: chapter 11. DEFERRED FEATURES, 10.11, page 266 Types and classes involved in a type, page 335.

3.5 SYSTEMS 113 A routine is precondition-free (condition 3) if it has no precondition, or a precondition that evaluates to true. A routine can impose preconditions on its callers if these callers are other routines; but it makes no sense to impose a precondition on the external agent (person, hardware device, other program...) that triggers an entire system execution, since there is no way to ascertain that such an agent, beyond the system s control, will observe the precondition. Hence the last condition of the rule. Regarding condition 1, note that a non-deferred class that doesn t explicitly list any creation procedures is understood to have a single one, procedure default_create, which does nothing by default but may be redefined in any class to carry out specific initializations. Another condition on the root procedure is that it must be effective (nondeferred): a deferred procedure has no implementation, and hence cannot be used to start system execution. But we don t need such a condition in the Root Procedure rule, because it follows from the Root Class rule: if the root class contained a deferred procedure, it would itself have to be declared as deferred (as a result of a rule to be seen in a later chapter), and we have already precluded that through condition 3 of the Root Class rule. Thanks to the Root Type and Root Procedure rules we no longer have to talk about type and procedure names, but can directly refer to the root type, the root procedure and the root class of a system: Root type, root procedure, root class In a system S of root type name TN and root procedure name pn, the root type is the type of name TN, the root class is the base class of that root type, and the root procedure is the procedure of name pn in that class. OMITTING THE CREATION PROCE- DURE, 20.4, page 519. Class Header rule, page 126. Any language processing tool used to assemble and execute systems must enable you to perform the following tasks: 1 Selecting a root class. 2 If the root class has two or more creation procedures, selecting one of them the root procedure for the system s execution. Techniques to perform these selections fall beyond the scope of Eiffel proper, relying instead on tools of the environment. One possibility is to use Lace (Language for Assembling Classes in Eiffel), a simple Eiffel-like notation for specifying how to build and process a system. You may find a detailed description of Lace in an appendix. Appendix B.

114 THE ARCHITECTURE OF EIFFEL SOFTWARE 3.5 The root type and root procedure are needed to execute the system: System execution To execute a system on a machine means to cause the machine to apply a creation instruction to the system s root type. If a routine is a creation procedure of a type used as root of a system, its execution will usually create other objects and call other features on these objects. In other words, the execution of any system is a chain of explosions creations and calls each one firing off the next, and the root procedure is the spark that detonates the first step.