home *** CD-ROM | disk | FTP | other *** search
-
-
-
- Chapter 21
- ADVANCED PACKAGES & PRIVATE TYPES
-
-
- THIS IS FOR LARGE PROJECTS
- _________________________________________________________________
-
- The material in this chapter is used for large projects when there
- are several programmers working together as a team. In such a
- case, there is a demand for good communication between the various
- programmers, regardless of what programming language is used. If
- Ada is the language chosen for the project, and if the principles
- set down in this chapter are carefully followed, the amount of
- communication required can be minimized.
-
-
-
- TWO GOOD PROGRAMMERS
- _________________________________________________________________
-
- In this chapter, we will assume we have a project being developed
- by two programmers, and that they are both sharp and well versed
- in how to develop quality software. We will follow along with the
- example programs as they develop a simple system to add or subtract
- groups of three numbers. One has been assigned the responsibility
- to write a package that the other programmer can use to add or
- subtract groups of three numbers of arbitrary structure.
-
- This is a trivial problem, of course, but will illustrate the
- concept of information hiding, which is so necessary on a large
- project.
-
-
-
- THE FIRST SOLUTION
- _________________________________________________________________
-
- The example file named NOPRIVAT.ADA illustrates ================
- the first attempt to solve the problem, however NOPRIVAT.ADA
- it does not practice any information hiding. ================
- Lines 1 through 69 represent the work of the
- package writer, and lines 74 through 101 are
- written by the user of the package. The package writer used a
- record to store the three numbers and because he declared the
- record in the specification package, he gave the user full access
- to the record for his own use.
- The package writer, by providing three functions and a procedure,
- gave the user the ability to add the corresponding elements,
- subtract the corresponding elements, and two additional
- capabilities. The function named Build_Structure allows the user
- to build a new structure given the individual components, and the
- procedure named Decompose, allows the user to separate the elements
- into their respective values. We might add that this package is
-
- Page 21-1
-
- Chapter 21 - Advanced Packages & Private Types
-
- a result of a meeting between the two programmers where they agreed
- on what the system must do and what the interface between them must
- be. The package specification is intended to be the only
- information needed to define the interface between the programmers.
-
- The user wished to change one value of the variable My_Data, and
- since he had the entire structure available, he cheated in line 99
- by circumventing the available structure handling method provided
- by the package writer. He feels he saved a few instructions and
- a little execution time, so the little bit of cheating is
- justified. Line 99 is perfectly legal, but could cause a problem
- in this instance due to the immense size of the project. Recall
- that he had previously agreed to use only the functionality
- provided by the package writer because the package writer is
- supplying the same package to another large project and must
- maintain conformity with both users.
-
-
-
- A PROBLEM DEVELOPS
- _________________________________________________________________
-
- The package writer, for reasons of efficiency and conformity to the
- other project, decides to change the way he stores the data from
- a three element record, to a three element array. With this
- modification in place and tested, the user suddenly finds that his
- program will no longer compile, even though nothing has been
- changed in his program. The only problem is with line 99, which
- has been working just fine for months now, but as we stated
- earlier, is actually cheating on the interface agreed upon by the
- user and the package writer. Information hiding would have
- prevented this problem, which in a real world system could cause
- hundreds of compiler errors following a seemingly minor change in
- one of the packages.
-
- In this case, the user cheated and resulted ultimately in a rather
- large problem. We need to prevent him from cheating. Of course
- we could make a project rule that says "no cheating", but we will
- shortly define a way to let the compiler enforce the rule for us.
- It should be obvious to you that in a real-life large system, the
- called package and the calling package would not be in the same
- file, but would be separately compiled. They were combined to make
- it easier for you to compile and execute, which you should do at
- this point.
-
-
- A BETTER WAY, THE PRIVATE TYPE
- _________________________________________________________________
-
- Examine the program named PRIVAT1.ADA for an ===============
- example of a private type which forces the user PRIVAT1.ADA
- to follow the rules. In the package ===============
- specification, the type DATA_STRUCTURE is
- defined to be of type private, a reserved word
-
- Page 21-2
-
- Chapter 21 - Advanced Packages & Private Types
-
- in Ada, which means that the type name is available for the user's
- use in declaring variables of this type, but the structure of the
- type is not available to him. The actual type is defined at the
- end of the package specification following another use of the
- reserved word private.
-
- Because the type is private, the user can make no use of the
- structure, even though he may be able to see the structure, as you
- can at this moment. If the package writer wished to do so, he
- could actually remove the type definition from the listing and give
- the resulting listing to the user, but the fact that it is private
- is as good as physically hiding it from the user.
-
- Because the type is private, the user has the ability to compare
- two variables of that type for either equality or inequality, and
- he can assign another variable or constant of that type to a
- variable of the same type. No other operations on a variable of
- this private type are available to him, except for those
- specifically defined in the package specification itself.
-
-
-
- NO TRICKS THIS TIME
- _________________________________________________________________
-
- The trick, in line 99 of the last program is therefore illegal, and
- will result in a compile error. If the user needs the ability to
- do some operation on this type variable, he must ask the package
- writer to provide it for him. The package writer has the ability
- to do anything with the components of the structure within the
- package itself, and define any new procedures or functions
- necessary for the intelligent use of the type. In order for the
- user to add 13 to one member, it is now necessary to declare a
- temporary record variable, load it with all fields, and add the
- entire temporary variable of the type DATA_STRUCTURE to the
- variable. This is illustrated in lines 104 and 105. It is rather
- obvious that these two statements could be combined and the
- variable named Temp not needed, but this was done for clarity.
-
-
-
- WHERE IS THIS TYPE AVAILABLE?
- _________________________________________________________________
-
- Following the partial declaration of the record type in line 10,
- it is available for use in the remainder of the specification
- package, and throughout the entire package body. It is important
- to remember that the private type is available in these areas just
- as if it were not private. It is only treated in a different
- manner with respect to the using program.
-
- The remaining details of the program should be simple for you to
- understand, then to compile and execute. Note that the output is
- identical to that from the previous example program.
-
- Page 21-3
-
- Chapter 21 - Advanced Packages & Private Types
-
-
- A NEW PACKAGE
- _________________________________________________________________
-
- The package writer, for his own mysterious ===============
- reasons, decides to change the package to use a PRIVAT2.ADA
- different structure. The example program named ===============
- PRIVAT2.ADA does exactly that. The only change
- from PRIVAT1.ADA is the method of defining the
- structure, in this case an array being used. Since the user was
- forced to follow the rules, his program will run with no
- modifications. See if you can find anything you can do in the main
- program using the structure defined in either program that cannot
- be done in the other. According to the design of Ada, it should
- be impossible for you to do so.
-
- Notice that the internal workings of the package body are
- significantly different to reflect the difference in the two data
- structures, but externally, you cannot tell the difference. Even
- though the package was changed significantly, none of the users
- will see a difference and there will be no incompatibility
- problems. Notice that the main program is identical to the main
- program in the last example program. Be sure to compile and
- execute this program.
-
-
-
- THE LIMITED PRIVATE TYPE
- _________________________________________________________________
-
- Examine the program named LIMPRIV.ADA for an ===============
- example of a limited private type. The biggest LIMPRIV.ADA
- difference between this program and the previous ===============
- one is the addition of the reserved word limited
- in line 10 which declares the type
- DATA_STRUCTURE to be of type limited private. This gives the
- package writer even more control over what the user can do with a
- variable of this type. There are no operations the user can
- perform on data of this type except for those explicitly spelled
- out by the package writer in the form of procedures and functions.
-
- If the user were to declare two variables of this type, the
- compiler would not allow him to compare them for equality or
- inequality, nor could he assign one variable to the other. In
- fact, he could not even declare a variable of this type and
- initialize it to some value, because that would require an implied
- assignment statement. He cannot declare a constant of this type
- either since that would also require an assignment statement. The
- package writer provided an additional procedure named
- Assign_Struct, and an additional function named Compare so the user
- could perform these operations. The program itself, beginning in
- line 93, is a bit messy because of the procedure calls required to
- do the assignments. You are surely asking, "why should we go to
- all of the trouble to use the limited private type?"
-
- Page 21-4
-
- Chapter 21 - Advanced Packages & Private Types
-
-
- WHY USE LIMITED PRIVATE TYPES?
- _________________________________________________________________
-
- It is conceivable that you, as the package writer, do not wish to
- give the user the ability to compare or assign variables of the
- type in question because of the nature of the project. You may be
- working on some form of a data encryption system, or a limited
- access file management system, and you wish to be sure that all
- users are positively locked out of access to certain files. The
- lack of compares and assignments would make it impossible for a
- user to access the lower levels of your system. This is a possible
- use for the limited private type, but there is a much more
- important need for it.
-
-
-
- OVERLOADING THE "=" OPERATOR
- _________________________________________________________________
-
- The equals operator is defined for the private type, so it cannot
- be overloaded in the same manner that we have been overloading
- operators in this tutorial. The limited private type does not have
- the equality operator available for use, so it can be overloaded
- in any manner the package writer decrees. Suppose for example that
- you were using the dynamic string package, named DYNSTRNG.ADA, from
- chapter 16 of this tutorial, and you wished to compare two strings
- for equality. If the strings were, for example, 80 characters
- long, but they only had 31 characters in use at this time, an
- overloading of the equality operator could provide a function that
- would compare only the 31 "active" characters of the string,
- stopping short of the additional characters in the static string
- declaration. This would allow the comparison to be done using an
- infix operator rather than a function call for the comparison.
- Overloading the "=" operator is not permitted for any type but the
- limited private type in all of Ada.
-
- You may think that it is very inefficient to write a program that
- requires a procedure or function call to do anything at all, but
- that is not necessarily the case. If the compiler writer has done
- a good job, a subprogram call can be very efficient, and a special
- purpose comparison could be much more efficient than a general
- purpose comparison routine that is designed to handle all cases.
- Because a general purpose routine is designed for flexibility, it
- may not do any particular comparison very efficiently.
-
- Be sure you compile and execute this program so you can verify that
- it does the same thing as the last two example programs.
-
-
-
-
-
-
-
- Page 21-5
-
- Chapter 21 - Advanced Packages & Private Types
-
- A PACKAGE WITHOUT A BODY
- _________________________________________________________________
-
- It is possible to declare a package specification without a
- corresponding body. This would be done if you wished to declare
- types, variables, and constants that could be used by other
- packages and subprograms, but included no executable code with the
- declarations. Programming exercise 3 will illustrate this
- technique. It is never possible to declare a package body without
- a corresponding package specification.
-
-
-
- PROGRAMMING EXERCISES
- _________________________________________________________________
-
- 1. Add a function to PRIVATE1.ADA named Compare_Sum, which
- compares the sum of the three elements of one structure to the
- sum of the three elements of the second structure, returning
- a TRUE if the sums are equal, and a FALSE otherwise. Add a
- few statements to the main program to exercise this new
- function.
-
- 2. Add the same function to PRIVATE2.ADA, and add a few
- statements to the main program to test it.
-
- 3. Write a package named Stuff that contains only a package
- specification. The package specification should make the
- value of Pi (3.14159) and Two_Pi available as well as a DATE
- record type. Include a short program to use the package.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 21-6