What I don't like about inferring methods to an object is that you can override previously held methods, override other role's methods, etc.
Also, reverting an applied role can be dangerous.
I know it's a paradigm of DCI to not change the identity of the objects but isn't it equivalent if you run the role's methods in the context of the object itself?
On 24 Feb 2015, at 16:42, Egon Elbre <egon...@gmail.com> wrote:You can override methods only locally inside the context; it's invisible to everything that is outside the context.
On 24 Feb 2015, at 16:42, Egon Elbre <egon...@gmail.com> wrote:You can override methods only locally inside the context; it's invisible to everything that is outside the context.Exactly what does "override" mean here?
On 24 Feb 2015, at 21:26, Egon Elbre <egon...@gmail.com> wrote:There are two methods that have the same name and one has precedence in a specific Context.
For a given object, method names — including role names — are unique. An instance method name should never collide with a role method name. That destroys comprehensibility of the Context.
Applying is not the only way to implement roles. (injectionless implementation for learning http://egonelbre.com/code/javascript-dci/)
Now if we want to check whether or not this Role Object is in the List of the Composite we may have issue since the Role is a wrapper and the List contains the Raw Component. We need to override the Equals function of Object and all kind of problems will come :)
On 24 Feb 2015, at 21:26, Egon Elbre <egon...@gmail.com> wrote:There are two methods that have the same name and one has precedence in a specific Context.In a given Context, role names are unique.For a given object, method names — including role names — are unique. An instance method name should never collide with a role method name. That destroys comprehensibility of the Context.
Two given roles may each have a method of the same name, though that's a bit gauche and limits comprehensibility, particularly in the case where one object plays two roles.I do not understand what you mean by two methods having the same name in a Context situation where there is an issue of precedence between them.
"Although, personally, I don't think it's vital."
Let's say we have a function in Data Object (Composite) that will add a Component into the List in the Composite.Let's say in a Context we have a Role that is played by the Component.Now if we want to check whether or not this Role Object is in the List of the Composite we may have issue since the Role is a wrapper and the List contains the Raw Component. We need to override the Equals function of Object and all kind of problems will come :)I have this problem while trying to use wrapper.
On 25 Feb 2015, at 05:02, Matthew Browne <mbro...@gmail.com> wrote:I'm not sure that should be a hard and fast rule in a dynamic language like Javascript, where there is no need for a context stack.
On 25 Feb 2015, at 08:55, Egon Elbre <egon...@gmail.com> wrote:For example every object in JavaScript has a method "toString", this would mean that you never can have a role method named "toString".
On Wednesday, 25 February 2015 10:59:05 UTC+2, Cope wrote:On 25 Feb 2015, at 05:02, Matthew Browne <mbro...@gmail.com> wrote:I'm not sure that should be a hard and fast rule in a dynamic language like Javascript, where there is no need for a context stack.This is not a matter of a technical issue. It is a matter of comprehensibility.I am sure that, with suitable technology, you could have five roles in the context, each one of which had methods named M1, M2, M3, M4, and M5. Of course the technology can qualify them with the role names so that, within the Context, their bindings are unique. The problem is that this uniqueness does not extend to the end-user mental model, as their is no bridge from the source code to the programmer mental model of the object and its methods at run time.Forcing qualified method invocation names increases cognitive load, increases code mass, and adds unnecessary redundancy — all of which are known to detract from comprehensibility.But before we overly clarify this issue, I want to understand what Egon meant. I still don't.Simplest example I can give is this:var items = {list: [],add: function(item){this.list.push(item);}};var context = Context(function(items, log){Items = items;Log = log;Items.add({name: "Hello"});Items.add({name: "World"});log.info(items);
On 25 Feb 2015, at 15:05, Davide Callegari <birraf...@gmail.com> wrote:I wonder if it's ok, though, in JS, to have a role with a toString method, since all objects have a toString method in their prototype chain.
On 25 Feb 2015, at 08:55, Egon Elbre <egon...@gmail.com> wrote:
For example every object in JavaScript has a method "toString", this would mean that you never can have a role method named "toString".
That's right. The object would have two methods, both called toString. If you believe in overriding then the instance method of the object wins and the Context no longer describes what really goes on in the code. If you don't believe in overriding you end violating the encapsulation of the class — its methods that invoke its own toString method can't count on it receiving the message.
Also this constraint assumes that you know all the information about the Contexts at instantiation time. For example if the object adds/removes methods - of course that code wouldn't be that easy to understand.
Also given that mostly any object can play any role this severely would restrict the method names - of course in pratice it wouldn't be that restrictive.
The latter is still a bit more in the same vein as old OOP and if one were to allow such overriding, then the latter approach should prevail. To my mind it's much better to flag this as an error. One can do that methodologically or with technology, and this is one place where the technology can help.
Name methods with the same care as for a first-born child. I don't see why anyone would consciously name entities in a way that could lead to this confusion, and I fear that this is a discussion about how to do the least damage for sloppy designs. Sloppy designs deserve a slap on the wrist above accommodation. Unless you're George Forman, you don't name all of your sons George.
a new member want to try DCI, 1st thing need to do is to make a custom compiler for DCI.to me, that was scary :)
/quang
On Thursday, February 26, 2015 at 11:17:54 AM UTC+8, Hai Quang Kim wrote:how about context stack for single thread and multi thread.do we still need to do it for javascript?
/quang
On Thursday, February 26, 2015 at 10:58:15 AM UTC+8, Matthew Browne wrote:On 2/25/15 12:24 AM, Hai Quang Kim wrote:
> Yes, it is a fake version of DCI but with this I don't have to build a
> framework or maintain a Context Stack....
> and I can focus on using DCI to implement the real problem :)
I see no reason to go this route with Javascript. Method overriding
(which is easy to do in JS) would be far preferable to the code you
posted (I understand why you did it in C# but that was a special
circumstance). Of course an injectionless implementation would be best
of all.
--
You received this message because you are subscribed to a topic in the Google Groups "object-composition" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/object-composition/1okz656kbY8/unsubscribe.
To unsubscribe from this group and all its topics, send an email to object-composit...@googlegroups.com.
To post to this group, send email to object-co...@googlegroups.com.
Visit this group at http://groups.google.com/group/object-composition.
For more options, visit https://groups.google.com/d/optout.
--
--
On 2/25/15 4:06 AM, James O Coplien wrote:
I don't see how that's the case with injectionless DCI, since the method isn't actually being replaced. If an instance method calls toString(), the instance method toString() would be called. If a role method calls toString(), then the role method toString() would be called. I don't see how that sort of overriding would cause a problem.On 25 Feb 2015, at 08:55, Egon Elbre <egon...@gmail.com> wrote:
For example every object in JavaScript has a method "toString", this would mean that you never can have a role method named "toString".
That's right. The object would have two methods, both called toString. If you believe in overriding then the instance method of the object wins and the Context no longer describes what really goes on in the code. If you don't believe in overriding you end violating the encapsulation of the class — its methods that invoke its own toString method can't count on it receiving the message.
Perhaps the best argument for allowing overriding is what Egon said here:
Also this constraint assumes that you know all the information about the Contexts at instantiation time. For example if the object adds/removes methods - of course that code wouldn't be that easy to understand.I think it's worth adding a bit of clarification to Egon's point about the object adding/removing methods...this is particularly relevant in Javascript where it's a common practice to add additional methods to an object or prototype at runtime - might not matter so much in other languages.
Also given that mostly any object can play any role this severely would restrict the method names - of course in pratice it wouldn't be that restrictive.
--
You received this message because you are subscribed to the Google Groups "object-composition" group.
To unsubscribe from this group and stop receiving emails from it, send an email to object-composit...@googlegroups.com.
On 26 Feb 2015, at 08:40, Egon Elbre <egon...@gmail.com> wrote:Actually I was thinking about it a bit more and found that there might be a more serious problem.Let's say I have an external dependency X. I have a role method M. Now in their next version of X, they introduce method M to object X. The naming constraint would mean that now my code is broken.
You have an operation on a car to "fill the tank with gas." That can be an operation on the car. But it's the driver who does it, right (or, in civlised countries, the station attendant)? No: that method is "operate the pump." This re-naming adds information to the design. Giving multiple entities the same name actually removes information from the design. DCI, in spirit, is about readable code and about adding information to the design
On 26 Feb 2015, at 08:40, Egon Elbre <egon...@gmail.com> wrote:Actually I was thinking about it a bit more and found that there might be a more serious problem.Let's say I have an external dependency X. I have a role method M. Now in their next version of X, they introduce method M to object X. The naming constraint would mean that now my code is broken.Yup. Trygve and I shuddered, from the very beginning, at the notion of overridable Role methods.
On Thursday, 26 February 2015 10:39:59 UTC+2, Cope wrote:On 26 Feb 2015, at 08:40, Egon Elbre <egon...@gmail.com> wrote:Actually I was thinking about it a bit more and found that there might be a more serious problem.Let's say I have an external dependency X. I have a role method M. Now in their next version of X, they introduce method M to object X. The naming constraint would mean that now my code is broken.Yup. Trygve and I shuddered, from the very beginning, at the notion of overridable Role methods.I'm not quite sure whether we are talking about the same thing when me say "overriding". I'm not suggesting that Role methods themselves should be overridable.It might be clearer to call it henceforth "method shadowing", or alternatively if there is a more accurate description for:Object X with methods M, K. Where K internally calls X.M.Context Z with role R and method M.Inside the Context R.M() will execute the role method.Inside the Context R.K() will execute the object method K which internally calls the object method M.Essentially the role method R.M is shadowing method O.M... because the object method is not directly accessible via the Role itself (unless some other way is provided).Why I think method shadowing is a better name because it is very similar to variable shadowing (http://en.wikipedia.org/wiki/Variable_shadowing).
On 26 Feb 2015, at 11:01, Egon Elbre <egon...@gmail.com> wrote:I'm not quite sure whether we are talking about the same thing when me say "overriding".
On 26 Feb 2015, at 11:01, Egon Elbre <egon...@gmail.com> wrote:
On Thursday, 26 February 2015 10:39:59 UTC+2, Cope wrote:On 26 Feb 2015, at 08:40, Egon Elbre <egon...@gmail.com> wrote:Actually I was thinking about it a bit more and found that there might be a more serious problem.Let's say I have an external dependency X. I have a role method M. Now in their next version of X, they introduce method M to object X. The naming constraint would mean that now my code is broken.Yup. Trygve and I shuddered, from the very beginning, at the notion of overridable Role methods.I'm not quite sure whether we are talking about the same thing when me say "overriding". I'm not suggesting that Role methods themselves should be overridable.It might be clearer to call it henceforth "method shadowing", or alternatively if there is a more accurate description for:Object X with methods M, K. Where K internally calls X.M.Context Z with role R and method M.Inside the Context R.M() will execute the role method.Inside the Context R.K() will execute the object method K which internally calls the object method M.
Essentially the role method R.M is shadowing method O.M... because the object method is not directly accessible via the Role itself (unless some other way is provided).Why I think method shadowing is a better name because it is very similar to variable shadowing (http://en.wikipedia.org/wiki/Variable_shadowing).It destroys readability. I stick to my word: destroys. It's the fly in the ointment; or, better, the piss in the vinegar. It is a small thing, but it has disastrous consequences — consequences that are very difficult to track down.
On 26 Feb 2015, at 11:21, Egon Elbre <egon...@gmail.com> wrote:Although what is your opinion on method shadowing?
I fear that this is a caricature. What is Object X is of class Q which has ø as a base class, and both Q and ø have method m. Now apply your scenario. Who shadows whom, overriding what, shadowing what?
I think the former is what Egon, Rune and I have been talking about the whole time
--
You received this message because you are subscribed to a topic in the Google Groups "object-composition" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/object-composition/1okz656kbY8/unsubscribe.
To unsubscribe from this group and all its topics, send an email to object-composit...@googlegroups.com.
To unsubscribe from this group and all its topics, send an email to object-composition+unsub...@googlegroups.com.
You received this message because you are subscribed to the Google Groups "object-composition" group.
To unsubscribe from this group and stop receiving emails from it, send an email to object-composit...@googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to object-composition+unsub...@googlegroups.com.
On 26 Feb 2015, at 13:50, Matthew Browne <mbro...@gmail.com> wrote:Yes. Let's limit the discussion to a role method overriding (or shadowing) an instance method - not the other way around. I think the former is what Egon, Rune and I have been talking about the whole time; Cope, you seem to be talking about the latter. I think we all agree that allowing an instance method to override a role method is a bad idea.
On 26 Feb 2015, at 13:50, Matthew Browne <mbro...@gmail.com> wrote:Yes. Let's limit the discussion to a role method overriding (or shadowing) an instance method - not the other way around. I think the former is what Egon, Rune and I have been talking about the whole time; Cope, you seem to be talking about the latter. I think we all agree that allowing an instance method to override a role method is a bad idea.I think it's easy to argue that the latter is a problem. In fact the former is its dual and the same arguments apply. People have a bit more trouble seeing that argument because of the way they think about inheritance.Consider a class C, two class methods called Cmethod and Cmethod2, and an instance of C that we'll address through a role name R. R has a Role method called Rmethod and it also has a Role method called Cmethod.With your proposed shadowing: if an outsider invokes CMethod on R, it gets R's C method.If Cmethod2 invokes Cmethod on self, what is invoked?Can R express Cmethod both in its public interface and in its role / object contract interface? If so, then can R's Cmethod2 invoke C's Cmethod through that interface?How would R's Cmethod differentiate between calling C's Cmethod and R's Cmethod?
How would any code within the context gain access to C's Cmethod of the object playing the role R, were it necessary to do so?
These are not idle questions. A good part of the design of C++ dealt with sorting out analogous complexities along the axis of the inheritance hierarchy, which roughly corresponds to the subtyping hierarchy. Therein lies a good bit of the complexity of the language. In C++ it's worse because of overloading, and indeed, the question becomes more interesting here if you allow compile-time polymorphism and its cousins.C is a Context class and Cmethod is its only trigger method. Is it totally inaccessible as a role-player of R? (I have a lot of other interesting cases in my pocket, at least one of which involves a Context object, multiple of whose roles are played by itself. (Already in DCI each Context object plays one of its own roles — the role called self.) To that, add recursive methods, and you get lost really quickly.)
This is a position statement, taking the position that "shadowing" violates object identity.We need a good definition of object identity. We start with a vocabulary of the things in our universe: names, objects, method selectors, arguments, and methods.
On 26 Feb 2015, at 13:50, Matthew Browne <mbro...@gmail.com> wrote:Yes. Let's limit the discussion to a role method overriding (or shadowing) an instance method - not the other way around. I think the former is what Egon, Rune and I have been talking about the whole time; Cope, you seem to be talking about the latter. I think we all agree that allowing an instance method to override a role method is a bad idea.I think it's easy to argue that the latter is a problem. In fact the former is its dual and the same arguments apply. People have a bit more trouble seeing that argument because of the way they think about inheritance.Consider a class C, two class methods called Cmethod and Cmethod2, and an instance of C that we'll address through a role name R. R has a Role method called Rmethod and it also has a Role method called Cmethod.With your proposed shadowing: if an outsider invokes CMethod on R, it gets R's C method.If Cmethod2 invokes Cmethod on self, what is invoked?
Can R express Cmethod both in its public interface and in its role / object contract interface? If so, then can R's Cmethod2 invoke C's Cmethod through that interface?
How would R's Cmethod differentiate between calling C's Cmethod and R's Cmethod?
How would any code within the context gain access to C's Cmethod of the object playing the role R, were it necessary to do so?
These are not idle questions. A good part of the design of C++ dealt with sorting out analogous complexities along the axis of the inheritance hierarchy, which roughly corresponds to the subtyping hierarchy. Therein lies a good bit of the complexity of the language. In C++ it's worse because of overloading, and indeed, the question becomes more interesting here if you allow compile-time polymorphism and its cousins.C is a Context class and Cmethod is its only trigger method. Is it totally inaccessible as a role-player of R? (I have a lot of other interesting cases in my pocket, at least one of which involves a Context object, multiple of whose roles are played by itself. (Already in DCI each Context object plays one of its own roles — the role called self.) To that, add recursive methods, and you get lost really quickly.)I can see some latent programming rules in my head that are "getting in the way." One of them is that an object should behave the same (in response to a request to perform a method) no matter the identifier through which we invoke the methods of that same instance. That is, if I associate the identifier S with an instance of C, and invoke one of its instance methods through S, I should instead be able to bind that same object to the identifier R, invoke an operation using the same method selector and arguments, and get the same result. Shadowing violates that: it means that the name through which I access an object changes the behaviour of a given method selector on that same object!This radically violates the Rule of Least Surprise.
--
You received this message because you are subscribed to the Google Groups "object-composition" group.
To unsubscribe from this group and stop receiving emails from it, send an email to object-composit...@googlegroups.com.
On 27 Feb 2015, at 10:30, Egon Elbre <egon...@gmail.com> wrote:By the same argument wouldn't roles violate object identity in the same way.
On 26 Feb 2015, at 13:50, Matthew Browne <mbro...@gmail.com> wrote:
Yes. Let's limit the discussion to a role method overriding (or shadowing) an instance method - not the other way around. I think the former is what Egon, Rune and I have been talking about the whole time; Cope, you seem to be talking about the latter. I think we all agree that allowing an instance method to override a role method is a bad idea.
I think it's easy to argue that the latter is a problem. In fact the former is its dual and the same arguments apply. People have a bit more trouble seeing that argument because of the way they think about inheritance.
Consider a class C, two class methods called Cmethod and Cmethod2, and an instance of C that we'll address through a role name R. R has a Role method called Rmethod and it also has a Role method called Cmethod.
With your proposed shadowing: if an outsider invokes CMethod on R, it gets R's C method.
If Cmethod2 invokes Cmethod on self, what is invoked?
Can R express Cmethod both in its public interface and in its role / object contract interface? If so, then can R's Cmethod2 invoke C's Cmethod through that interface?
How would R's Cmethod differentiate between calling C's Cmethod and R's Cmethod?
How would any code within the context gain access to C's Cmethod of the object playing the role R, were it necessary to do so?
These are not idle questions. A good part of the design of C++ dealt with sorting out analogous complexities along the axis of the inheritance hierarchy, which roughly corresponds to the subtyping hierarchy. Therein lies a good bit of the complexity of the language. In C++ it's worse because of overloading, and indeed, the question becomes more interesting here if you allow compile-time polymorphism and its cousins.
C is a Context class and Cmethod is its only trigger method. Is it totally inaccessible as a role-player of R? (I have a lot of other interesting cases in my pocket, at least one of which involves a Context object, multiple of whose roles are played by itself. (Already in DCI each Context object plays one of its own roles — the role called self.) To that, add recursive methods, and you get lost really quickly.)
I can see some latent programming rules in my head that are "getting in the way." One of them is that an object should behave the same (in response to a request to perform a method) no matter the identifier through which we invoke the methods of that same instance. That is, if I associate the identifier S with an instance of C, and invoke one of its instance methods through S, I should instead be able to bind that same object to the identifier R, invoke an operation using the same method selector and arguments, and get the same result. Shadowing violates that: it means that the name through which I access an object changes the behaviour of a given method selector on that same object!
This radically violates the Rule of Least Surprise.
--
You received this message because you are subscribed to a topic in the Google Groups "object-composition" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/object-composition/1okz656kbY8/unsubscribe.
To unsubscribe from this group and all its topics, send an email to object-composit...@googlegroups.com.
C.Cmethod()At first glance it might look like C.Cmethod and R.Cmethod are referring to the same operation, but that's only if you don't consider the context. The context is essential to understanding what we're referring to, just as how in English, the meaning of a verb depends on context. * It's up to the programmer to do the mental combining here - but to make it explicit, what we're really dealing with is this:
R.Cmethod()
C.instance_Cmethod()So I don't see how this violates the Rule of Least Surprise - why should the programmer be surprised that calling a different operation causes a different result? The error is thinking that they're the same operation just because they have the same method name. i.e. should we be surprised if this leads to a different result:
R.role_Cmethod()
R.role_Cmethod()
C.instance_Cmethod()
On 27 Feb 2015, at 14:02, Matthew Browne <mbro...@gmail.com> wrote:At first glance it might look like C.Cmethod and R.Cmethod are referring to the same operation, but that's only if you don't consider the context. The context is essential to understanding what we're referring to, just as how in English, the meaning of a verb depends on context.
On 27 Feb 2015, at 14:02, Matthew Browne <mbro...@gmail.com> wrote:
This argument doesn't hold up if you consider the context in which the methods are called.
Object
, the root class
. (638
is a ridiculous number, but even Java and C# define operations
that the average programmer doesn't care to know). That's
why I thought it essential to realize injectionless DCI. Contexts
are now isolated from their Data objects so that role methods cannot
inadvertently override anything. withoutListWrapper
',
for example, even if a method with that name happens to be
implemented in class Object. It is outside my mental model, its
original meaning is of no interest to me, and there will be no
confusion if I make it mean something different in my context. I
think the programmer's or the project's vocabulary should be the
guide. If a word will be unambiguously be understood by all, fine.
If not, change it. All OO is 'call by intent', a method name says
what shall be achieved, not how. So it is perfectly OK to use a
common name for a role method even if its implementation in the
roleplayer is different. This would be the DCI equivalent of
polymorphism. As one guru put it: "Words are important". isService
. If
false, an incoming message will be passed directly to the attached
object. If true, the message is intercepted and behavior local to
the port is executed. In my SqueakContext, an object has 2 input ports.
One is named after the receiving role. its isService is conceptually
true, and any role methods have precedence. The other is called by
the reserved identifier self
, and incoming messages
are passed directly to the roleplayer object. Anybody remember
methodless and methodful objects? Today, role methods have been
moved from the object to an input port. Here's my demo override of
printString in a role FOO:printString
^ 'FOO is played by: ' , self printString.
Transcript show: FOO printString.
FOO is played by a TextMorph
where 'a TextMorph
' is the default result of 'printString
'.
If you truly have overriding of Role methods by instance methods, then even an undocumented instance method (or, especially, an undocumented instance method) will destroy your code if its name collides with the Role for which it is a Role-player.
This is the strongest argument I know to disallow overriding of role methods.
An even stronger rule is to disallow the name collisions. I think there are places where that rule works in DCI, and, in particular, disallowing name collisions between Role methods. The reason is organisational: the enterprise delivering value delivers it as use cases and, as such, needs to have oversight of the direct value-generating code. That's embodied in the use cases and, as such, in the Role methods.
In the case of third-party software there is no single entity of detailed architectural oversight, so administrative techniques (or even techniques that can be enforced by the programming language) don't work.
So, to me, to disallow overriding of Role methods is mandatory and solves this latter problem. It is admittedly a weak solution since it doesn't solve the comprehensibility problem, particularly if the instance methods are visible. But the stronger solution, which *can* be applied from Role to Role, is to ensure that Role method names are unique. That is likely to fall under a single administrative body and correspondingly can be automatically administered under the rules of the programming language or of architectural enforcement.
--
On 26 Feb 2015, at 10:57, Rune Funch Søltoft <funchs...@gmail.com> wrote:
You have an operation on a car to "fill the tank with gas." That can be an operation on the car. But it's the driver who does it, right (or, in civlised countries, the station attendant)? No: that method is "operate the pump." This re-naming adds information to the design. Giving multiple entities the same name actually removes information from the design. DCI, in spirit, is about readable code and about adding information to the designIn most of the projects I work in we rely on quite a long list of libraries we do not control in the current project more than 100. We will have to assume that since they are all actively maintained that new methods will be added. I don't think it changes our ability to understand our code if a method is added to a third party library and I think a compiler error either on the binding of a role or the name of a role method wouldn't help in contrast I think it would confuse
You received this message because you are subscribed to the Google Groups "object-composition" group.
To unsubscribe from this group and stop receiving emails from it, send an email to object-composit...@googlegroups.com.
To post to this group, send email to object-co...@googlegroups.com.
Visit this group at http://groups.google.com/group/object-composition.
For more options, visit https://groups.google.com/d/optout.
The essence of object orientation is
that objects collaborate to achieve a
goal.
Trygve Reenskaug mailto: try...@ifi.uio.no
Morgedalsvn.
5A http://folk.uio.no/trygver/
N-0378
Oslo http://fullOO.info
Norway Tel:
(+47) 22 49 57 27
btw, fun fact: quick skim shows that you have a lot of role(s) with -er :)
there are a lot of old posts about wrapper, you can try to search for those posts./quang
On Tuesday, February 24, 2015 at 9:37:01 PM UTC+8, Davide Callegari wrote:Hi guys,I found myself intrigued by DCI lately and I wanted to try and see if I could write a proper library for Javascript, written in Coffeescript.I would like to know if it could be interesting for anyone out there and I'm more than happy to welcome any feedback.Let me know what you think!Cheers,Davide
I think of the difference between procedure oriented and object oriented programming as being that procedure oriented answers the question: "What happens?". Object oriented answers an additional question: "Who does it?"
--
You received this message because you are subscribed to a topic in the Google Groups "object-composition" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/object-composition/1okz656kbY8/unsubscribe.
To unsubscribe from this group and all its topics, send an email to object-composit...@googlegroups.com.