home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / object / 3183 < prev    next >
Encoding:
Internet Message Format  |  1992-08-12  |  8.1 KB

  1. Path: sparky!uunet!mcsun!uknet!gdt!aber!aberfa!pcg
  2. From: pcg@aber.ac.uk (Piercarlo Grandi)
  3. Newsgroups: comp.object
  4. Subject: Re: O.M() versus M(O) notation
  5. Message-ID: <PCG.92Aug12205741@aberdb.aber.ac.uk>
  6. Date: 12 Aug 92 20:57:41 GMT
  7. References: <1992Aug5.162329.22871@ucunix.san.uc.edu> <PCG.92Aug9190327@aberdb.aber.ac.uk>
  8.     <803mb#d.objsys@netcom.com>
  9. Sender: news@aber.ac.uk (USENET news service)
  10. Reply-To: pcg@aber.ac.uk (Piercarlo Grandi)
  11. Organization: Coleg Prifysgol Cymru
  12. Lines: 166
  13. In-Reply-To: objsys@netcom.com's message of 12 Aug 92 00: 33:51 GMT
  14. Nntp-Posting-Host: aberdb
  15.  
  16. On 12 Aug 92 00:33:51 GMT, objsys@netcom.com (Bob Hathaway) said:
  17.  
  18. objsys> I would argue strongly for including some form of constraints
  19. objsys> (in addition to behaviour and/or members) within a type
  20. objsys> definition.
  21.  
  22. Well, I can agree with the sentiment here, but probably the way you
  23. express it is literally taken a bit incongruous. There is, I am afraid,
  24. the usual fuzziness as to what the word "type" is intended to mean: a
  25. denotation, an implementation, a declaration?
  26.  
  27. Assuming that you refer to the latter two meaning: well, a type/class
  28. declaration usually consists of:
  29.  
  30. * (implictly) defining construction and deconstruction functions for
  31.   values of that type via type operators; e.g.
  32.  
  33.     struct complex { float re,im; }
  34.  
  35.   defines a constructor function (struct complex) and two deconstruction
  36.   functions (complex::re, complex::im). The type operator here is
  37.   'struct'. In most languages type operators are strictly compile time, in
  38.   some (EL/1 most notably) they are run time too.
  39.  
  40. * (explictly) defining manipulation functions over the values of the
  41.   type, that use the deconstruction interface defined in the declaration.
  42.  
  43. Now the "constraints" on the type you are talking about are really pre
  44. and post assertions, snippets of specification, in the implicit or
  45. explicitly defined operation on values of that type.
  46.  
  47. Decorating function interfaces and implementations with assertion is a
  48. very useful technology, whether this be for the purpose of more
  49. completely describing a type to a human or mechanical reader:
  50.  
  51. objsys> [ ... ] we have a type in mind and must intelligently check to
  52. objsys> see if various objects can satisfy the description.  There is
  53. objsys> therefore a knowledge base or per-object knowledge to help
  54. objsys> insure correctness and to avoid obvious errors.
  55.  
  56. Unfortunately:
  57.  
  58. pcg> In cases where they they are needed, writing a specification and
  59. pcg> getting it right is a hard job.
  60.  
  61. pcg> How so?  I don't see that its any harder than writing the class
  62. pcg> specification.  Just define what's required.
  63.  
  64. It's that "just" that drives one crazy. Writing proper specifications is
  65. often *harder* than writing the corresponding code, and longer. Formal
  66. methods have been stymied by this problem for a long time. There have
  67. been in the past languages in which code was meant to be dully decorated
  68. by specification, or something similar (Alphard, for example), but they
  69. have not been a resounding success.
  70.  
  71. Fortunately decorating functions with small bits of specification does
  72. help a lot, if one chooses the "right" bits, as you seem to be suggesting.
  73.  
  74. objsys> I was recently perusing Booch's OO Design book and
  75. objsys> serendipitously ran across the following quote about typing
  76. objsys> where Grady claims that although types and classes are separate,
  77. objsys> he uses the terms interchangeably.
  78.  
  79. The trouble that many people have is that they don't define their terms
  80. precisely. The confusion between type as denotation and representation and
  81. syntax is rampant. Probably you are right to suspect that Booch is not
  82. very clear about it himself, not just "mortals".
  83.  
  84.  
  85. pcg> [ ... ] inheritance, which is a poor way to reuse either protocol
  86. pcg> XOR interface. In most cases separating the two types of reuse is
  87. pcg> fairly difficult.
  88.  
  89. objsys> [ ... ] highly desirable separation of specification from
  90. objsys> implementation
  91.  
  92. Ever to be praised! Except that I tend to use 'protocol' or 'interface'
  93. in this context, rather than 'specification'.
  94.  
  95. To me a specification is a description of a type denotation, not of the
  96. protocol used to access the implementation of the type.
  97.  
  98.   If I have understood correctly that you referring to the syntactic
  99.   specification of a type/class, that is its protocol/interface.  I once
  100.   had on these screens a slightly similar discussion, in which it turned
  101.   out that 'specification' tends to be used somewhat differently in the
  102.   USA and in Europe. The European custom, which I use, is that
  103.   'specification' is the description of the semantics, while the USA
  104.   custom is that 'specification' is the description of the interface.
  105.  
  106. This distinction between specification/semantics and protocol/interface
  107. to me is essential, as there can be types alternative interfaces for
  108. types with the same denotation, or two types with different
  109. specification can have the same interface.
  110.  
  111. objsys> [See the Emerald paper for a quick discussion on this].
  112.  
  113. There is some of this in Modula-3 too.
  114.  
  115. objsys> [ ... ] the separation both more powerful and more flexible than
  116. objsys> the result of combining object type and class.  And I also believe
  117. objsys> it simplifies programs by *not* confusing the two and hence by
  118. objsys> *not* confusing the software engineer.
  119.  
  120. Again, while I agree with the meaning, some linguistic difference: I
  121. find slightly disturbing to talk of object type and class. Maybe one
  122. should say 'type denotation' or semantics instead of 'object type', and
  123. 'type declaration' instead of 'class' (class syntax is just one of the
  124. possible syntaxes used to declare a type).
  125.  
  126. objsys> [Minor digression] Also, I've seen some argument in other
  127. objsys> postings against inheritance and the is-a (or is-a-kind-of)
  128. objsys> relationship.  You may not like its current form but we
  129. objsys> certainly use this relationship so ubiquitously in problem
  130. objsys> solving I'm not sure what you mean; we'd be lost without it and
  131. objsys> the conceptual understanding of the world it helps provide.
  132.  
  133. The tragedy with inheritance is that it is unsually constraining. It
  134. forces unnatural kludges, as above, to do things that should be entirely
  135. obvious. Program modules can be described independently in one of three
  136. dimensions, the implementation, the specification, the interface. Now In
  137. theory programming should be done like this:
  138.  
  139.     The problem domain is surveyed; data design is done, algorithm
  140.     design is done. Interfaces are defined, implementations are
  141.     coded.  Identification of structural reuse opportunities
  142.     are identified in all three domains.
  143.  
  144. There is absolutely no reason to believe that structural reuse
  145. opportunities need to happen in a hierarchical fashion like with
  146. inheritance. Once wants the ability (my favourite peeve) to
  147. independently reuse interfaces, specifications, and implementations, and
  148. a general purpose algebra for all of thse things.
  149.  
  150. For example:
  151.  
  152. * given a deque interface, derive stack and queue interfaces by
  153. _subtracting_ the appropriate elements;
  154.  
  155. * given two deque implementations, one with lists and the other with
  156. resizable arrays, attach one to a stack interface, and one to a queue
  157. interface;
  158.  
  159. * given a specification of a variable size deque, derive from it a fixed
  160. size deque specification by adding the specification of a size
  161. constraint;
  162.  
  163. and so on. It is clear that IS-A/HAS-A and other inheritance based
  164. relationships really don't provide a sound conceptual basis for all the
  165. work above, both because they are too hierarchical and because their
  166. level is often not clear (interface, implementation or specification?);
  167. for example IS-A/HAS-A usually are meaningfully applied only in the
  168. domain of specification, and really don't work in the interface or
  169. specification domains.
  170.  
  171. objsys> Smalltalk does have virtual classes; just don't implement a
  172. objsys> method and you've got them.
  173.  
  174. Kludge, kludge. :-) One should aim to describe explicitly things in a
  175. program text, not leave in the absence of method bodies the important
  176. information that this class declaration is really meant to be an
  177. interface specification.
  178. --
  179. Piercarlo Grandi                   | JNET: pcg@uk.ac.aber
  180. Dept of CS, University of Wales    | UUCP: ...!mcsun!ukc!aber-cs!pcg
  181. Penglais, Aberystwyth SY23 3BZ, UK | INET: pcg@aber.ac.uk
  182.