home *** CD-ROM | disk | FTP | other *** search
/ ftp.umcs.maine.edu / 2015-02-07.ftp.umcs.maine.edu.tar / ftp.umcs.maine.edu / pub / WISR / wisr4 / proceedings / detex / edwards.detex < prev    next >
Text File  |  1992-04-28  |  18KB  |  352 lines

  1.  
  2.           Common Interface Models for Components Are 
  3.       Necessary to Support Composability 
  4.  
  5.                  Stephen H. Edwards 
  6.          
  7.     Department of Computer and Information Science 
  8.             The Ohio State University 
  9.               2036 Neil Avenue Mall 
  10.                Columbus, OH  43210 
  11.  
  12.  
  13.                       Abstract  
  14.  
  15. Unfortunately, reusable components are often based on different
  16. conceptual models of behavior.  The model underlying the
  17. specification of one module's parameter requirements may significantly
  18. differ from the model underlying the specification of another
  19. module's exported features, even if the two modules intuitively
  20. seem compatible.  There is no well understood groundwork of
  21. common models for component interaction, and the lack of guidelines
  22. for applying these models exacerbate the composability problem.  This
  23. paper will describe how varying interface models and techniques for
  24. describing a component's interface requirements affect composability.
  25. These problems will be illustrated in the context of common interface
  26. properties that are exhibited even in simple    adt  components.
  27.  
  28. Keywords: component reuse, module composition, intensional and extensional 
  29.           interfaces, modeling interface behavior.
  30.  
  31.  
  32.  
  33. 1  Introduction 
  34.  
  35.  
  36. As more and more attention is being focused on software reuse, new problems are emerging.  While the majority of these difficulties are rooted in nontechnical 
  37. issues, it is clear that there are more technical problems than previously 
  38. anticipated.  One of these technically oriented problems arises out of the 
  39. constructive, or parts based, approach to software reuse
  40.  
  41. ----- begin Footnote
  42. The distinction between the constructive, composition based approach and the 
  43. generative approach to reuse is described in [BR87].
  44. ----- end Footnote
  45.  
  46. ---combining software components as basic building blocks to form larger 
  47. structures.
  48.  
  49. Specifically, in practice it can be very difficult to ``compose'' or
  50. interlock two apparently general software components.  Of course,
  51. there are many factors affecting the composability of software
  52. components.  This paper will concentrate on one of these factors:
  53. components are often based on different conceptual models of behavior.
  54.  
  55. There is no well understood groundwork of common models for component
  56. interaction, and the lack of guidelines for applying these models
  57. exacerbate the composability problem.  This paper will describe how
  58. interface models affect composability and how techniques for describing a 
  59. component's interface requirements affect composability.  These problems will 
  60. be illustrated in the context of common interface properties that are 
  61. exhibited even in simple abstract data type (ADT) components.
  62.  
  63.  
  64.  
  65. 2  Composing Software Components 
  66.  
  67. Before tackling the problems that arise when trying to compose
  68. software components, it is necessary to define what ``composition''
  69. really is.  In this paper, composition means binding two components
  70. together along a common interface boundary.  Further, one of the
  71. components exports while the other imports ---the exporter provides facilities 
  72. that are needed by the importer.  This definition is directly derived from the 
  73. work of Goguen [Gog84, Gog86] .
  74.  
  75. The concept of composing software components is central to the
  76. ``parts oriented'' reuse approach.  Ideally, a module has a
  77. well-defined description of the interface it provides to its clients.
  78. Also, a module ideally has a well-defined set of interface
  79. requirements that completely delineate what must be supplied to it
  80. during composition.  Thus, the interface of the exporter and the requirements 
  81. of the importer can be compared to check for valid compositions.
  82.  
  83. By examining these ideas in more detail, one can see that a component
  84. has a set of requirements that must be fulfilled by the other
  85. components to which it is connected.  It is best if these
  86. requirements, or ``interface expectations,'' are explicitly defined,
  87. although in some languages they may be left implicit.  In Ada, for
  88. example, interface expectations for module composition can be
  89. (syntactically) defined in the form of generic parameters to the
  90. module.  Any other module that exports types and operations
  91. consistent with these requirements (i.e., that conform to the generic
  92. parameters) can be composed with such a component.  The way these
  93. distinct components fit together via composition is determined by
  94. the facilities exported by one, and the parameter expectations of the
  95. other (e.g., generic parameters).
  96.  
  97. The concept of module composition can be further refined by considering the 
  98. purpose of combining modules.  Specifically, components can be composed both    horizontally and vertically [Gog84].  Horizontal composition is the 
  99. interconnection of components at a single level of abstraction so that they 
  100. may work together to form a cohesive abstract layer.  Vertical composition is
  101. the construction of higher levels of abstraction on top of existing layers.
  102.  
  103. To illustrate the concept of horizontal composition, consider two Ada
  104. generic packages, one that exports a queue type and one that exports a
  105. list type.  If one instantiated the queue generic using the list type,
  106. a ``queue of lists'' facility would be created.  This combines the two
  107. components to form a larger abstract machine, and is thus horizontal
  108. composition.  On the other hand, Consider implementing the queue package
  109. so that its body uses an instantiation of the list package for representing
  110. actual queues.  This involves building a new abstract layer on top of
  111. existing layers, and is thus vertical composition.
  112.  
  113. Irrespective of the type of composition, however, each component has
  114. a set of (possibly implicit) requirements that must be met when it is
  115. composed with other components.  It is the nature of these interface
  116. expectations, and how they might be met by other potentially compatible
  117. modules that is the subject of the remainder of this paper.
  118.  
  119.  
  120.  
  121. 3  Interface Models 
  122.  
  123. In simple terms, an ``interface model'' is just an abstraction of a
  124. set of types and operations, and how they are used together.  For
  125. example, one can talk about the interface model imported by a
  126. component when discussing its interface requirements.  This refers to
  127. the conceptual idea of how the imported facilities (types and
  128. operations) interact with each other.  Likewise, the interface model
  129. exported by a module refers to the abstract concept that the module
  130. embodies, and how each of the exported operations interacts with and
  131. affect that abstraction.
  132.  
  133. The critical element in understanding this idea of an interface model
  134. lies in the fact that it is more than simply a collection of
  135. types and operations.  It also encompasses how the individual types
  136. and operations interact, and how they are used in conjunction with
  137. each other to achieve certain goals.  The underlying behavior specified
  138. in a description of the interface is crucial.
  139.  
  140. Given this idea, it is easy to see that models of interface behavior
  141. can conflict if the interface of one component is designed around one
  142. model of interaction, while the expectations of another component are
  143. designed around a different model.  It may be difficult to compose
  144. the two, that is, to use the first component to supply the needed
  145. facilities of the second.
  146.  
  147. To see how interface models can conflict, consider the specification
  148. of the function  Find_the_Max_of  presented in Figure 1, which is taken 
  149. from [Tra89].  This generic function, which is a generalization of an Ada for 
  150. loop over an array structure, is parameterized with its interface expectations. In order to compose some ADT with this function, that ADT must export the 
  151. required operations.  If there is not an exact match between the importer's
  152. requirements and the exporters facilities, then ``glue'' code may be
  153. written that implements the required operations in terms of those
  154. provided by the exporter.
  155.  
  156. For this example, it is easy to see how appropriate glue for an Ada
  157. array type can be written to satisfy  Find_the_Max_of 's requirements.  
  158. However, this function's requirements are based upon an interface model that 
  159. is perhaps too tightly tied to the concept of an array.  In general, one might 
  160. expect a maximum-finding routine to operate over a set (or multiset) of values. Intuitively, the only requirement is that there be a mechanism for iterating 
  161. over the collection of values.
  162.  
  163. To illustrate this, imagine how one might use Find_the_Max_of 
  164. on a collection of elements represented as a list.  Depending on the
  165. interface model provided by the list abstraction, the cost of
  166. providing the necessary glue could be prohibitive, both in terms of
  167. the cost of implementing it and its efficiency.
  168. Consider the list abstraction presented in Figure 2, which
  169. represents one of many alternative ways of specifying the basic
  170. operations necessary to access a list structure.
  171.  
  172. ----- begin footnote
  173. This specification is derived from the work of the Reusable Software Research 
  174. Group at the Ohio State University.  See [WOZ91] for a description of the 
  175. rationale behind similar designs.
  176. ----- end footnote
  177.  
  178. Because the list abstraction presented by the One_Way_List package in Figure 2 
  179. restricts clients to accessing list elements in sequential order, there is a 
  180. clear mismatch between its exported functionality and the import requirements 
  181. of Find_the_Max_of.  Similarly, Figure 3 presents another data abstraction, a 
  182. variable length sequence,
  183.  
  184. ----- begin footnote
  185. This specification is also derived from the work of the Reusable Software
  186. Research Group at the Ohio State University.
  187. ----- end footnote
  188.  
  189. which is built on yet another behavioral model.
  190.  
  191. In this case, access to elements of a sequence can be specified by position.  
  192. However, individual items within a sequence are accessed through the use of a 
  193. Swap_Entry procedure that exchanges the object within the sequence with one 
  194. provided by the caller.  This is clearly different from the value preserving 
  195. nature of Find_the_Max_of's Get_Element function.
  196.  
  197. In both of these cases, it is possible to write glue routines to wedge the 
  198. given abstractions to fit the interface requirements of Find_the_Max_of, given  
  199. enough time.  However, the cost associated with writing and maintaining this 
  200. glue reduces the benefits that one obtains from reusing the Find_the_Max_of
  201. component in the first place.  Further, in more complex cases, the difficulty 
  202. of composing two modules may likely result lead one to forgo composition and 
  203. write a ``compatible'' module from scratch.
  204.  
  205. To most experienced designers, especially if aided by hindsight,
  206. it is clear that these costs may be avoided simply by redesigning the
  207. interface requirements of the given unit.  If one looks at both the
  208. exporter and importer at the same time, it is a much easier exercise
  209. to write interfaces based on compatible models of interaction.  In
  210. general, however, the importer is written independently of the exporter.  One
  211. possible way to avoid this difficulty is to attempt to evolve
  212. interface models for frequently used behavioral models that can
  213. eventually become commonly accepted de facto interface standards.
  214.  
  215. For example, the primary interface requirement for the Find_the_Max_of function is the existence of some collection of values over which one can iterate.  If a common model for the set of operations that form an iteration capability can be adopted,
  216.  
  217. ----- begin footnote
  218. See   for one recommendation of a standard iterator profile.
  219. ----- end footnote
  220.  
  221. then the generic parameters of Find_the_Max_of can be expressed using this 
  222. form.  Likewise, container structures can adopt the same form when providing 
  223. operations for clients to use in constructing iterations.  Other areas that are prime candidates for interface model exploration include the concurrency 
  224. protection scheme adopted in a component, the memory management approach used 
  225. by a component, the approach to file I/O for an ADT, and so on.
  226.  
  227. Unfortunately, designing ``consistent'' component interfaces is extremely 
  228. difficult.  Few general guidelines on commonly used interface models are 
  229. available, and how these models affect composability isn't understood.  In 
  230. fact, simply identifying the conceptual model behind a given component can be 
  231. hard.  Just defining the concurrency protection approach used in a given ADT 
  232. component is often difficult, for example.  Such aspects of a component's 
  233. interface, such as the concurrency protection scheme, the exported iterator 
  234. structures, the memory management approach, and so on, are often crafted for a 
  235. specific implementation.  As a result, ``common'' models for those aspects of 
  236. a component's interface aren't commonly applied!
  237.  
  238. As a result, even if the abstraction supplied by one component is
  239. conceptually the same as that required by another, there is a good
  240. possibility there will be a difference in the actual interfaces.  In
  241. general, this problem is most likely unsolvable, but it is possible to
  242. work towards standards that make interoperability of component
  243. interfaces more practical, common, and cheaper.
  244.  
  245.  
  246.  
  247. 4  Extensional Versus Intentional Interfaces 
  248.  
  249. Another issue that can affect the compatibility of two components is the manner in which their interface requirements are expressed.  There is a difference 
  250. between extensionally and intensionally expressing interface requirements 
  251. [Lat89].  Items that satisfy extensional requirements are typically defined by 
  252. inclusion in a specified (possibly infinite) set of items.  Items that satisfy
  253. intensional requirements, on the other hand, are defined by characteristic 
  254. properties they must possess.
  255.  
  256. One example of an extensional interface requirement often appears in
  257. object-oriented languages: parameters must belong to a specific class.
  258. While classes can usually be extended via specialization, the
  259. conformance to an interface specification is determined by name
  260. equivalence to the parameter's class.
  261.  
  262. An example of an intensional interface requirement is a generic parameter to an Ada package.  Here, conformance to the interface specification is determined by structural equivalence.  For example, if a private type parameter is required, 
  263. any Ada type that has the same properties as a private type---the presence of
  264. built-in equality and assignment operators, and so on---will conform to
  265. the interface.
  266.  
  267. More flexible intensional interface mechanisms are present in LIL [Gog84, 
  268. Gog86, Tra90].  LIL supports formally defined correspondences between packages.
  269. As a result, when packages are used as generic parameters, any other package 
  270. that can be shown to provide a conforming set of operations and types can be 
  271. used to satisfy the interface requirements.  With the addition of formal 
  272. semantic definitions as in LILEANNA [Tra90], the structural equivalence can be 
  273. extended to semantic equivalence.
  274.  
  275. Clearly extensional requirements are more limiting than intensional
  276. ones.  The correspondence facilities present in languages like   
  277. lil  allow one the freedom to express interface requirements in one
  278. way, but still meet those requirements with any component that
  279. provides the correct abstraction.  While the restrictiveness of
  280. extensional interface requirements in an object-oriented programming
  281. language initially seems inconsequential, relieving it can create
  282. more problems.  The use of multiple inheritance can arbitrarily
  283. broaden extensional requirements; however, using a single inheritance
  284. hierarchy for many purposes is fraught with difficulty [LaL89].
  285.  
  286. Also, generic parameters can be extensional.  The RESOLVE programming language 
  287. allows packages as generic parameters, but uses name equivalence rather than 
  288. structural equivalence to determine conformance [Heg89].  As a result, a 
  289. mechanism that on the surface appears very much like Ada's generic mechanism
  290. actually gives rise to extensional rather than intensional behavior.
  291.  
  292. The restrictive nature of extensional requirements specifications
  293. simply inflames the composability problem.  It further restricts, or
  294. even overspecifies, the interface requirements so that even
  295. components with potentially compatible models of behavior cannot be combined.
  296.  
  297.  
  298.  
  299. 5  Conclusion 
  300.  
  301. Common models of interface behavior are necessary for promoting
  302. composability in a software component industry.  Further, defining
  303. canonical models and providing guidelines for their application is
  304. hard.  Such models are not currently in use because most components
  305. use highly tailored, implementation specific behavioral models.
  306. Also, the method by which interface expectations are specified can
  307. further limit module compatibility.  This limiting can arise from
  308. extensional interfaces that can prematurely restrict the modules that
  309. can be used to supply a given component's needs, while intensional
  310. interfaces seem to offer more generality.  As a result, interface models
  311. and methods for expressing interface requirements should be explored in
  312. order to increase the likelihood that reusable modules are in fact
  313. composable with other reusable modules.
  314.  
  315.  
  316.  
  317. REFERENCES
  318.  
  319. [BR87]  Ted Biggerstaff and Charles Richter.  Reusability framework, 
  320.     assessment, and directions.  IEEE Software, 4(2):41--49, March 1987.
  321.  
  322. [Edw90] Stephen H. Edwards.  An approach for constructing reusable software 
  323.     components in Ada.  IDA Paper P-2378, Institute for Defense Analyses, 
  324.     Alexandria, VA, September 1990.
  325.  
  326. [Gog84] Joseph A. Goguen.  Parameterized programming.  IEEE Transactions on 
  327.     Software Engineering, SE-10(5):528--543, September 1984.
  328.  
  329. [Gog86] Joseph A. Goguen.  Reusing and interconnecting software components.
  330.         IEEE Computer, 19(2):16--28, February 1986.
  331.  
  332. [Heg89] Wael A. Hegazy.  The Requirements of Testing a Class of Reusable 
  333.     Software Components.  PhD thesis, Dept. of Computer and Information 
  334.     Science, The Ohio State University, Columbus, OH, 1989.
  335.  
  336. [LaL89] Wilf R. LaLonde.  Designing families of data types using exemplars.
  337.         ACM Transactions on Programming Languages and Systems, 11(2):212--248, 
  338.     April 1989.
  339.  
  340. [Lat89] Larry Latour.  University of Maine, personal communication, 1989.
  341.  
  342. [Tra89] Will Tracz.  Parameterization: A case study.  Ada Letters, 
  343.     IX(4):92--102, May/June 1989.
  344.  
  345. [Tra90] William Tracz.  Formal Specification of Parameterized Programs in 
  346.     LILEANNA.  PhD thesis, Dept. of Electrical Engineering, Stanford 
  347.     University, Stanford, CA, 1990.
  348.  
  349. [WOZ91] Bruce W. Weide, William F. Ogden, and Stuart H. Zweben.  Reusable 
  350.     software components.  In M. C. Yovits, editor, Advances in Computers. 
  351.     Academic Press, 1991.
  352.