Mat Brown - JavaScript's Purer Object-Orientation - Tekst piosenki, lyrics - teksciki.pl

JavaScript's Purer Object-Orientation

Mat Brown

7

Tech

Tekst piosenki
I'm finishing up the excellent Programming Languages course on Coursera, and just watched a couple of lectures comparing the decomposition styles of functional and object-oriented programming. Without getting into too much depth, the basic (and intuitive) idea is that functional languages group operations tightly together, whereas object-oriented languages group data types tightly. I'll illustrate with a simple example. Say we have two data types, Dog and Bird. And let's say we have two operations, "talk" and "can_fly". In a functional language like ML, the operations are bound tightly: fun talk (animal) = Case animal of Dog _ => "Woof" | Bird _ => "Cheep" Fun can_fly (animal) = Case animal of Dog _ => false | Bird _ => trueOr in Erlang: fun talk({dog, _}) -> "Woof"; Fun talk({bird, _}) -> "Cheep". Fun can_fly({dog, _}) -> false; Fun can_fly({bird, _}) -> true.In Ruby, on the other hand, the types themselves are bound tightly, with each type carrying its variant of the operation: class Dog Def talk "Woof" End Def can_fly? False End End Class Bird Def talk "Cheep" End Def can_fly? True End EndHowever, Ruby isn't limited to this way of organizing your code. We could achieve the same effect using functional decomposition: def talk(animal) Case animal When Dog then "Woof" When Bird then "Cheep" End End Def can_fly?(animal) Case animal When Dog then false When Bird then true End EndMethod overloading in statically-typed Java lets us do something similar to Erlang's function header pattern matching: public String talk(Dog dog) { Return "Woof"; } Public String talk(Bird bird) { Return "Cheep"; } Public boolean canFly(Dog dog) { Return false; } Public boolean canFly(Bird bird) { Return true; }So while in most situations the first Ruby example would be considered the best way to organize the code in question, neither Ruby nor Java forecloses on the option of organizing your code the way you would in a functional language. JavaScript, however, is another story. JavaScript is an object-oriented but not class-based language. That is to say, with the exception of some built-in types (numbers, arrays, functions), all objects in JavaScript have the same type, which is simply the type Object. So, in JavaScript, we could certainly do this: var Dog = function () {}; Dog.prototype = { Talk: function () { Return "Woof"; }, CanFly: function () { Return false; } }; Var Bird = function () {}; Bird.prototype = { Talk: function () { Return "Cheep"; }, CanFly: function () { Return true; } };In order to do functional decomposition in JavaScript, we'd like to do something like this: function talk(animal) { If (isDog(animal)) { Return "Woof"; } else if (isBird(animal)) { Return "Cheep"; } } Function canFly(animal) { If (isDog(animal)) { Return false; } else if (isBird(animal)) { Return true; } }But, as far as I know, there is simply no way to implement the isDog and isBird functions in a reliable way. One might look at the "constructor" property of objects, or perhaps define a typeOf() method on each prototype, but both of these approaches are easily fooled at runtime. From this perspective, then, perhaps JavaScript is more "purely" object-oriented, in the narrow sense that object decomposition really is your only option for code organization.
Tłumaczenie
Brak

Najnowsze teksty piosenek

Sprawdź teksty piosenek i albumy dodane w ciągu ostatnich 7 dni