News for hackers. Stuff that matters.
Re:Functional calisthenics by munificent on Thursday October 19, 2017 @01:47PM (#15509957)
The article states:

    These rules are constraints on how to create your code
    and are only intended to be applied when doing katas or
    exercises.
These rules are an exercise to kick you out of an OOP mindset, not best practices for writing real code.

By that same token, I think it is a good rule when practicing OOP to not allow bare functions. It helps train yourself to think "Is there a logical class that this method belongs to?" In real code, of course, the answer is often "no". But when first learning OOP, it's good to teach yourself to ask that question in the first place.

Your code isn't a good example of "the OOP way", though. A fluent OOP solution would be:

    s = x.sin()
Another good rule when practicing OOP would be "No classes without state." That helps you avoid the habit of writing pointless "namespace" classes like the "Math" class you define here. Of course, again, sometimes it is useful to wrap a bunch of related behavior in a stateless class, but that should be the exception, not the default.
Re:Functional calisthenics by CuriouslyC on Friday October 20, 2017 @09:12AM (#15515461)
I don't think that no classes without state is a good hard and fast rule. In some languages classes are the easiest way to get a new namespace, and thus in combination with static methods they are useful in producing fluent APIs (which I believe are a good design choice). You could of course achieve the same result with modules but I'd argue it's cleaner to have an inline class than a separate file when you're only adding a couple of functions.
Re:Functional calisthenics by derefr on Thursday October 19, 2017 @04:41PM (#15511370)
You know, you're talking about a very specific kind of OOP here. Elixir, for example, is a language I'd call OOP—but it doesn't have classes. It just has "bare functions" in modules, where a module's functions will usually expect values of the type the module is named after.

Also, to reverse that perspective, a "type" in Erlang/Elixir-lang is just any data formatted in a way that a given set of functions will work with it, rather than requiring an explicit tag. {1, 2} can be an instance of a type†, if you have a module Foo that spits that shape of data in response to Foo.new/0 and takes it for Foo.change/1.

† An example of such a type is Erlang's http://erlang.org/doc/man/queue.html . queue:new/0 just returns {[], []}.

Re:Functional calisthenics by Veen on Thursday October 19, 2017 @05:16PM (#15511618)
The actor model that Elixir/Erlang is OOP in its "purest" form, but that's not what most people mean when they discuss OOP languages.
Re:Functional calisthenics by michaelg7x on Thursday October 19, 2017 @03:48PM (#15511006)
In Java static methods are a particularly simple way making clear to the compiler and runtime that a given functions does not have side effects (to instances of the owning class). I can imagine that, as a pattern, they would assist escape analysis.
Re:Functional calisthenics by lederhosen on Thursday October 19, 2017 @05:17PM (#15511626)
A static method can of course mutate an object of the same class (give the object as an argument (direct or indirect) or use a static variable of the class)

I can not see how they could be used to help escape analysis more than that you have one less reference (this).

Re:Functional calisthenics by michaelg7x on Friday October 20, 2017 @02:52AM (#15513958)
Yes, of course that's possible. I was trying to point out their usefulness to the programmer as well as potentially to the runtime/JIT. Next time I'll list the obvious exceptions!
Re:Functional calisthenics by maxxxxx on Thursday October 19, 2017 @04:38PM (#15511357)
In C# you can have static classes. I often use these to group simple functions together.