Control? Object?
Richmond
richmondmathewson at gmail.com
Mon Jun 20 10:38:12 EDT 2016
Thank you very much indeed for the comprehensive reply.
I shall deal with the children's confusion by using neither 'object' or
'control' and
just refer to buttons, fields and so on.
I know this is dodging the issue; but I can see no other way round it at
the moment.
Richmond.
On 20.06.2016 12:28, Mark Waddingham wrote:
> On 2016-06-19 09:19, Richmond wrote:
>> I am currently teaching some children Livecode programming and ran
>> into some difficulty
>> on Friday when a child asked me why the menus were full of the word
>> "Control"
>> when I had been talking about "Objects".
>>
>> Well?
>>
>> How about changing every use of the word "Control" to "Object"?
>
> Replying to the original post, as a lot was mentioned in this thread
> (it tries to cover most of what came up in the thread, not just this
> particular question).
>
> An object (regardless of what language it is rendered in, or with
> whatever specific kind of 'oop' methodology you care to subscribe to)
> is simply some state (i.e. variables which are distinct for each
> instance of the object) with an associated list of
> handlers/methods/functions which act on that state. (Indeed, really I
> think one should require that the state is entirely hidden and
> encapsulated within the object and not visible from the outside world
> - although most OOP languages do this very very poorly).
>
> In LiveCode, this is perhaps slightly hidden behind the English-like
> syntactic sugar. For example, one can imagine that:
>
> get the fooBar of myObject
>
> Is the same as (in a non English-like language):
>
> it := myObject.GetFooBar()
>
> Or something like:
>
> copy myObject
>
> Is the same as (again, in a non English-like language):
>
> myObject.Copy()
>
> Therefore, I have absolutely no hesitation in saying that LiveCode is
> object-oriented (for some definition of object-oriented). Indeed, it
> always has been - everyone who has ever programming in an xTalk had
> been doing object-oriented programming since it started to become
> 'popular' (HyperCard appeared in 1987, Cfront - the original C++ -
> appeared in 1985 - although the first 'object oriented' languages such
> as Simula appeared perhaps a decade before).
>
> The reason why I tend to hesitate saying LiveCode is object-oriented
> explicitly (well, up until 8, at least) is that the kind of way you do
> programming in LiveCode is perhaps not quite the same as what people
> expect when they hear that 'a language is object oriented'. The
> LiveCode model is essentially that of aggregation and adaptation,
> rather than inheritance (people tend to be highly aware of the later,
> but not aware of the former even though they will be implicitly doing
> it day-in-day-out in any programming language they are a practitioner
> of).
>
> In LiveCode, you build applications by using the building-blocks you
> drag from the control palette to build more complicated things
> (aggregation), and then you apply scripts to each object to change the
> behavior of the building-blocks appropriate to your app (adaptation).
>
> Now, inheritance is orthogonal to the idea of aggregation and
> adaptation - and it should be noted that most 'traditional' OOP
> languages allow you to do inheritance, but you have to build the
> framework to do aggregation and adaptation yourself (hence why Java,
> Obj-C, C++ etc. all have a large variety of 'frameworks' you can
> leverage to actually build apps - if you tried to do so with the 'raw'
> language, you'll find yourself just reinventing some sort of structure
> which is probably not too dissimilar to LiveCode's).
>
> When we added 'behaviors' you could argue that 'inheritance' did
> actually start to creep in - behaviors allow you to factor out the
> code which you use to adapt the building blocks (i.e. your scripts)
> into an informal hierarchy. (Informal here refers to the fact you
> don't need to make type definitions - which is entirely appropriate to
> LiveCode which tends not to force that kind of thing on you anywhere -
> except in Builder, and only then if you really want to).
>
> With 8, however, you can start to see the 'class inheritance' ability
> being added to LiveCode - that is what widgets are. i.e. You can write
> your own building blocks (in LiveCode Builder). (For those of you who
> have looked at Builder, then although it is not yet explicit - a
> module is essentially a class - a widget is a module which can have
> multiple instances and a library is a module which only ever has a
> single instance).
>
> So, right now in LiveCode, the objects you have to play with are
> stacks, cards, audioclips, videoclips, fields, buttons, scrollbars,
> players, images, buttons, groups, graphics and widgets. However,
> remember that 'widgets' are a completely extensible set of things, so
> this list is no longer fixed as it was before.
>
> To go back to the original point about controls vs objects then this
> is actually very well defined (indeed, it is embodied in the source of
> the engine - i.e. how LiveCode is actually implemented). A control is
> an object which sits on a card or in a group.
>
> Indeed, you have the following 'inheritance' hierarchy:
>
> Object
> Stack
> Card
> AudioClip
> VideoClip
> Control
> Group
> Field
> Button
> Scrollbar
> Player
> Image
> Button
> Graphic
> Widget
> <all widgets>
>
> This means that a stack is an object, but not a control. A player is a
> control, and therefore an object. AudioClips and VideoClips aren't
> really 'controls' in this sense because they sit on a stack , and not
> a card (although the Import Menu does call them so - which is perhaps
> the reason for the slight amount of confusion).
>
> At runtime, objects in LiveCode form themselves into a tree (note this
> tree is about *ownership* of instances of objects, not inheritance):
>
> Stack
> Substack
> <same as stack>
> AudioClips
> Videoclips
> Cards
> Controls
> Groups
> Controls
>
> You use LiveCode Script to attach 'adaptations' to your objects, and
> the message path allows a simple way for these adaptations to
> communicate.
>
> As LiveCode Script does not have 'strong references to objects' (and
> cannot have them unless we want to lose stringyness entirely - which
> is actually one of the main differences between Script and Builder)
> you create named objects in this hierarchy and then manipulate them
> using chunk expressions - i.e. references are strings describing a
> path in the object tree such as 'button "Foo" of card "Bar" of stack
> "Baz".
>
> Another way to think about this is that, in LiveCode Script, every
> object must have an explicit name. You use chunk expressions to select
> an object based on various criteria (type, owner). Once created,
> objects exist in the tree until they are explicitly deleted.
>
> Indeed, one of the reasons 'OOP as you see it in other languages' is
> very unlikely to appear in LiveCode Script is because there is no way
> to represent a reference to a temporary object which disappears when
> there are no references to it. As all references must be strings, and
> strings can sit in arbitrary other strings, there is no way for the
> engine to ever know when you don't need an object anymore - you have
> to tell it. I don't really see this as a limitation, however, because
> that is the object model of LiveCode Script - you adapt named
> instances of building blocks with your scripts!
>
> Of course, it would be nice if you could write widgets in 'LiveCode
> Script' - however, I'm not sure it is entirely appropriate. The
> stringy type system which Script has compared to Builder means that
> some things you really need to be able to do to write widgets in the
> way Builder does become quite tortuous. That being said, there is room
> for 'Builder' to come closer to 'Script' in terms of its strictness -
> at least as an option - i.e. Script without the 'everything is a
> string' concept.
>
> Perhaps the thing which is much more important at the Script level is
> the ability to take a collection of LiveCode objects and scripts etc.
> and wrap them up with an 'inner script' which presents them as a
> single black-box control - just like a widget. This is the idea of
> 'template objects', or custom controls 'done properly' (for some
> definition of properly, of course). This is a recursive application of
> the ideas which you are already familiar with when you build your apps
> and has a very nice 'self-similarity' and symmetry ("It's turtles all
> the way down").
>
> So, anyway, to sum up:
>
> 1) Objects and Controls are very well defined concepts in LiveCode
> and always have been. There might be some places in the docs and IDE,
> however, where it uses the wrong term and I that should be corrected
> (i.e. if you notice an instance of this file a report, and we'll look
> into correcting it).
>
> 2) LiveCode is definitely object-oriented:
>
> i) You build black-box objects in LiveCode Builder (which is,
> although not explicitly yet exposed, class-based).
>
> ii) You aggregate black-box objects together then adapt and glue
> them together using LiveCode Script.
>
> 3) LiveCode Script is designed to allow this rapid gluing and
> adaptation, and as such has a loose stringy type-system and dynamic
> message path to aid this rapidity.
>
> 4) LiveCode Builder could become less strict in the future as an
> option, to make it easier for people who are familiar with Script to
> write Builder to build widgets.
>
> 5) LiveCode Script is probably not the thing to use to write
> widgets, but the ability to be able to package up a group of controls
> as a black-box just like a widget would be entirely consistent and
> self-similar with the existing environment.
>
> The final thing which was touched on in this thread (and indeed was
> the point of it originally) was about how to teach LiveCode to kids -
> and I have to say that I'm not sure I'm qualified to actually help
> there! All I will say is that surely kids at the level you are talking
> about are able to reason about facts like:
>
> i) A Car is Vehicle; a Lorry is a Vehicle; a Car is not a Lorry so
> not all Vehicles are Cars
>
> ii) A Potato is a Vegetable; an Onion is a Vegetable; a Potato is
> not an Onion so not all Vegetables are Potatoes
>
> Which has the direct analog with (something similar to):
>
> A Control is an Object; a Card is an Object; a Card is not a
> Control so not all Objects are Controls
>
> Of course, having just written that, I do remember a number of
> computer science textbooks I have read (which are aimed at
> undergraduates) belabouring such points as these (almost in this
> direct fashion) - which suggests that it isn't a very easy concept to
> get across even to those who are 18+. i.e. I suspect it is more
> difficult to teach than I perhaps imagine!
>
> Warmest Regards,
>
> Mark.
>
More information about the use-livecode
mailing list