Non-pipeline component programming

David Ledez via Digitalmars-d digitalmars-d at puremagic.com
Thu Sep 4 01:03:51 PDT 2014


Dear T,

I've read with a great attention your reply regarding ECS and 
OOP. You mention that you work on high-dimensional polytope and a 
data structure able to support fast topological query with 
compact storage. I would be very interested in having a look to 
your data structure. Do you have any document about your design 
and the concepts? Any github?
This thred is really extremely instructive. I m looking forward 
to reading your reply.
Regards,

     - David -

On Wednesday, 12 February 2014 at 17:38:30 UTC, H. S. Teoh wrote:
> Sorry for this belated reply, I have been rather busy with other
> matters.
>
>
> On Tue, Feb 04, 2014 at 04:12:48AM +0000, 
> digitalmars-d-bounces at puremagic.com wrote:
>> I loved reading Walter's component programming article in Dr. 
>> Dobb's
>> [0] in late 2012. I had missed H. S. Teoh's mid 2013 article on
>> calendar textual formatting using the component approach [1], 
>> but
>> fortunately Ali brought it to my attention recently, and I 
>> also find
>> it absolutely fascinating!
>
> Thanks!
>
>
>> I think what's most interesting with Teoh's article (and I 
>> think
>> that was Ali's point when he mentioned the article to me) is 
>> that
>> the calendar example is not as an obvious target for the 
>> component
>> approach, or at least that the design and implementation is 
>> not as
>> obvious for someone new to that approach.
>> 
>> Now, while Teoh's example is much more complex than Walter's, 
>> both
>> examples are for cases of pipelined problems (source -> 
>> filter1 ->
>> filter2 -> sink). What I have been wondering during the last 
>> few
>> days is how much this "component programming" approach could be
>> applied to scenarios where you would normally have a jumble of
>> objects. For instance, try to picture a game or simulation 
>> where
>> spaceships fire at each other, pick up objects, communicate, 
>> and so
>> on, or something like that. My instinct would be to code a 
>> solution
>> which would be classified as typical OOP code. Would it be 
>> possible
>> to come up with a solution that would be more in the spirit of
>> "component programming"? Or are such solutions only
>> practical/applicable for pipeline-like scenarios?
> [...]
>
> I would say that while it's insightful to apply different 
> paradigms to
> solve the same problem, one shouldn't make the mistake of 
> shoehorning
> *everything* into the same approach. This is what Java does 
> with OO, for
> example, to the detriment of every other paradigm, and frankly, 
> after a
> while all those singleton classes with static methods just 
> start to
> smell more and more like ways of working around the OO rather 
> than with
> it.
>
> Having said that, though, the component approach is highly 
> applicable,
> often in unexpected areas and unexpected ways, esp. when you 
> couple it
> with D's range-based concept. There are certainly algorithms 
> where it
> makes more sense to treat your data as a graph rather than a 
> linear
> sequence of nodes, but it's also true that a good percentage of 
> all code
> is just variations on linear processing, so pipelined 
> component-style
> programming would definitely be applicable in many places.
>
> And nothing says you can't intermix component-style code with 
> OO, or
> something else. One key insight is that sometimes you want to 
> separate
> the object itself from a range over that object -- for example, 
> I work
> with polytopes (higher-dimensional analogues of polygons and 
> polyhedra),
> and it's useful to have, say, a range over all vertices, or a 
> range over
> all edges, but it's also useful to separate these ranges from 
> the
> polytope itself, which can be stored in a more compact form, or 
> in a
> form that's more amenable to fast queries, e.g., find all faces 
> that
> contain vertex X without needing to iterate over every face in 
> the
> polytope (which you'd end up doing if you use filter() on the 
> range of
> all faces). The query function can return a range over faces, 
> so that it
> can be piped into other range-based functions for further 
> processing.
> Thus, you can have a mix of different paradigms complementing 
> each
> other.
>
> The other underlying theme in my article, which is also one of 
> the key
> points of the Jackson Structured Programming that I alluded to, 
> is the
> identification and separation of mismatching structures in 
> order to
> simplify the code and eliminate code smells caused by ad hoc 
> methods of
> structure conflict resolution (boolean flags are a common 
> symptom of
> this malady). This isn't limited to pipelined programs, but 
> applies in
> general. One could analyze OOP in this way, for example. OO 
> lore says
> that objects should be cohesive and loosely-coupled -- we could 
> say that
> cohesiveness means that the data stored in the object has 
> corresponding
> structures, and loose coupling means that if an object's data 
> has
> conflicting structures, it's time to consider splitting it into 
> two
> different objects instead.
>
>
> T



More information about the Digitalmars-d mailing list