Ada 95 Quality and Style Guide Chapter 5

Chapter 5: Programming Practices - TOC - 5.3 TYPES

5.3.3 Private Types


  • Derive from controlled types in preference to using limited private types.
  • Use limited private types in preference to private types.
  • Use private types in preference to nonprivate types.
  • Explicitly export needed operations rather than easing restrictions.

  • example
    with Ada.Finalization;
    package Packet_Telemetry is
       type Frame_Header is new Ada.Finalization.Controlled with private;
       type Frame_Data   is private;
       type Frame_Codes  is (Main_Bus_Voltage, Transmitter_1_Power);
       type Frame_Header is new Ada.Finalization.Controlled with
          end record;
       -- override adjustment and finalization to get correct assignment semantics
       procedure Adjust (Object : in out Frame_Header);
       procedure Finalize (Object : in out Frame_Header);
       type Frame_Data is
          end record;
    end Packet_Telemetry;


    Limited private types and private types support abstraction and information hiding better than nonprivate types. The more restricted the type, the better information hiding is served. This, in turn, allows the implementation to change without affecting the rest of the program. While there are many valid reasons to export types, it is better to try the preferred route first, loosening the restrictions only as necessary. If it is necessary for a user of the package to use a few of the restricted operations, it is better to export the operations explicitly and individually via exported subprograms than to drop a level of restriction. This practice retains the restrictions on other operations.

    Limited private types have the most restricted set of operations available to users of a package. Of the types that must be made available to users of a package, as many as possible should be derived from the controlled types or limited private. Controlled types give you the ability to adjust assignment and to finalize values, so you no longer need to create limited private types to guarantee a client that assignment and equality obey deep copy/comparison semantics. Therefore, it is possible to export a slightly less restrictive type (i.e., private type that extends Ada.Finalization.Controlled) that has an adjustable assignment operator and overridable equality operator. See also Guideline 5.4.5.

    The operations available to limited private types are membership tests, selected components, components for the selections of any discriminant, qualification and explicit conversion, and attributes 'Base and 'Size. Objects of a limited private type also have the attribute 'Constrained if there are discriminants. None of these operations allows the user of the package to manipulate objects in a way that depends on the structure of the type.


    The predefined packages Direct_IO and Sequential_IO do not accept limited private types as generic parameters. This restriction should be considered when I/O operations are needed for a type.

    See Guideline 8.3.3 for a discussion of the use of private and limited private types in generic units.

    < Previous Page Search Contents Index Next Page >
    1 2 3 4 5 6 7 8 9 10 11
    Appendix References Bibliography