I started learning Objective-C when Apple released the iPhone SDK over a year ago, and started programming in it seriously at the beginning of this year. While there are many things I like about Objective-C as a OO language, there is one thing that continuously bother me.
One of the four main tenant of object-oriented design is Encapsulation. Meaning, the inner working of an object is hidden from public view.
In Objective-C, an instance method can be declared in the implementation file (.m file) in the following ways:
- Implement the method without declaring it in the header file. This is (almost) equivalent to private method in C#/Java.
- Declare the method signature in the header file, and implement the method in the .m file. This is like declaring a method public in C#/Java.
So how does this discourages me from writing good OO code with respect to encapsulation?
If I choose the first option, I have two choices. Either I implement the method before its first usage which does no good with readability re Uncle Bob’s Clean Code‘s newspaper metaphor, OR implement it after and put up with the compiler warning about the method call may not exist.
To get the freedom of placing the method anywhere in the .m file, I have to choose the second option and declare the method signature in the header file. The downside of this is that now the method is exposed as part of the class public interface and break encapsulation. (Yes, I know that the method can still be called without the header file declaration. Again, a compiler warning greets you.)
All three options are undesirable to me. It is really a case of pick my poison! Right now, I choose option one and put the method before first usage. Readability suffers because I like reading methods after the usage but at least the header file is clean and represents the intended public interface.
Update: Martin Pilkington makes a suggestion to me via Twitter. I’ll have to try it out and see.
Update #2: Someone else on Twitter also suggests using Extension to solve this issue. The Apple’s documentation here (at the end of the page) shows how an extension of a class can be used to define private method, separated from the main class interface definition.
My initial feel? Pretty inelegant workaround to an inherited problem of Objective-C legacy linkage to C. No thanks, I’ll stick with declaring private methods before usage.