AFAIC, a component is implementable separately. I can put it on a CD, a diskette, a paper tape or whatever and deploy it on a node somewhere.
AFAIC, you cannot deploy "part of a component", ergo there are no "sub-components". (Theoretically.)
bruce
If so, then let me take you back to the original question. In the language I am reverse engineering there is:
1. A ".p", a source code module which can be compiled;
2. A ".r", a compiled module;
3. A ".i", a source code module which can not be compiled, but which is included in a .p and thus becomes compiled into a .r at compile time.
4. Internal procedures (IP) in the .p which can either be private to the .p or which can be executed directly if the compiled version is run persistently.
Thus, if one is deploying source code, one physically deploys .p and .i files, but cannot deploy IP independently from the .p or .i which contains them. If one is deploying compiled code, the only thing one can physically deploy is a .r file.
If you are going to forbid the use of Component for modeling the IP, what UML construct would you use to model them.
Note that it is common to create a .p which is a collection of many IP, compile it and run it persistently and use it as a sort of library by running the IPs directly. There is even a language construct which will allow extending the namespace in such a way that running an IP in such a persistent procedure appears as if it is a run in the local .p. So, it is very important in the modeling to link one .p with another and also to link a .p or an IP directly to an IP in a different .p.
Note too that the legacy application being modeled does include a small number of classes. One of the advantages of showing IPs as subComponents within the .p Component is that it is possible to show dependency and usage relationships from one program to the next, e.g., what part of another program is actually being used. E.g., if one has a persistent program functioning as a library which actually covers a dozen different functions, one might find that a certain class of program was only using the same three IPs out of all possible IPs in that library and want to consider moving this into its own unit.
But, given this type of analysis, might it also be appropriate to load the methods of a class as subcomponents within the Component corresponding to the class in order to show these same kind of dependencies?
In particular, if we are successful in linking data access down to the subcomponent level, this would be of interest for both the IP subcomponents and the method subcomponents.