in computer languages, often a function definition looks like this: subroutine f (x1, x2, ...) { variables ... do this or that }
in advanced languages such as LISP family, it is not uncommon to define functions inside a function. For example: subroutine f (x1, x2, ...) { variables... subroutine f1 (x1...) {...} subroutine f2 (x1...) {...} } often these f1 f2 inner functions are used inside f, and are not relevant outside of f. Such power of the language gradually developed into a style of programing. For example: subroutine a_surface () { coordinatesList = ...; subroutine translate (distance) {...} subroutine rotate (angle) {..} } such a style is that the a_surface is no longer viewed as a function. But instead, a boxed set of functions, centered around a piece of data. And, all functions for manipulating this piece of data are all embodied in this function. For example: subroutine a_surface (arg) { coordinatesList = ... subroutine translate (distance) {set coordinatesList to translated version} subroutine rotate (angle) {set coordinatesList to rotated version} subroutine return () {return coordinatesList} if (no arg) {return coordinatesList} else { apply arg to coordinatesList } } In this way, one uses a_surface as a data, which comes with its owe set of functions: mySurface = a_surface(); a_surface(rotate(angle)); # now the surface data has been rotated a_surface(translate(distance)); # now its translated myNewSurface = a_surface(return()) So now, a_surface is no longer viewed as a subroutine, but a boxed set of things centered around a piece of data. All functions that work on the data are included in the boxed set. This paradigm available in functional languages has refined so much so that it spread to other groups that it became knows as Object Oriented Programing, and complete languages with new syntax catered to such scheme emerged. In such languages, instead of writing them like this: mySurface = a_surface(); a_surface(rotate(angle)); the syntax is changed to like this, for example: mySurface = new a_surface(); mySurfaceRotated = mySurface.rotate(angle); In such languages, the super subroutine a_surface is no longer called a function or subroutine. They are now called a "Class". And now the variable "mySurface = a_surface()" is now called a "Object". The subroutines inside the function a_surface() is no longer called inner-subroutines. They are called "Methods". This style of programing and language have become so fanatical that in such dedicated languages like Java, everything in the language are "Classes". One can no longer just define a variable or subroutine. Instead, one creates these meta-subroutine "Classes". Everything one do are inside Classes. And one assign variables inside these Classes to create "Objects". And one uses "Methods" to manipulate Objects. In this fashion, even data types like numbers, strings, and lists are no longer atomic data types. They are now Classes. For example, in Java, a string is a class String. And inside the class String, there are Methods to manipulate strings, such as finding the number of chars, or extracting parts of the string. This can get very complicated. For example, in Java, there are actually two Classes of strings: One is String, and the other is StringBuffer. Which one to use depends on whether you intend to change the data. So, a simple code like this in normal languages: a = "a string"; b = "another one"; c = join(a,b); print c; or in lisp style (set a "a string") (set b "another one") (set c (join a b)) (print c) becomes in pure OOP languages: public class test { public static void main(String[] args) { String a = new String("a string"); String b = new String("another one"); StringBuffer c = new StringBuffer(40); c.append(a); c.append(b); System.out.println(c.toString()); } } here, the "new String" creates a String object. The "new StringBuffer(40)" creates the changeable string object StringBuffer, with room for 40 chars. "append" is a method of StringBuffer. It is used to join two Strings. Notice the syntax "c.append(a)", which we can view it as calling a inner subroutine "append", on a super subroutine that has been assigned to c, where, the inner subroutine modifies the inner data by appending a to it. And in the above Java example, StringBuffer class has another method "toString()" used to convert this into a String Class, necessary because System.out.println's parameter requires a String type, not StringBuffer. For a example of the complexity of classes and methods, see the Java documentation for the StringBuffer class at http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StringBuffer.html in the same way, numbers in Java have become a formalization of many classes: Double, Float, Integer, Long... and each has a bunch of "methods" to operate or convert from one to the other. Instead of aNumber = 3; print aNumber^3; in Java the programer needs to master the ins and outs of the several number classes, and decide which one to use. (and if a program later needs to change from one type of number to another, it is often cumbersome.) This Object Oriented Programing style and dedicated languages (such as C++, Java) have become a fad like wild fire among the programing ignoramus mass in the industry. Partly because of the data-centric new perspective, partly because the novelty and mysticism of new syntax and jargonization. It is especially hyped by the opportunist Sun Microsystems with the inception of Java, internet, and web applications booms around 1995. At those times, OOP (and Java) were thought to revolutionize the industry and solve all software engineering problems, in particular by certain "reuse of components" concept that was thought to come with OOP. As part of this new syntax and purity, where everything in a program is of Classes and Objects and Methods, many many complex issues and concept have arisen in OOP. we now know that the jargon Class is originally and effectively just a boxed set of data and subroutines, all defined inside a subroutine. And the jargon "Object" is just a variable that has been set to this super subroutine. And the inner subroutines are what's called Methods. ----------------- because of psychological push for purity, in Java there are no longer plain subroutines. Everything is a method of some class. Standard functions like opening a file, square root a number, for loop thru a list, if else branching statements, or simple arithmetic operations... must now some how become a method of some class. In this way, the OOP Hierarchy is born. Basic data types such as now the various classes of numbers, are now grouped into a Number class hierarchy, each class having their own set of methods. The characters, string or other data types, are lumped into one hierarchy class of data types. Many types of lists (variously known as arrays, vectors, lists, hashes...), are lumped into a one hierarchy, with each node Classe having their own set methods as appropriate. Math functions, are lumped into some math class hierarchy. Now suppose the plus operation +, where does it go? Should it become methods of the various classes under Number headings, or should it be methods of the Math class set? Each language deals with these issues differently. As a example, see this page for the hierarchy of Java's core language classes: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/package-tree.html The hierarchy concept is so entangled in pure OOP such that OOP is erroneously thought of as languages with a hierarchy. (there are now also so-called Object-Oriented databases that are centered on the concept of all data are trees ...) Normally in a program, when we want to do some operation we just call the subroutine on some data. Such as open(this_file) square(4) But now with the pure OOP style, there can no longer be just a number or this_file path, because everything now must be a Object. So, the "this_file", usually being just a string representing the path to a file on the disk, is now some "file object". Initiated by something like this_file = new File("path to file"); where this file class has a bunch of methods such as reading or writing to it. see this page for the complexity of the IO tree http://java.sun.com/j2se/1.4.2/docs/api/java/io/package-tree.html see this page for the documentation of the File class itself, along with its 40 or so methods and other things. http://java.sun.com/j2se/1.4.2/docs/api/java/io/File.html Tomorrow i shall cover more manmade jargons and complexities arising out of the OOP hype, in particular Java. instantiation initializer, constructor, assessor access level specifier abstract class and abstract methods instance methods and class methods interface, inheritance, polymorphism. Xah [EMAIL PROTECTED] http://xahlee.org/PageTwo_dir/more.html -- http://mail.python.org/mailman/listinfo/python-list