Uploaded by gedag90296

Is Object-Oriented Programmin Structured Programming

advertisement
Is Object-Oriented Programmin g
Structured Programming ?
Bernd Muller
Fachbereich Informati k
Universitat Oldenbur g
D-2900 Oldenbur g
Bernd . Mueller©Informatik .Uni-Oldenburg . D E
Abstrac t
Object-oriented programming is one of today's buzzwords . On the one hand it is a programmin g
paradigm of its own right . On the other hand it is a set of software engineering tools to build mor e
reliable and reusable systems . One other kind of programming style, which has alr eady shown its
power on this field is structured programming .
In this paper we look at the relationship between structured programming and object-oriente d
programming . We give a definition of structured programming and check the object-oriented features
encapsulation, inheritance and messages for compatibility . Two problems arise . The first addresse s
interfaces and inheritance, the second polymorphism and dynamic binding .
We do not end with an answer like yes or no, but try to give a basis for further discussions .
This may help to classify object-oriented programming into a wide range of tools for compute r
programming and computer science . It may also help to abandon the hypothesis that object-oriente d
programming is the solution to all the problems .
1 Introductio n
Much work has been done in the field of comparing Structured Programming (SP) with Object-Oriente d
Programming (OOP), or working out the relationship between both . For example, Grogono [13] promises
that a carefully designed Object-Oriented Programming Language (OOPL) corresponds to the requirements of SP . Blaschek [4] shows how objects can be implemented in Modula-2, the programming languag e
showpiece of SP . Edelson [12] compares Modula-2, C++, and Smalltalk-80 in terms of engineering larg e
software systems effectively, which is the target of both, SP and OOP . Meyer [18] tries to motivate tha t
Object-Oriented Design (OOD) and OOP, especially the language Eiffel [19] meets the demands of S P
and, moreover, goes beyond it .
In this paper we also want to focus on the relationship between SP and OOP, but more detaile d
and comprehensive than done by that previous work . The above papers did not do that, because thei r
primary purpose was completely different . We think the relationship between SP and OOP is not obviou s
enough and it is worth to look about it .
Both, SP and OOP are popular today although SP has a longer history . The current popularity o f
OOP and the connection to SP was pointed out by Rentsch :
"What is object oriented programming? My guess is that object oriented programming wil l
be in the 1980's what structured programming was in the 1970 ' s . Everyone will be in favor of
it . Every manufacturer will promote his products as supporting it . Every manager will pay
lip service to it . Every programmer will practice it (differently) . And no one will know jus t
what it is . " [22]
57
ACM SIGPLAN Notices, Volume 28, No . 9, September 1993
Beside the similarity in popularity SP and OOP are different paradigms', but, with respect to som e
metric or (partial) ordering, is it possible to order them or are they incomparable? We think that SP is a
more general term than OOP . Thus, we have to show that every object-oriented program is a structured
program . Or, to avoid some paranoiac programs, that every concept of OOP meets the demands of SP .
The notion of OOP is used by everyone, as mentioned in the above quotation, but used differently .
The notion of SP is also widely used but has a somewhat more exact definition . Nevertheless, we have t o
define the notions of SP and OOP . In OOP we concentrate on inheritance, encapsulation and the messag e
passing mechanism . We exemplify the relationship of these central object-oriented features to SP .
The rest of this paper is organized as follows . Section 2 introduces the notion of SP, section 3 th e
notion of OOP . Section 4 examines more closely the relationship between both paradigms . The pape r
concludes with section 5 where we summarize our results .
2 Structured Programmin g
SP is a very ol d 2 method to construct computer programs . Founded by [10] many people [29, 30, 15] have
acknowledge this technique and SP has become the state of the art in programming . Nevertheless, we
were not able to find 3 a complete but short enumeration of SP feature (a definition) . We try to do thi s
ourselves, without claiming to be complete . But, to apologize for incompleteness, we think it is enoug h
for our comparison .
The method or paradigm of SP consists (at least) of the following (taken from [11, 10, 30, 15]) :
SP1 The problem is decomposed into independent subproblems (see SP2) . This decomposition recurse s
until the subproblems are atomic and can be solved .
SP2 The subproblems are connected by interfaces, and can therefore be solved independently .
SP3 The structure of (sub)problem(s) and (sub)solution(s) are (almost) identical .
SP4 There is a strong correspondence between the static description of the algorithm and its dynami c
behavior (run-time) .
SP5 It is `easy' (the structures make it easy) to convince one about the correctness of the solution .
SP6 The only allowed control structures are selection, sequence, and repetition .
SP7 There is some block structure (visibility, scope of names )
This definition should be used as is, i . e . some interpretation should be possible . If we do not allo w
this we can stop after SP1 . SP1 is a point of design and mainly constitutes top-down design . On the
other hand OOP favors bottom-up design . Sometimes this is not stated explicitly, but it is agreed upo n
that DOD and OOP is done by composing objects or classes together, which is certainly a bottom up technique ([31] and [20] give an overview of ODD techniques, [17] and [5] are two well establishe d
methods) . We want to compare SP and OOP on the programming language level, not on the desig n
level . Therefore, SP1 is not so much important . But the problem remains . For example to satisfy SP5 ,
i . e . real correctness, formal verification techniques are necessary, which do not exist for SP and OOP ,
at least for complex enough (real life) applications . Therefore keep in mind that the list should act as a
direction, not as a fixed mark .
'We think this is obvious and do not proof it . The above mentioned authors [13, 4, 12, 18) have the same opinion .
Nevertheless, they will may be not agree with the following statements .
2 In terms of computer science .
3 Maybe due to our own inability .
58
3 Object-Oriented Programmin g
OOP is not a new programming paradigm . Simula in the late 60th and Smalltalk in the 70th started th e
development of a new programming paradigm, but did not succeed (in terms of wide spread use) . Th e
software crisis and a new interpretation of OOP, namely not as a programming paradigm, but as a set o f
software engineering concepts to produce better programs, has pushed OOP to the top . Cox [9], Meye r
[17] and many others argue that object-oriented concepts will produce programs which are superior tha n
conventional programs in terms of correctness, robustness, extendibility, reusability, and compatibility .
It is out of the scope of this paper to give a comprehensive introduction into OOP . A very extensiv e
discussion of central object-oriented features can be found in [28] . Almost every textbook on OOP ca n
be used for introductory purposes . Especially to mention is [6], which exemplifies the concepts into fou r
different OOPLs, making clear the distinction between concepts and different implementation of thi s
concepts .
For the discussion in this paper we will concentrate on encapsulation and inheritance`, which Co x
identifies as the central points, and in addition the message passing concept .
3 .1 Encapsulation
In OOP each data-item is joined exclusively with the procedures manipulating this data-item . Th e
attached procedures of a data-item are called methods, all methods together are called interface, the dataitem together with its methods is called object . Because it is not allowed for unattached procedures t o
manipulate an object the data is encapsulated . Therefore the effects of changing data and/or procedure s
is always restricted and easy to localize .
Snyder requires for real encapsulation tha t
" . . .one characteristic of an object-oriented language is whether it permits a designer to defin e
a class such that its instance variables can be renamed without affecting clients ." [23 ]
3 .2 Inheritanc e
Inheritance is a technique which enables the reuse of behavior s of already defined classes (a class is a
template from which objects can be created) in the definition of a new class . Inheritance plays such a n
important role in OOP becaus e
"Inheritance can express relations among behaviors such as classification, specialization, generalization, approximation, and evolution ." [28 ]
Beside this conceptual benefits inheritance helps to avoid the duplication of code and the need fo r
coding from scratch . It is therefore a tool to engineer software in a better way, too .
3 .3 Message passin g
A message is sent to an object and represents a request to perform some action . It is in the responsibility
of the receiver how to react . Thus, it is possible that different objects react differently after receiving th e
same message . While this is a high-level concept which influences design (called responsibility-drivendesign [31]) on the lower level of language implementation there is one more important difference to
conventional procedure calls . Procedure calls are bound early (at compile or link time) to some cod e
fragments, while messages trigger the execution of some code lately (which code to execute is determine d
at run-time) with respect to the above scheme of responsibility .
4 While inheritance is really new, encapsulation is also possible in many other languages but mostly not enforced .
5 And therefore of code .
59
4
Compariso n
There are many problems in comparing SP and OOP or, what we have in mind, to check object-oriente d
features for compatibility with SP . The above remarks about the use of SP1 to SP7 are also valid whe n
using the definitions of encapsulation, inheritance, and messages . [24] and [28], for example, show a wid e
range of possible interpretations . But even if we allow some interpretation of the defined concepts, i s
it enough to compare concepts and paradigms? Is the result of such a comparison satisfactory if th e
concepts are such ideals that there exists no real language implementing it? Therefore, we do not onl y
discuss concepts but also include some existing languages into the discussion . On the side of SP we us e
Modula-2, which is a clear and clean implementation of an imperative language and well suited for SP .
On the side of OOP we have to take into account much more languages, because the market of OOPL s
is much more in change . The chosen OOPLs are Objective-C [9], C++ [25], Eiffel [17, 19] and Modula- 3
[16, 14], the most popular OOPLs in concepts and distribution today .
The three main features of the object-oriented paradigm and the seven items of SP define a table wit h
21 fields . Some of the fields will be empty, because the concerned concepts are orthogonal . Some field s
will need much more attention than others . In the next three sections we try to fill in the columns o f
encapsulation, inheritance and messages step by step and summarize at the end, giving the constructe d
table .
4 .1 Encapsulatio n
Because encapsulation was not newly introduced into the programming methodology by OOP we want t o
discuss it first . SP1 is, as mentioned already, a question of design . Encapsulation is an implementatio n
technique which enforces interfaces (a consequence of SP1, see SP2), but both are not related directly .
SP2 is still on the design or concept level but because of SP3 the demanded interface is mapped directl y
to the implementation . Therefore it is obvious that encapsulation fulfills SP2 . Moreover, if the OO D
phase comes up with a net of communicating objects these can be implemented in accordance to SP3 .
To be fair we cannot help saying that there are some difficulties with object-oriented encapsulatio n
and SP2 and SP3 . Suppose there is an object-oriented car, which breaks down . Is the car able to
repair itself, or is this done by a mechanician? This is the time where SP3 comes into play . If we wan t
to have a model of the real world the mechanician has to do it but this is forbidden by the concep t
of encapsulation . There is a way out in C++, where so-called friend-functions are allowed to acces s
data of objects of different classes . But, to repeat, this hurts the notion of encapsulation s , We thin k
a similar mechanism is necessary in all object-oriented languages, if we want to fulfill SP3 . Truly, i t
hurts encapsulation, but this concept modification is acceptable because a class has to declare his friend s
explicitly. Our world doesn't exist of independent active objects, there are also many objects witch ar e
passively manipulated by other objects .
Encapsulation is compatible with SP4 if we are allowed to interpret SP4 more liberally . SP use s
algorithmic decomposition in the design phase, which yields a description of the algorithm, the one poin t
examined in SP4 . OOD uses object-oriented, i . e . a data-centered kind of decomposition yielding a n
other type of description . If this difference is accepted we can conclude that encapsulated objects reall y
reflects the design of independent agents at the level of implementation .
An observation worth to mention is that object-oriented interfaces have a finer granularity as reache d
by conventional mechanisms . To see this we look at the interface mechanism of Modula-2 . To obtai n
real abstraction (an approximation of ADTs) we have to use opaque types . In the implementation o f
this type the procedures can access all internal data of all elements of this type, while in object-oriente d
languages the access is restricted to the object associated with the procedure, namely the receiver o f
the corresponding message 7 . This difference of accessibility is what we mean with finer granularity o f
interfaces . On the one hand a type has an interface, on the other hand each object (an element of a
6 Many other features of C++ also hurt object-oriented ideas, because C++ was designed to be as efficient as possibl e
and to be upward compatible with C .
'One more time C++ doesn't fit into this scheme, because an object can access attributes of all other objects of th e
same type .
60
type) has its own interface (truly, it is the same interface for all elements of one type, but with regard t o
accessibility each one has its own interface) .
As stated before we do not want to discuss SP5 at a formal level . [10] uses enumerative reasoning ,
mathematical induction and abstraction as three aids in proofing correctness of solutions . Abstractio n
and a better `understanding' of programs are proposed as alternatives to the more formal techniques 8 .
Encapsulation is one of the best possibilities to obtain abstraction and better understanding of programs .
Encapsulation enforces interfaces which are necessary to abstract from implementation . Further, becaus e
the interfaces have to be respected and no work-around is possible side effects will never happen, makin g
programs easier to understand .
SP6 was mainly formulated to avoid unrestricted use of gotos . It of course includes procedure calls ,
which are a kind of sequences . Because encapsulation is a syntactic mechanism to restrict the scop e
of (data) identifiers it is not related to SP6, but strongly addressed by SP7 . SP7 follows the idea tha t
identifiers should be known as local as possible and as global as necessary . Object-oriented encapsulatio n
has the same root but is reduced to data (identifiers) . Classes (or types 9 ) are global, methods too . Bu t
this is one more time founded by different design and philosophy : An object-oriented program is a se t
of objects, each object communicating possibly with each other . Taking for example block nesting fro m
SP7, what is the meaning of nested classes or nested methods ?
Very different from concepts are the OOPLs we are looking at . The reason for this is that they inheri t
from their base languages C and Modula-2 . For example, in C++ you cannot nest functions, becaus e
you cannot in C . In Modula-3 you can because you can in Modula-2 . In Modula-3 it is also possible to
hide identifiers (constants, types, variables, procedures, modules) in a block-oriented manner as you ca n
in Modula-2 1 0
4 .2 Inheritanc e
As mentioned earlier, inheritance can be seen as a conceptual relation and also as a special programmin g
technique . SP1 addresses the first interpretation, which is a question of design and not implementation .
Booch [5] classifies decomposition into algorithmic and object-oriented decomposition, and asserts tha t
SP uses algorithmic decomposition . While this is surely true, SP1 is general enough to allow bot h
interpretations, as well as other kinds of decomposition .
There is also another difference in decomposition, which we will call vertical vs . horizontal decomposition . Algorithmic decomposition yields a tree of tasks [5], where the subtrees of a node are the subproblem s
of the decomposed node problem according to the recursive definition of SP1 . Object-Oriented decomposition yields a flat partition of all concerned objects . After this the process of discovering inheritanc e
begins, yielding a graph of object classes connected by specialization and/or generalization .
Thus both methods end with a hierarchical structure . But with algorithmic decomposition the roo t
represents the problem started with, while with object-oriented decomposition the problem is modelle d
by the interaction of instances of graph nodes .
We have already discussed interfaces (SP2) in the encapsulation section . Inheritance also touches interfaces, because inheritance establishes a new kind of interface, not known in conventional programming .
In OOP objects are distinguished in suppliers and consumers :
"Object-oriented programming is . . . a way for code suppliers to encapsulate functionality fo r
delivering to consumers ." [9] 1 1
Object-oriented interfaces are most often discussed in the literature as external interfaces, i . e . establishin g
a supplier interface consumers can use . Snyder recognized in 1986 that there is also an interface fro m
parent classes to inheriting classes [23], which we will call inheritance interface in the following . If on e
follows the requirements of encapsulation (section 3 .1) it should be allowed to reimplement a class, whil e
can also think of systematic testing or other popular and widly used technique s
"We do not want to differentiate them in this paper, because this would make things much more complicated . [1, 3, 8]
can be used to see the differences .
10 See also the discussion of modules in the next section .
11 For a detailed representation of the analogy to hardware design, where new systems are built by plugging standardize
d
ICs together, see also [9] .
'You
61
keeping the inheritance interface, and all descendants behave well . This is in fact true for all of the popula r
object-oriented languages . But the reason is the non-existence of the inheritance interface . Therefore th e
whole implementation is implicitly the interface 12 and we are not allowed to change it .
In [27] the two kinds of interfaces are called data abstraction and super-abstraction, the first used b y
objects requesting actions from other objects, the second used by classes to inherit implementation . Sinc e
both abstraction concepts are orthogonal Wegner concludes that super-abstraction can be weakened, fo r
example becaus e
"Viewing inherited instance variables as part of an enlarged self also suggests direct accessibility ." [27 ]
While this is true, from a software engineering point of view the loss of interfaces is exactly that dange r
OOP has to fight against .
Looking back to SP2 we can summarize that an object-oriented language has to supply two kind s
of interfaces . External interfaces, supplied by all object-oriented languages (by definition) and an inheritance interface (not supplied by the languages of our scope, nor by any other language known by th e
author) . The implicit definition of an inheritance interface by the implementation surely hurts SP2 i f
the subproblems we want to solve are ancestor-descendant problems, because changes in the ancesto r
influences the descendant .
Inheritance addresses SP3 in a clear way. If we have detected specialization and generalization in th e
object-oriented design process we use inheritance to implement the corresponding classes . Since we us e
an adequate design the solution is naturally developed from this .
SP4 and SP5 are also related to inheritance, but we want to discuss it in the next section, becaus e
this subjects are also strongly connected to message passing .
SP6 is not concerned by inheritance at all . Inheritance is a programming technique for code reuse no t
for control structures
SP7 demands some block structure, which is implemented in conventional languages mainly by procedures and modules . The visibility rules of both can be taken from Figs 1 and 2 . Because procedure s
can also be found in a similar shape in OOPLs (namely methods, differences are mentioned at variou s
places in this paper) we concentrate on modules l 3
Figurel : Procedure visibility rule s
OOP uses classes as the main structuring mechanism . Figure 3 shows the visibility rules . Becaus e
methods build the (implicit) interface of a class (more precisely of objects) and attributes are (implicitly )
hidden, methods are globally visible, as well as objects, and nothing else . Globally visible methods ca n
be used in message expressions and a class can inherit from other classes (see the discussion of differen t
class interfaces above) . One thing not obvious from the figures is a difference in the exploding arrow .
The class arrow is transitive while the method arrow is not (inheritance is transitive, import not) .
The graphical representations of modules and classes are very similar, but, as we have shown, ar e
different . Current research [26] goes one step further . Modules and classes do not have to be unified ,
12We know of the private declaration of members in C++, but nevertheless recompilation is needed if ancestors ar
e
changed . The members are inherited (in memory layout), but cannot be accessed .
'3 Modules were introduced approximately at the same time as SP [21] . Therefore we are not sure if SP7 applies originall y
to modules, but nevertheless we suppose it this way .
62
Figure2 : Module visibility rule s
global methods
inherit
Figure3 : Class visibility rule s
because the underlying notions of import and inheritance are very different . It is out of the scope of
this paper to examine more closely this topic . However, the mentioned research concludes that OOPL s
should offer modules too, which enables us to finish our discussion of SP7 . OOP offers (can offer) method s
(procedure-like structuring) as well as classes and modules, which is enough to satisfy SP7 .
4.3 Messages
Messages are mainly a way to call methods alternatively to normal procedure calls . Additionally, o n
design level they allow responsibility-driven-design already addressed in the last section . However, thi s
question of design is not related to SP1 . Messages are not related to SP2, too . The only connection i s
the possibility to use interfaces to type check message expressions, but this is not the intended use o f
SP2 . Also messages do not violate SP3, because they can be seen as more general procedure calls . Muc h
more attention has to be taken to examine the relationship to SP4 and SP5 .
Because our definition in 3 .3 was a bit superficial we examine some facts more closely now . In definin g
methods it is allowed for different classes to define different methods with the same signature . This i s
known as polymorphism, or more precisely, overloading, a special kind of ad hoc polymorphism [7] .
For example, if a graphical object receives a rotate-message it will execute his appropriate method ,
which rotates itself with a predefined angel, say 90 0 . In contrast a member of a democratic society wil l
change his seat with a colleague if he receives a rotate-message . Another kind of polymorphism, calle d
inclusion polymorphism, is encountered when class circle inherits form class graphical . While rotat e
in graphical has to do a hard job circle can overwrite the inherited rotate leaving the method bod y
empty, because there is nothing to do . In a strongly typed language the compiler can check staticall y
the correctness of rotate message expressions, but it is not determined until run-time which of the bot h
rotates to use, if the receiver is of type graphical . In this case the receiver can be indeed a graphical ,
but also a circle and binding of the message to a method can only be done at run-time, when it is clea r
of which type the receiver actually is .
Polymorphism and dynamic binding enables software reuse, easy maintenance and extensibility, promised by OOP . In comparison to conventional programming we think that a change in binding time doe s
not hurt SP4 . Moreover, the overloading kind of polymorphism is already used in conventional languages, for example binary plus for integers and reals . Inclusion polymorphism is used (should be used) t o
63
specialize behavior in a subclass in a conformant manner, and therefore does not hurt SP4, too .
Problems may arise with SP5, because with polymorphism and dynamic binding it is possibl e
1. to customize libraries, an d
2. to call new code from old code .
The first situation takes place when you declare a library class as an ancestor for a class you are defining .
In verifying your new class the only help you get is a black box saying `the ancestor class is correct' ,
which is not necessarily enough for your work" . To see this you have to recognize the difference from a
procedure call where the procedure is taken from a library and the library is verified already .
The second situation takes place when we expand existing software . For a simple example remember
our graphical objects and a display manager sending rotate messages to such objects . If we additionall y
implement a new subclass of graphical we do not have to change anything in the display manager ( a
great object-oriented benefit), because the new objects understand rotate messages although rotat e
methods can be different . But how to convince one about the correctness of the solution? It is not enoug h
to look at the new code, you have also to look a second time at the display manager (which surely no t
corresponds to ` easy to convince', not necessarily in this example, but the problem exists) . Moreover on e
can state that it is never possible to convince one finally about the correctness of a solution, becaus e
each new class can enforce to restart the process .
We have already expanded SP6 to procedure calls . This is why messages fit nicely into SP6 . Ou r
comparison is closed with the establishment that messages are not related to SP7 .
5
Conclusio n
The results of the comparison is summarized in the following table . The entries of the table are no t
related, fulfills, sd (short for some discrepancies) and violates with the obvious meaning . Because w e
have investigated concepts and existing OOPLs some fields are of the form concept/languages .
SP1
SP2
SP3
SP4
SP5
SP6
SP7
Encapsulation
not related
fulfills
sd / sd
fulfills
fulfills
not related
sd / fulfills
Inheritance
fulfills
sd / violates
fulfills
see message column
see message column
not related
fulfills
Message s
not relate d
not relate d
fulfill s
fulfill s
violates
fulfill s
not related
In this paper we have tried to define the term Structured Programming in a way which enable s
us to test different programming techniques for compatibility . We have examined the central objectoriented features encapsulation, inheritance and messages according to these criteria . When we starte d
this research our feeling was that every object-oriented program is structured in the sense of SP . I t
was surprising that there are two problems with OOP and SP . The first addresses inheritance which i s
propagated to improve system maintenance capabilities, and the relation to interfaces, a demand of SP .
Some authors [23, 27, 28] discovered the need for two kinds of interfaces of OOPL, one for objects sendin g
messages and one for classes inheriting code . There is no general agreement on this in the object-oriente d
community and the existing popular OOPLs do not offer this second kind of interface . Therefore th e
following problem with software maintenance can arise . Suppose a Modula-2 module which has to b e
recoded . Because the definition module remains unchanged you only have to recompile the change d
implementation module and link it with the rest . In an object-oriented system the recoding of a clas s
does not influence clients of the first type, too . But clients of the second type, namely inheriting classes
14
We are no specialists in verification, but we think it is obvious that standard techniques, informal as well as forma l
ones, can not handle such situations, which do not arise with conventional programming . At least they have to be adopte d
for new situations within OOP .
64
are affected and, may be, have to be adopted. Because inheritance is transitive this can cause exponentia l
change in subclasses in the worst case .
The second problem concerns the weak definition "it is `easy' to convince" . It is already hard t o
convince one about the correctness of simple imperative programs . But, as we have shown, it is muc h
more harder if polymorphism and late binding come into play . Although we have taken SP5 from a
historical manifesto [10] we are not sure if such a weak definition is enough to condemn OOP . But, as w e
have shown, there is at least a harder work to do and this work has to be clone repeatedly .
One can disagree with this results at various points . The most important is the definition of SP.
Because SP1 – SP7 are picked up from different papers one can state that they do not constitute SP as a
whole . Another point is the liberal interpretation of the above items . But a more restricted interpretatio n
would make things worse and, may be, show that OOP is very different form SP . Additionally we have
omit some more aspects of OOP, like concurrency, persistency, delegation, subtyping vs . inheritance an d
so on . These make things more complicated and should be tackled in some future work .
Remark : It turns out that the two problems are caused by two object-oriented concepts or possibilities ,
namely inheritance and the possibility to call new code from old code . A programmer is free to decid e
to use an OOPL and also the inherently connected problems if he wants to benefit from the undoubte d
great advantages of OOP .
References
[ 1 ] Pierre America . Issues in the Design of a Parallel Object-Oriented Language . In [2], 1989 .
[2 ] Pierre America and Jan Rutten . A Parallel Object-Oriented Language : Design and Semantic Foundations . PhD Thesis, University of Amsterdam, 1989 .
[3 ] Pierre America and Frank van der Linden . A Parallel Object-Oriented Language with Inheritance an d
Subtyping . In Proc . OOPSLA/ECOOP ' 90, Conference on Object-Oriented Programming Systems ,
Languages and Applications ; European Conference on Object-Oriented Programming, 1990 .
[4 ] Gunther Blaschek . Implementation of Objects in Modula-2 . Structured Programming, 10 :147-155 ,
1989 .
[5 ] Grady Booch . Object Oriented Design with Applications . Benjamin/Cummings, 1991 .
[ 6 ] Timothy Budd . An Introduction to Object-Oriented Programming . Addison-Wesley, 1991 .
[ 7 ] Luca Cardelli and Peter Wegner . On Understanding Types, Data Abstraction, and Polymorphism .
ACM Computing Surveys, 17(4) :471-522, December 1985 .
[ 8] William R . Cook, Walter L . Hill, and Peter S . Canning . Inheritance Is Not Subtyping . In Proc 7th.
Symposium on Principles of Programming Languages . ACM Press, January 1990 .
[ 9] Brad J . Cox . Object Oriented Programming - An Evolutionary Approach . Addison-Wesley, 1986 .
[10] 0 . J . Dahl, E . W . Dijkstra, and C . A . R . Hoare . Structured Programming . Academic Press, 1972 .
[11] Edsger W . Dijkstra . Go To Statement Considererd Harmful .
11(3) :147-148, March 1968 .
Communications of the ACM ,
[12] Daniel R . Edelson . How Objective Mechanisms Facilitate the Development of Large Software System s
in Three Programming Languages . SIGPLAN Notices, 22(9), September 1987 .
[13] Peter Grogono . Issues in the Design of an Object-Oriented Programming Language . Structure d
Programming, 12 :1–15, 1991 .
[14] Samuel P . Harbison . Modula-3 . Prentice Hall, New Jersey, 1992 .
65
[15] Joan K. Huges and Jay I. Michtom. A Structured Apporach to Programming. Prentice-Hall, 1977.
[16] Luca Cardelli and James Donahue and Lucille Glassman and Mick Jordan and Bill Kalsow and Greg
Nelson. Modula-3 Report (revised). Research Report 52, Digital Equipment Corporation, Systems
Research Center, November 1989.
[17] Bertrand Meyer. Object-oriented Software Construction. Prentice Hall, 1988.
[18] Bertrand Meyer. From Structured Programming to Object-Oriented Design: The Road to Eiffel.
Structured Programming, 1:19-39, 1989.
[19] Bertrand Meyer. Eiffel: The Language and the Environment. Prentice Hall, 1990.
[20] David E. Monarchi and Gretchen I. Puhr. A Research Typology for Object-Orented Analysis and
Design. Communications of the ACM, 35(9), 1992.
[21] D.L. Parnas. On the criteria to be used in decomposing systems into modules. Communications of
the ACM, 15(12):1053-1058, 1972.
[22] Tim Rentseh. Object Oriented Programming. SIGPLAN Notices, 17(9), September 1982.
[23] Alan Snyder. Encapsulation and Inheritance in Object-Oriented Programming Languages. In Norman Meyrowitz, editor, Proc. OOPSLA '86, Conference on Object-Oriented Programming Systems,
Languages and Applications, Portland, OR, September 1986. ACM.
[24] M. Stefik and D.G. Bobrow. Object-Oriented Programming: Themes and Variations. AI-Magazine,
6(4):40-62, 1986.
[25] Bjarne Stroustrup. The C++ Programming Language Second Edition. Addison-Wesley, Reading,
1991.
[26] Clemens A. Szyperski. Import is Not Inheritance - - Why We Need Both: Modules and Classes. In
O. Lehrmann Madsen, editor, Proc. ECOOP'92, European Conference on Object-Oriented Programming, LNCS 615, Utrecht, The Netherlands, June/July 1992. Springer.
[27] Peter Wegner. Concepts and Paradigms of Object-Oriented Programming. OOPS Messenger, 1(1),
August 1990.
[28] Peter Wegner. The Object-Oriented Classification Paradigm. In Bruce Shriver and Peter Wegner,
editors, Research Directions in Object-Oriented Programming. MIT Press, Cambridge, MA, 1991.
[29] Niclaus Wirth. Program Development by Stepwise Refinement. Communications of the ACM, 14(4),
1971.
[30] Niklaus Wirth. Systematic Programming. Prentice-Hall, 1973.
[31] Rebecca J. Wirts-Broek and Ralph E. Johnson. Surveying current Research in Object-Oriented
Design. Communications of the ACM, 33(9), 1990.
66
Download