comp.lang.ada
 help / color / mirror / Atom feed
From: Felix Krause <flyx@isobeef.org>
Subject: Re: OOP in Ada: Alternatives for "protected" scope
Date: Sat, 5 May 2012 10:28:43 +0200
Date: 2012-05-05T10:28:43+02:00	[thread overview]
Message-ID: <jo2obr$tln$1@online.de> (raw)
In-Reply-To: 17kcn9g4qeg7j.5xole2f4bwbj$.dlg@40tude.net

On 2012-05-04 22:00:41 +0000, Dmitry A. Kazakov said:

> On Fri, 4 May 2012 20:48:53 +0200, Felix Krause wrote:
> 
>> On 2012-05-03 21:56:51 +0000, Dmitry A. Kazakov said:
>>> 
>>> If Do_Something varies in children they should override it. The reusable
>>> parts common for all children can be factored out as a private class-wide
>>> operation.
>> 
>> Compared to my version (with redispatching issues fixed), this
>> alternative enforces a weaker contract.
> 
> I don't like re-dispatch, it is a design bug to me.

Well, this is probably a question of personal preference. At least Ada 
lets one choose whether to redispatch or not.

> 
>>> This is exactly what Ada's private is. The correspondence goes as follows:
>>> 
>>> "Public" <-> Ada' public operation
>>> "Protected" <-> Ada's private operation
>>> "Private" <-> An operation defined in the package body
>> 
>> So, to be able to use these visibility scopes, the class hierarchy must
>> follow the layout of the package hierarchy.
> 
> That depends on what you mean. Classes (types constituting them) stretch
> across packages, as types don't live in the vacuum.
> 
> Ada separates types and visibility. Comparing to other languages it is a
> great advantage. I understand that you see it differently, but that is
> because you haven't yet accustomed to the Ada's model.

I think you're right here. I don't want to question Ada's model, I just 
want to see how it can be applied to OOP-related problems.

> Note that Ada has another (inferior) model as well. It can be seen in Ada
> protected and task types. They are mess. It was a mistake.
> 
>> I think this is a
>> disadvantage for some reasons:
>> 
>> * Given the scenario that you use an Ada software library containing
>> tagged types, you have to subclass these types in child-packages within
>> the package layout of the library.
> 
> Only if you want to access private, i.e. implementation-dependent, stuff.
> Note that when a package depends on the implementation details of another
> package, this constitutes a tight coupling. Ada requires the programmer to
> manifest this design decision in the form of a parent-child package
> relation. This IMO is a good thing. You cannot access the implementation
> details if you don't state your intention making it visible for the reader.
> Note also that this decision is all on the child's side. In the competing
> model, any derived type always get access, so the decision is on the parent
> type side. This is a bad design because it forces the programmer to make
> his choice early and, maybe, it does a wrong person.

Hmm, good point. I see "protected" / abstract methods rather as an 
additional interface of the class type than as 
"implementation-dependent stuff". While it's true that changing the 
implementation of a type by overriding its operations implies tight 
coupling, I don't think this is neccessarily true for abstract methods. 
But I see that if abstract methods are an interface of the type, these 
should rather be placed in the public part.

>> I for myself would rather want to
>> place my code in the package hierarchy of my application.
> 
> That is not a problem, you can rename packages.

Didn't think about that, good point.

>> * It doesn't work with generics:
>> 
>> generic
>> -- ...
>> package P is
>> type A is tagged private;
>> -- …
>> end P;
>> 
>> package Q is
>> package P_Instance is new P (...);
>> 
>> type B is new P_Instance.A with private;
>> end P.Q.R;
> 
> You use a generic child:
> 
> generic
> package P.Q is
>    type B is new A with private;
> private
>    ... -- You have visibility of P's private here
> end P.Q;

Yes, but that's not what I wanted. Let's have a more specific example 
using orthogonal inheritance:

package P is
   type A is tagged private;
   -- ...
end P;

generic
   type Base is new A with private;
package P.Extend is
   type Extended is new Base with private;
   -- ...
end P.Extend;

package P.Q is
   type B is new A with private;
   -- ...
end P.Q;

package P.Q.R is
   package B_Extend is new P.Extend (Base => B);
   type C is new B_Extend.Extended with private;
end P.Q.R;

(I actually have some code with this structure.) I cannot possibly 
access the private part of P.Extend in P.Q.R - although I'm extending 
the class defined there. I cannot layout the packages in a way that 
lets me access both P.Extend's and P.Q's private part in P.Q.R.

I admit that this is a rare case and in my code I don't need to share 
any private information of P.Extend.




  reply	other threads:[~2012-05-05  8:28 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-03 21:27 OOP in Ada: Alternatives for "protected" scope Felix Krause
2012-05-03 21:56 ` Dmitry A. Kazakov
2012-05-04 18:48   ` Felix Krause
2012-05-04 22:00     ` Dmitry A. Kazakov
2012-05-05  8:28       ` Felix Krause [this message]
2012-05-05 11:53         ` Dmitry A. Kazakov
2012-05-05  4:33     ` Shark8
2012-05-03 23:34 ` Randy Brukardt
2012-05-04  1:41 ` BrianG
2012-05-04 10:37 ` Georg Bauhaus
2012-05-04 10:43   ` Georg Bauhaus
2012-05-04 12:10   ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox